ปลดสตริง


29

รับอินพุตของรายการสตริของสตริงออกสตริงเดิม

แต่ละชิ้นจะได้รับเป็นรายการความยาว 2 โดยมีตำแหน่งเริ่มต้นของชิ้น (จำนวนเต็ม≥0) และชิ้นเอง หากภาษาของคุณไม่รองรับอาเรย์ประเภทใด ๆ คุณอาจจะใช้มันเป็น struct หรือคล้ายกันหรือเพียงแค่สตริงที่ประกอบด้วยตัวเลขช่องว่างและส่วนย่อย

คำสั่งขององค์ประกอบทั้งสองของแต่ละชิ้นขึ้นอยู่กับคุณ นอกจากนี้หากคุณเลือกที่จะใช้การแทนค่าของชิ้นเป็นอาร์เรย์ความยาว 2 คุณอาจใช้อินพุตเป็นอาร์เรย์สองมิติหรืออาร์เรย์แบบแบนเดียว ในที่สุดจำนวนเต็มแทนตำแหน่งอาจเป็นศูนย์ดัชนีหรือหนึ่งดัชนี (ตัวอย่างทั้งหมดที่นี่เป็นศูนย์ดัชนี)

อินพุตจะเพียงพอในการพิจารณาสตริงทั้งหมดจนถึงตำแหน่งสูงสุดที่กำหนด นั่นคือจะไม่มี "หลุม" หรือ "ช่องว่าง" ดังนั้นเอาต์พุตจะต้องไม่มีการต่อท้ายพิเศษหรืออักขระนำหน้า อินพุตจะสอดคล้องกันเสมอและไม่มีสไลซ์ใด ๆ ที่ขัดแย้งกัน

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ:

In                                                Out
-----------------------------------------------------------
[[2, "CG"], [0, "PP"], [1, "PC"]]               | PPCG
[[0, "foobarbaz"]]                              | foobarbaz
[[0, "foobar"], [6, "baz"]]                     | foobarbaz
[[2, "ob"], [5, "rba"], [0, "fooba"], [8, "z"]] | foobarbaz
[[0, "fo"], [0, "fooba"], [0, "foobarbaz"]]     | foobarbaz

มีข้อ จำกัด ใด ๆ เกี่ยวกับอักขระที่สตริงจะมีหรือไม่
GamrCorps

@GamrCorps Nope ไม่มีข้อ จำกัด พิเศษ
Doorknob

1
มีข้อ จำกัด ใด ๆ เกี่ยวกับความยาวของสตริงออกหรือไม่
Mego

@Mego ไม่มีนอกเหนือจากข้อ จำกัด ตามธรรมชาติที่กำหนดโดยหน่วยความจำ / การจัดเก็บ
Doorknob

1
ฮา! นี่เป็นกลไกการเลิกทำในเครื่องมือแก้ไขข้อความของฉัน: D
slebetman

คำตอบ:


5

เยลลี่, 10 9 ไบต์

Ḣ0ẋ;Fµ€o/

ลองออนไลน์!

มันทำงานอย่างไร

Ḣ0ẋ;Fµ€o/  Main link. Input: A (list of pairs)

     µ€    Convert the chain to the left into a link, and apply it to each pair.
Ḣ          Pop the first element.
 0ẋ        Yield a list of that many zeroes.
   ;F      Concatenate the list of zeroes with the popped, flattened pair.
       o/  Reduce the generated lists by logical OR.
           Since all characters are truthy, this overwrites zeroes with characters,
           but never characters with zeroes.

14

Python 2, 49 ไบต์

lambda l:`map(max,*[' '*n+s for n,s in l])`[2::5]

ขั้นแรกให้จัดเรียงสตริงด้วยการเติมอ็อฟเซ็ตด้วยช่องว่าง (แสดงเป็นขีดล่างเพื่อความชัดเจน)

[[2, "CG"], [0, "PP"], [1, "PC"]] 

__CG
PP
_PC

จากนั้นใช้mapไปzipและใช้เวลาสูงสุดของแต่ละคอลัมน์ซึ่งละเว้นค่าขนาดเล็กของช่องว่าง (ตัวอักษรตัวพิมพ์เล็กที่สุด) และNones ที่สตริงบางคนสั้นเกินไป

__CG
PP
_PC

PPCG

ในที่สุด''.joinสตริงที่ใช้[2::5]เคล็ดลับ


