เติมร่วมกันในช่องว่าง


11

กำหนดอินพุตของสองสตริงที่มีลำดับของขีดล่างแทนคำที่สอดคล้องกันส่งออกประโยคที่มี "ช่องว่าง" กรอก

วิธีที่ดีที่สุดในการอธิบายความท้าทายนี้เป็นตัวอย่าง นี่คือตัวอย่างอินพุต:

programming _____________ and code golf
programming puzzles ______ code ____

และนี่คือผลลัพธ์ที่สอดคล้องกัน:

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

สำหรับจุดประสงค์ของการท้าทายนี้คำว่า "word" หมายถึงลำดับของตัวอักษรตัวพิมพ์เล็กหนึ่งตัวหรือมากกว่าและ "blank" หมายถึงขีดเส้นใต้อย่างน้อยหนึ่งตัว (อินพุตจะมีตัวอักษรตัวพิมพ์เล็กช่องว่างและขีดล่าง) เสมอ . คำและช่องว่างในสตริงอินพุตจะถูกคั่นด้วยช่องว่างเดียวและผลรวมของจำนวนคำและช่องว่างในประโยคจะเท่ากันเสมอ

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

  • คำต้องอยู่กึ่งกลางในช่องว่างดังที่แสดงด้วยคำว่า "ปริศนา" ในตัวอย่างด้านบน - มีการขีดเส้นใต้จำนวนเท่ากันทั้งสองด้าน

  • หากคำไม่สามารถอยู่ตรงกลางขีดล่างพิเศษอาจไปทางซ้ายหรือขวา (เช่นคำว่า "และ" ในตัวอย่างด้านบน)

  • จะมีขีดล่างที่เพียงพอสำหรับคำที่เหมาะสม แต่อาจมีความยาวเท่ากับจำนวนคำ (เช่นคำว่า "กอล์ฟ" ในตัวอย่างด้านบน)

  • จะไม่มีช่องว่างในตำแหน่งเดียวกันในทั้งสองสตริง

อินพุต / เอาต์พุตอาจเป็นอย่างใดอย่างหนึ่งต่อไปนี้ (อินพุต / เอาต์พุตไม่จำเป็นต้องใช้วิธีเดียวกัน):

  • สตริงเดี่ยวคั่นด้วยอักขระใด ๆ ที่ไม่ใช่ตัวอักษรเว้นวรรคหรือขีดล่าง (เช่นการขึ้นบรรทัดใหม่หรือสตริงคั่นด้วยเครื่องหมายจุลภาค)

  • อาร์เรย์ / รายการ / ฯลฯ ของสองสาย

  • อาร์กิวเมนต์ของฟังก์ชัน / บรรทัดคำสั่งสองรายการ (อินพุตเท่านั้น)

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

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

lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum

lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

Nice bidiurnal challenge
Rɪᴋᴇʀ

คำตอบ:


5

Pyth, 30

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q

รับอินพุตและเอาต์พุตเป็นรายการของสองสตริง ใช้การแบ่งแบบพื้นฐาน ––– ––– ––– –– –– –– ––– ––

ลองที่นี่