เคล็ดลับ 2 :: 5 คืออะไร? วิธีการที่เข้าร่วมสตริง? นั่นไม่ใช่ทุกดัชนีที่ 5 เริ่มต้นที่ 2 ใช่ไหม
Robert Fraser

@RobertFraser ดูที่นี่
xnor

8

Perl, 25

เพิ่ม +2 สำหรับ -lp

รับอินพุตจาก STDIN เช่น

perl -lp slices.pl
2 CG
0 PP
1 PC

(ปิดด้วย ^ D หรือ ^ Z หรืออะไรก็ตามที่ปิด STDIN ในระบบของคุณ)

slices.pl:

/ /;$r|=v0 x$`.$'}{*_=r

ไบต์ว่างจะไม่v0ช่วยให้คุณประหยัดสองไบต์ (เพราะคุณสามารถเว้นวรรคก่อนหน้าx) ได้หรือไม่ แก้ไข:หืมไม่เมื่อฉันลองฉันได้รับCan't locate object method "x" via package "2"(หรือจำนวนที่อยู่ในบรรทัดแรกของฉัน) ด้วยเหตุผลบางอย่าง
msh210

1
เฉพาะชื่อเช่นตัวแปร C เท่านั้นที่สามารถเป็นตัวอักษรที่ไม่ได้อ้างอิง ดังนั้น v0 จึงเป็นวิธีที่สั้นที่สุดในการรับ \ 0 (หรือ a \ 0 ระหว่างเครื่องหมายคำพูดสำหรับเนคไทในกรณีนี้เนื่องจากพื้นที่พิเศษ)
Ton Hospel

8

JavaScript (ES6), 61 ไบต์

a=>a.map(([o,s])=>[...s].map(c=>r[o++]=c),r=[])&&r.join``

แก้ไข: บันทึกแล้ว 4 ไบต์ด้วย @ edc65


a => a.map (([o, s]) => [... s] .map (c => r [o ++] = c), r = []) && r.join`` บันทึก 4 ไบต์
edc65

7

Haskell, 57 ไบต์

import Data.List
map snd.sort.nub.(>>= \(n,s)->zip[n..]s)

ตัวอย่างการใช้งาน:

*Main> map snd.sort.nub.(>>= \(n,s)->zip[n..]s) $ [(2,"CG"),(0,"PP"),(1,"PC")]
"PPCG"

วิธีการทำงาน: ทำคู่ของ(index,letter)ตัวอักษรทุกตัวของทุกตัวเรียงต่อกันเป็นรายการเดียวนำรายการที่ซ้ำกันเรียงลำดับตามดัชนีลบดัชนี


4

MATL , 15 ไบต์

''i"@Y:Y:tn:b+(

ทำงานกับเวอร์ชันปัจจุบัน (13.0.0)ของภาษา / คอมไพเลอร์

อินพุตอยู่ด้วยเครื่องหมายปีกกาและเครื่องหมายคำพูดเดี่ยว (วงเล็บปีกกาใน MATLAB / MATL จะกำหนดอาร์เรย์ของเซลล์ซึ่งเป็นรายการที่สามารถมีเนื้อหาประเภทต่าง ๆ ตามอำเภอใจ) กรณีทดสอบจึง:

{{2, 'CG'}, {0, 'PP'} {1, 'PC'}}
{{0, 'foobarbaz'}}
{{0, 'foobar'}, {6, 'baz'}}
{{2, 'ob'}, {5, 'rba'}, {0, 'fooba'}, {8, 'z'}}
{{0, 'fo'}, {0, 'fooba'}, {0, 'foobarbaz'}}

ลองออนไลน์!

''      % push empty string. This will be filled with the slices to produce the result
i       % take input: cell array of cell arrays. For example: {{0, 'foobar'}, {6, 'baz'}}
"       % for each (1st-level) cell
  @     %   push that cell. Example: {{0, 'foobar'}}
  Y:    %   unpack (1st-level) cell, i.e. push its contents. Example: {0, 'foobar'}
  Y:    %   unpack (2nd-level) cell array: gives number and substring. Example: 0, 'foobar'
  tn:   %   duplicate substring and generate vector [1,2,...,n], where n is length of
        %   current substring (in the example: 6)
  b+    %   add input number that tells the position of that substring within the whole
        %   string (in the example: 0; so this gives [1,2,...,6] again)
  (     %   assign substring to the total string, overwriting if necessary. Note that
        %   MATL uses 1-indexing
        % end for each
        % implicit display

1
คำตอบนี้เป็น Bute!
Conor O'Brien

3

DUP , 14 ไบต์

[0[$;$][,1+]#]

Try it here.

แลมบ์ดานิรนาม การใช้งาน:

2"CG"0"PP"1"PC"[0[$;$][,1+]#]!

หมายเหตุ: DUP ไม่มีอาร์เรย์จริงๆดังนั้นฉันหวังว่ารูปแบบอินพุตนี้จะใช้ได้

คำอธิบาย

ความเข้าใจในสายของ DUP นั้นน่าสนใจ ... สตริงจะถูกเก็บไว้เป็นชุดของตัวแปรตัวเลขซึ่งแต่ละตัวเก็บรหัสอักขระไว้จากสตริง สิ่งที่ชอบ2"CG"ทำงานเหมือนกับการกด 2 ไปที่สแต็กจากนั้นสร้างสตริงที่มีดัชนีเริ่มจาก 2

เนื่องจากดัชนีเหล่านี้เป็นตัวแปรจริง ๆ จึงสามารถเขียนทับได้ นั่นคือสิ่งที่อินพุตทำจริงๆ: เอาชนะ! ลองกดStepเว็บไซต์ล่ามเพื่อทำความเข้าใจกับสิ่งนี้ หลังจากนี้เราจะได้สตริงที่ไม่ถูกต้อง

นี่คือที่เอาท์พุทเข้ามา

[            ] {lambda}
 0             {push 0 to the stack as accumulator}
  [   ][   ]#  {while loop}
   $;$         {duplicate, get var at TOS value, see if that var is defined}
        ,1+    {if so, output charcode at TOS and increment accumulator}

ไชโยสำหรับ DUP!
แมว

2

PHP, 146 ตัวอักษร

หมายเหตุ: Evaling เข้าของผู้ใช้เป็นเสมอความคิดที่ดี

แข็งแรงเล่นกอล์ฟ

<?$a=[];$f=0;eval("\$b={$argv[1]};");foreach($b as$d){$f=$d[0];$e=str_split($d[1]);foreach($e as$c){$a[$f++]=$c;}}ksort($a);echo join('',$a)."\n";

Ungolfed

<?php
$array = array();
$p = 0;
eval("\$input = {$argv[1]};");
foreach($input as $item)
{
    $p = $item[0];
    $str = str_split($item[1]);
    foreach($str as $part)
    {
        $array[$p++] = $part;
    }
}
ksort($array);
echo join('', $array)."\n";
?>

คุณจะเห็นว่าฉันแค่เขียนอินพุตลงในอาร์เรย์ด้วยคีย์เฉพาะที่แต่ละอักขระมีแล้วส่งออกทั้งหมด

การทดสอบ

php unslice.php '[[0, "foobar"], [6, "baz"]]' -> foobarbaz

php unslice.php '[[2, "CG"], [0, "PP"], [1, "PC"]]' -> PPCG

php shorten.php unslice.php-> สคริปต์ที่สั้นลง 107 ตัวอักษร : D


"การป้อนข้อมูลผู้ใช้อย่างไม่เป็นความคิดที่ดี " Code Golf เกี่ยวกับแนวทางปฏิบัติที่เลวร้ายที่สุด: D
cat

$a[$f]=$c;$f++;ฉันไม่รู้ PHP แต่จะทำไม่ได้$a[$f++]=c;เหรอ?
แมว

ลองเลย .. : D
timmyRS

@ แคทซ์ขอบคุณเพื่อน shorted โดย 3 ตัวอักษร : D
timmyRS

1

อย่างจริงจัง 48 ไบต์

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜

อย่างจริงจังจะไม่ดีอย่างจริงจังที่จัดการสตริง

ลองออนไลน์!

คำอธิบาย:

,`i@;l(;)+(x@#@k`M;`i@X@M`MMu' *╗`iZi`M`i╜T╗`MX╜
,                                                 get input
 `              `M;                               perform the first map and dupe
                   `     `MM                      perform the second map, get max element
                            u' *╗                 increment, make string of that many spaces, save in reg 0
                                 `   `M           third map
                                       `    `M    fourth map
                                              X╜  discard and push register 0

แผนที่ 1:

i@;l(;)+(x@#@k
i@;l            flatten, swap, dupe string, get length
    (;)+(       make stack [start, end, str]
         x@#@k  push range(start, end), explode string, make list of stack

แผนที่ 2:

i@X@M
i@X     flatten, swap, discard (discard the string)
   @M   swap, max (take maximum element from range)

แผนที่ 3:

iZi  flatten, zip, flatten (make list of [index, char] pairs)

แผนที่ 4:

i╜T╗  flatten, push reg 0, set element, push to reg 0

สรุปโปรแกรมนี้สร้างสตริงที่มีnช่องว่างโดยที่nความยาวต่ำสุดที่สตริงนั้นสามารถยึดตามอินพุตได้ มันเป็นตัวกำหนดดัชนีในสตริงผลลัพธ์ของอักขระแต่ละตัวในแต่ละส่วนและตั้งค่าอักขระในสตริงผลลัพธ์ที่ดัชนีนั้นเป็นอักขระ


1

Python ขนาด 91 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณแมว

มันค่อนข้างยาว ฉันจะตีมันลงอีกเล็กน้อย

def f(x):r={j+i:q for(i,s)in x for j,q in enumerate(s)};return"".join(map(r.get,sorted(r)))


0

CJam, 26 ไบต์

q~{~0c*\+}%{.{s\s|}}*e_0c-

ลองออนไลน์!. [["CG"2]["PP"0]["PC"1]]จะเข้าในรูปแบบ

คำอธิบาย:

q~           Read and eval input

{~0c*\+}%    Convert input strings into workable format
{      }%     Map onto each input
 ~            Evaluate
  0c          Null character
    *\+       Multiply by input number and concat to string

{.{s\s|}}*   Combine strings
{       }*    Fold array
 .{    }       Vectorize, apply block to corresponding elements of arrays
   s\s         Convert elements to strings
      |        Set Union

e_0c-        Remove null characters

0

R, 181 ไบต์

n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")

ด้วยตัวแบ่งบรรทัด:

n=nchar
m=matrix(scan(,'raw'),ncol=2,byrow=T)
w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))))
for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''))
cat("",w,sep="")