ขยาย:

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q   ##
                          cR;Q   ##  split
                         C       ##  zip
    mm                           ##  double map
      |*}J\_k.[lkhx#JdJkd        ##  centre
   C                             ##  zip
jL;                              ##  join

ฉันจะอธิบายเพิ่มเติมอีกครั้งเมื่อฉันพอใจจริงๆที่ฉันไม่สามารถตีกอล์ฟนี้ได้อีกแม้ว่ามันจะค่อนข้างชัดเจนเนื่องจากความแพร่หลายของการแยก - zip - double map - center – zip - เข้าร่วมและทั้งหมด


8
Ahhh วิธีการแยกแผนที่แบบซิป - ดับเบิล - ศูนย์ - ซิป - คลาสสิค ฉันชอบจดจำว่ามันถูกใช้เป็นตัวอย่างเบื้องต้นในการบรรยายอัลกอริทึม 101 ของฉัน
Martin Ender

3
@ MartinBüttnerใช่ฉันมีความทรงจำที่ไม่ดีเพราะฉันนอนในห้องนั้นต้องแก้ปัญหาในการสอบโดยใช้วิธีการต่อท้าย - จับคู่ - จับคู่ - เพิ่ม - ศูนย์แทน
FryAmTheEggman

4
ฉันจะไปใช้น้ำเย็นกับการเผาไหม้
Martin Ender

7

เรติน่า , 102 100 93 88 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

$
!¶$`
m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2
(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

สตริงจะถูกคั่นด้วย linefeed หากมีจำนวนขีดเส้นใต้คี่เหลือจำนวนหนึ่งจะอยู่ด้านนอกคำนั้น

ลองออนไลน์!

คำอธิบาย

ฉันเดาว่านี่เป็น "วิธีการต่อท้าย - จับคู่ - จับคู่ - เพิ่ม - ศูนย์" หรือใกล้เคียง ...

$
!¶$`

เราเริ่มต้นด้วยการทำซ้ำอินพุต (คั่นด้วย a !และตัวป้อนบรรทัด) วัตถุประสงค์ของการทำเช่นนี้คือเราสามารถประมวลผลทั้งสองบรรทัดโดยดึงคำจากบรรทัดถัดไป (แทนที่จะต้องแยกบรรทัดที่สองออกจากกัน)

m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2

วิธีนี้จะเติมคำที่ถูกต้องให้กับแต่ละช่องว่าง เราเริ่มต้นด้วยการนับตำแหน่งคำปัจจุบันด้วย lookbehind (?<=^(\w+ )*)(ตำแหน่งถูกเก็บเป็นความลึกของกลุ่ม1) จากนั้น lookahead a) ทำให้แน่ใจว่าเราอยู่ที่จุดเริ่มต้นของช่องว่างโดยการจับคู่_จากนั้นข้ามไปยังบรรทัดถัดไป.*¶ตรงกับจำนวนคำที่ถูกต้องด้วย(?<-1>\w+ )*เพื่อไปยังตำแหน่งที่เหมาะสมและจากนั้นตรงกับคำที่พบ(\w+)ใน 2กลุ่ม

(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

ขั้นตอนนี้ทำสามสิ่ง:

  • มันลบขีดล่างที่สอดคล้องกับความยาวแต่ละคำ สิ่งนี้ทำได้โดยการนับความยาวของคำเป็นกลุ่ม2ด้วย([a-z])+แล้วจับคู่กับขีดล่างจำนวนมาก (ซึ่งไม่เคยเขียนกลับมา)
  • มันเลื่อนคำไปที่กึ่งกลางของช่องว่างโดยจับครึ่งหนึ่งของขีดเส้นใต้ที่เหลือด้วย(_*)\3และเขียน$3$1$3กลับ
  • มันลบข้อมูลที่ซ้ำกันโดยการจับคู่!\D+และแทนที่ด้วยอะไร

4

Python 2, 109

def f(a,b):exec"print' '.join([x,y][x<'`'].center(len(x),'_')for x,y in zip(a.split(),b.split()));a,b=b,a;"*2

ฟังก์ชันรับสองสตริงเป็นอาร์กิวเมนต์และพิมพ์เอาต์พุตดังตัวอย่าง มันใช้วิธีการที่น่าเบื่อด้วยstr.center(width, fillchar)การทำงานส่วนใหญ่

ลองมันออนไลน์


1
ผมไม่คิดว่าคุณต้องเว้นแต่ฉันหายไปสิ่งที่คุณก็สามารถทำแลกเปลี่ยนหลังจากที่พิมพ์และแบบอินไลน์z z
FryAmTheEggman

@FryAmTheEggman ใช่คุณพูดถูก ขอบคุณ :)
grc