ทำงานใน R Gui (บรรทัดเดียวหรือจัดหาหลายบรรทัด) แต่ไม่ใช่ใน ideone ตัวอย่าง:

> n=nchar;m=matrix(scan(,'raw'),ncol=2,byrow=T);w=rep('',max(n(m[,2])+(i<-strtoi(m[,1]))));for(v in 1:nrow(m)) w[seq(i[v]+1,l=n(m[v,2]))]=unlist(strsplit(m[v,2],''));cat("",w,sep="")
1: 2 ob 5 rba 0 fooba 8 z
9: 
Read 8 items
foobarbaz

หมายเหตุเกี่ยวกับวิธีการป้อนข้อมูล:

หรือเพียงแค่สตริงที่ประกอบด้วยตัวเลขช่องว่างแล้วชิ้น

ฉันถือว่าฉันทำตามส่วนนี้ของ spec ด้วยอินพุตแบบนี้มันสามารถให้กับหลาย ๆ บรรทัดได้ซึ่งไม่มีผลกระทบตราบใดที่มีบรรทัดว่างเพื่อวางอินพุต

ฉันคิดว่าสามารถบันทึก 2 ตัวอักษรได้โดยการลบ +1 และใช้การสร้างดัชนีแบบพื้นฐาน 1 ตัว แต่ฉันเริ่มด้วยอินพุตที่ท้าทาย


0

C, 110 ไบต์

c,i,j;char s[99];main(){while(~scanf("%i ",&i))for(;(c=getchar())>10;s[i++]=c);for(;s[j]>10;putchar(s[j++]));}

โปรแกรมนี้ใช้การแบ่งส่วนหลังจากดัชนีในอินพุตหนึ่งบรรทัดแต่ละบรรทัด

Ungolfed:

c,i,j;char s[99];

main(){
    while(~scanf("%i ",&i))
        for(;(c=getchar())>10;s[i++]=c);
    for(;s[j]>10;putchar(s[j++]));
}

ทดสอบบนideone.com


0

Lua, 113 ไบต์

z=loadstring("return "..io.read())()table.sort(z,function(a,b)return a[1]<b[1]end)for a=1,#z do print(z[a][2])end

นี่อาจเป็นรหัสที่ปลอดภัยกว่าที่ฉันเขียน ความคิดนั้นง่าย ผู้ใช้จะป้อนอาร์เรย์ที่จัดรูปแบบดังนี้: {{1, "1"}, {3, "3"}, {2, "2"}}จากนั้นตารางจะเรียงลำดับตามดัชนีแรกและดัชนีที่สองจะถูกพิมพ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.