2

Ruby, 111 109 ตัวอักษร

->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_
c}.transpose.map{|s|s*' '}}

อินพุต: อาร์เรย์ของ 2 สตริง เอาต์พุต: อาร์เรย์ของ 2 สตริง

วิ่งตัวอย่าง:

2.1.5 :001 > puts ->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_;c}.transpose.map{|s|s*' '}}[[
2.1.5 :002 >       'programming _____________ and code golf',
2.1.5 :003 >       'programming puzzles ______ code ____',
2.1.5 :004 >       ]]
programming ___puzzles___ and code golf
programming puzzles _and__ code golf

1

JavaScript, 194 185 ไบต์

f=(m,n)=>(m=m.split` `,n=n.split` `,G=(x,i,a)=>x[0]!='_'?x:(b=(a?n:m)[i],s=x.length-b.length,(k='_'.repeat(s/2))+b+k+(s%2?'_':'')),H=(e,y)=>e.map((x,i)=>G(x,i,y)).join` `,[H(m,1),H(n)])

รับสองสตริงเป็นพารามิเตอร์และส่งออกสองสตริงเป็นอาร์เรย์ / รายการ


1

Mathematica 223

จะต้องมีวิธีที่สั้นกว่านี้

k=StringLength;m=StringSplit;
g=Partition[Riffle[m@#,m@#2],2]/.{{a_,a_}:> a<>" ",{a_,b_/; StringTake[b,1]=="_"}:> a<>" ",
{a_,b_}:>Table["_",Ceiling[z=(k@a-k@b)/2]]<>b<>""<>Table["_",Floor@z]<>" "}&;
s_~h~t_:={""<>g[s,t],""<>g[t,s]}

วิ่งตัวอย่าง

h["programming _____________ and code golf", "programming puzzles ______ code ____"]

ป้อนคำอธิบายรูปภาพที่นี่


0

Gema, 208 203 ตัวอักษร

\B=@set{i;0}
<I>=@push{${v;f};$0}@incr{i}
\n=@set{v;s}@set{i;0}
 =
\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S

เพียงเพราะ Gema มีฟังก์ชั่นที่สมบูรณ์แบบสำหรับงานนี้:@fill-center{background;value}

อินพุต: 2 บรรทัดที่คั่นด้วยบรรทัดใหม่ (ไม่มีบรรทัดใหม่สุดท้าย); เอาต์พุต: 2 บรรทัดที่คั่นด้วยบรรทัดใหม่ (ที่มีช่องว่างต่อท้าย - ดูเหมือนจะไม่ถูกห้าม)

วิ่งตัวอย่าง:

bash-4.3$ echo -ne 'programming _____________ and code golf\nprogramming puzzles ______ code ____' |
> gema '\B=@set{i;0};<I>=@push{${v;f};$0}@incr{i};\n=@set{v;s}@set{i;0}; =;\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S'
programming ___puzzles___ and code golf 
programming puzzles _and__ code golf 

0

C, 197 ไบต์

#define c(w,y)l=strspn(w,"_"),r=strcspn(y," "),memcpy(w+(l-r)/2,y,r),w+=l,y+=r;
main(l,v,w,y,r)char**v,*w,*y;{for(w=v[1],y=v[2];*w;w++,y++)if(*w^*y)if(*w^95)c(y,w)else c(w,y)puts(v[1]);puts(v[2]);}

เอาท์พุต

$ ./a.out "lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum" "lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum"
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

0

ES6, 122 ไบต์

a=>a.map(s=>s.split` `).map((s,n,a)=>s.map((w,i)=>w<'a'?(l=w.length,t=w+a[n^1][i]+w,t.substr(t.length-l>>1,l)):w).join` `)

รับอาร์เรย์ของสองสายเป็นพารามิเตอร์เดียวและส่งกลับอาร์เรย์อีกสองสาย

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