คำข้าม


21

การป้อนข้อมูล:

สองสตริง (หมายเหตุ: ลำดับของอินพุตมีความสำคัญ)

เอาท์พุท:

ทั้งสองคำ / ประโยคเริ่มต้นด้วยบรรทัดที่มีหนึ่งบรรทัดว่างในระหว่างนั้น พวกเขา 'เดิน' แนวนอน 'ติดกัน' แต่เมื่อพวกเขามีตัวละครที่เหมือนกันในตำแหน่งเดียวกันพวกเขาข้ามกันแล้วเดินต่อไป 'ติดกัน'

คุณสับสนหรือเปล่า ลองยกตัวอย่าง:

อินพุต: Words crossing over& Ducks quacking:

Word  quack n 
    s      i g
Duck  cross n  over

อย่างที่คุณเห็นนี่คือเส้นทาง:
ขอโทษสีที่ไม่ดี MS

กฏท้าทาย:

  • เรามักจะกลับไปเดินเป็นเส้นตรงเสมอหลังจากที่เรา 'ข้าม' ก่อนที่เราจะข้ามอีกครั้ง (ดูกรณีทดสอบด้านบน {1} - ที่ingเท่ากัน แต่หลังจากเราข้ามไปiก่อนอื่นเราต้องย้อนกลับ เดินตรง (เช่นเมินเฉยn) ก่อนที่เราจะข้ามอีกครั้งได้g)
  • อินพุตอาจมีความยาวต่างกันซึ่งในกรณีที่อีกต่อไปที่เดินเป็นเส้นตรง (ดูกรณีทดสอบ 1, 2, 4 และ 6)
  • อินพุตทั้งสองสามารถเหมือนกัน (ดูกรณีทดสอบ 3)
  • อินพุตจะไม่มีแท็บหรือบรรทัดใหม่ใด ๆ
  • ช่องว่างจะถูกละเว้นเป็นอักขระที่เหมือนกัน (เป็นกรณีขอบ)ซึ่งในกรณีนี้อักขระ (ไม่ใช่ช่องว่าง) ถัดไปหลังจากนั้น - ถ้ามี - ข้ามไปแทน (ดูกรณีทดสอบ 3, 5 และ 6)
  • อินพุตไม่สามารถมีตัวอักษร (ไม่ใช่ช่องว่าง) ติดกันในตำแหน่งเดียวกันได้เลยซึ่งในกรณีนี้ทั้งคู่จะเดินเป็นเส้นตรงในแนวนอน (ดูกรณีทดสอบ 2)
  • แม้ว่าตัวละครตัวแรกจะเท่ากันเราก็เริ่มต้นสองบรรทัดแยกกันเสมอ (ดูกรณีทดสอบ 3 & 6)
  • ช่องว่างต่อท้ายและบรรทัดใหม่ต่อท้ายบรรทัดเดียวเป็นตัวเลือก
  • คุณสามารถสมมติว่าอินพุตจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (ยกเว้นบรรทัดใหม่และแท็บ)
  • ปัจจัยการผลิตเป็นกรณี ๆ เพื่อให้Aและaจะไม่เท่ากันและจะไม่ข้าม (ดูกรณีทดสอบ 7)
  • ความยาวอินพุตทั้งสองจะต้องเป็นอย่างน้อย 2 เสมอ
  • อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่เหมาะสม สามารถเป็นสตริงเดี่ยวที่มีบรรทัดใหม่; String-array / รายการ; พิมพ์ไปยัง STDOUT; อาร์เรย์ของอักขระ 2 มิติ เป็นต้น

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ:

1. Input: "Words crossing over" & "Ducks quacking"

1. Output:
Word  quack n 
    s      i g
Duck  cross n  over

2. Input: "bananas" & "ananas"

2. Output:
bananas

ananas

3. Input: "I see my twin!" & "I see my twin!"

3. Output:
I  e   y  w n 
  s e m  t i !
I  e   y  w n 

4. Input: "Is the weather nice?" & "Not really, no.."

4. Output:
Is th ally, no..
     e
Not r  weather nice?

5. Input: "Codegolf & Programming Puzzles" & "The golfer might solve puzzles"

5. Output:
Code o f & Programming P z l s
    g l                 u z e
The  o fer might solve p z l s

6. Input: "Can you turn the lights off?" & "Can you try to solve this?"

6. Output:
C n  o   urn the  ve  s off?
 a  y u t        l   t 
C n  o   ry to so igh his?

7. Input: "one Ampere" & "two apples"

7. Output:
one Am les
      p
two ap ere

8. Input: "Words crossing" & "Words Quacking"

8. Output:
W r s cross n 
 o d       i g
W r s Quack n 

คำตอบ:


4

Japt , 56 47 33 ไบต์

y ®m+S éBv ©ZꬩZx ?°B:B=c2)¯3÷y

ทดสอบออนไลน์! รับอินพุตเป็นอาร์เรย์ของสองสตริง

ฉันเป็นคนปัญญาอ่อนทั้งหมด ... y ®ใช้งานง่ายกว่าล้านครั้งบนสองสายอักขระยาวกว่าU¬íV¬@...

คำอธิบาย

y ®   m+S éBv © Zê¬ © Zx ?° B:B= c2)¯  3à ·  y
y mZ{Zm+S éBv &&Zêq &&Zx ?++B:B=Bc2)s0,3} qR y

              Implicit: U = array of two strings
y             Transpose U, padding the shorter string with spaces in the process.
mZ{        }  Map each pair of chars Z by this function: (we'll call the chars X and Y)
  Zm+S          Append a space to each char, giving X + " " + Y + " ".
  Bv            If B is divisible by 2
  &&Zêq           and Z is a palindrome (X and Y are the same)
  &&Zx ?          and Z.trim() is not empty (X and Y are not spaces):
    ++B           Increment B. B is now odd; the top and bottom strings are swapping.
  :             Otherwise:
    B=Bc2         Ceiling B to a multiple of 2. (0 -> 0, 1 -> 2, 2 -> 2, etc.)
  é       )     Rotate the string generated earlier this many chars to the right.
  s0,3          Take only the first 3 chars of the result.
qR            Join the resulting array of strings with newlines.
y             Transpose rows with columns.
              Implicit: output result of last expression

B เป็นตัวแปรที่ติดตามสถานะที่เราอยู่:

  • B % 4 == 0 หมายถึงคำแรกที่อยู่ด้านบน แต่พร้อมที่จะสลับ
  • B % 4 == 1 หมายความว่าเราเพิ่งเปลี่ยน
  • B % 4 == 2 หมายถึงคำที่สองอยู่ด้านบน แต่พร้อมที่จะสลับ
  • B % 4 == 3 หมายความว่าเราเพิ่งเปลี่ยนกลับ

Bเกิดขึ้นที่จะกำหนดไว้ล่วงหน้าเพื่อ11; ตั้งแต่11 % 4 == 3คอลัมน์แรกจะมีคำแรกอยู่ด้านบนเสมอ เราเพิ่มBทุกครั้งที่คำสลับตำแหน่งหรือทุกครั้งที่มันแปลก (กับB=c2)


6

APL (Dyalog) 64 ไบต์

{C←⎕UCS1e' '1 0 1⍀⍵⊖⍨≠\eC(2/⊃l)⎕R(lC⌽⍳2)C(0@0=⌿⍵)∧' '1⌷⍵}

ลองออนไลน์!


ถ้าสตริงเริ่มต้นด้วย 3 ตัวอักษรที่เหมือนกันนี้ตัดตัวอักษรที่สามไม่ได้เป็นคนที่สอง ฉันไม่แน่ใจว่านี่เป็นผลลัพธ์ที่ถูกต้องหรือไม่ฉันได้ขอ OP
Mr. Xcoder

@ Mr.Xcoder ขอบคุณ ควรได้รับการแก้ไขแล้ว
Adám

ตกลงแล้วทางออกที่ดี หากคุณมีเวลาคุณอาจเพิ่มคำอธิบาย: P
Mr. Xcoder

@ Mr.Xcoder ใช่ฉันทำเสมอ (ปิงฉันถ้าคุณดูคำตอบไม่ได้อธิบายใด ๆ ของฉัน!)
อดัม

1
@ Adám ใช่แน่นอน ...หรืออาจจะ ? อาจมีบางสิ่งที่เกี่ยวข้องกับเรื่องนี้เช่นกัน ... โอ้และคำตอบที่ไม่สามารถอธิบายได้ ! หรืออาจจะสอง ... และสิ่งที่ฉันไม่ได้ค่อนข้างได้รับ
Erik the Outgolfer

4

ถ่าน , 69 ไบต์

AE⮌θιθAE⮌ηιηW∧θη«A⊟θεA⊟ηδA∧¬∨φ⁼ε ⁼εδφ¿φ«εAθδAηθAδη»«↑↓ε↓↗δ»»¿θ↑↓↑⮌⁺θη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

AE⮌θιθAE⮌ηιη        Turn the input strings into arrays and reverse them
W∧θη«               While both valus still have characters left
     A⊟θεA⊟ηδ       Extract the next pair of characters
     A∧¬∨φ⁼ε ⁼εδφ   Determine whether this is a crossing point
     ¿φ«εAθδAηθAδη  If so then print the character and switch the value
      »«↑↓ε↓↗δ»»     Otherwise print the two characters apart
¿θ↑↓                Move to print any remaining characters accordingly
↑⮌⁺θη               Print any remaining characters

3

Python 2 , 217 210 ไบต์

-1 ไบต์ต้องขอขอบคุณอย่างเป็นทางการ

a,b=map(list,input())
n=max(len(a),len(b))
c=[' ']*n
a=(a+c)[:n]
b=(b+c)[:n]
for i in range(1,n):
 if a[i]==b[i]!=' '==c[i-1]:c[i]=a[i];a[i]=b[i]=' ';a[i:],b[i:]=b[i:],a[i:]
print'\n'.join(map(''.join,[a,c,b]))

ลองออนไลน์!


1
1 ไบต์โดยกำหนดไว้ล่วงหน้าs=' '
เป็นทางการจาก

1
@officialaimm ฉันทำการเปลี่ยนแปลงบางอย่างตอนนี้มันมีจำนวนไบต์เดียวกัน = /
Rod

2

Haskell, 142 138 ไบต์

g(a:b)f(c:d)|f>0,a==c,a>' '=[' ',a,' ']:g d 0b|1<2=[a,' ',c]:g b 1d
g[]_[]=[]
g b f d=g(max" "b)f$max" "d
a&b=[[j!!i|j<-g a 0b]|i<-[0..2]]

ลองออนไลน์!

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

g                    -- function g constructs a list of lists of three characters
                     --   the 1st char belongs to the upper line,
                     --   the 2nd char to the middle line and
                     --   the 3rd char to the lower line
      f              -- flag f indicates if crossing is allowed or not
 (a:b) (c:d)         -- strings to cross
  |f>0               -- if crossing is allowed
      ,a==c          -- and both strings start with the same char
           ,a>' '    --   that is not a space
   =[' ',a,' ']      -- return space for upper/lower line and char a for the middle line
      :g d 0b        -- and go on with crossing disabled and strings swapped
 |1<2=               -- else
   [a,' ',c]         -- keep chars in their lines and
      :g b 1d        --  go on with crossing enabled

g[]_[]=[]            -- base case: stop when both strings are empty

g b f d=             -- if exactly one string runs out of characters
 g(max" "b)f$max" "d --   replace it with a single space and retry

a&b=                 -- main function
          i<-[0..2]  -- for each line i from [0,1,2]    
       j<-g a 0b     -- walk through the result of a call to g with crossing disabled
    j!!i             -- and pick the char for the current line  

+1 คำตอบที่ดี ดูเหมือนว่าจะมีข้อผิดพลาดเล็ก ๆ น้อย ๆ หนึ่งอย่างเนื่องจากตอนนี้เริ่มข้ามเมื่ออักขระสองตัวแรกเท่ากันเช่นในการทดสอบ 3, 6 และ 8 ( TIO ) นอกจากนี้ฉันคิดว่าคุณลืมคำในประโยคคำอธิบายของคุณ"คืนพื้นที่สำหรับบรรทัดบน / ล่างและ¿¿¿สำหรับบรรทัดกลาง "
Kevin Cruijssen

1
@KevinCruijssen: ขอบคุณที่ค้นหาบั๊ก โชคดีที่มันง่ายที่จะแก้ไข: g 0เพียงแค่เริ่มต้นด้วย เกี่ยวกับคำที่หายไป: "a" ใน "ตัวแปรชื่อ" แต่มันทำให้สับสนจริงๆ
nimi

aอาว่า :) ฉันใช้ส่วนตัวaในการอธิบายเมื่อชี้ไปที่ตัวแปรแม้ว่าโดยปกติแล้วจะชัดเจนเพียงพอ ขอบคุณสำหรับคำอธิบายและฉันก็คาดหวังว่าจะแก้ไขข้อผิดพลาดได้ง่าย
Kevin Cruijssen

ไม่แน่ใจว่าจะทำ 'a' (ด้วย'การถูกแทนที่ด้วย back-tick) ในความคิดเห็นอีกต่อไปซึ่งเป็นสิ่งที่ฉันต้องการจะพูด .. (ดังนั้นฉันใช้ back-ticks รอบ ๆ ตัวแปรภายในโค้ดบล็อกของฉัน)
Kevin Cruijssen

2

JavaScript (ES6), 112 ไบต์

(a,b,c='',g=([a,...A],[b,...B],w)=>a?w&a==b&a>' '?' '+g(B,A,c+=a):a+g(A,B,1,c+=' '):'')=>g(a,b)+`
`+c+`
`+g(b,a)

Ungolfed:

f=
(a,b,                                    //the inputs
 c='',                                   //c will hold the middle sentence
 g=([a,...A],[b,...B],w)=>               //define a function to walk through the strings
                                         //w will be false if we're at the beginning,
                                         //... or if we've just done a swap
     a?                                  //are there any letters left?
       w&a==b&a>' '?' '+g(B,A,c+=a):     //if we haven't just swapped and the letters match,
                                         //... add the current letter to c 
                                         //... and recurse swapping the strings
                    a+g(A,B,1,c+=' '):   //else add a space to c and continue processing
                    ''
)=>
g(a,b)+'\n'+                             //call g with a, b
c+'\n'+                                  //output c
g(b,a)                                   //call g with b, a

กรณีทดสอบ:


1

APL (Dyalog) 50 ไบต์

{3↑(0,+\2∨/2|{⍵⌈a×1+11↓⍵}⍣≡a←>⌿2=⌿3↑⍵)⊖⍵⍀⍨¯1*⍳4}

ลองออนไลน์!

⍵⍀⍨¯1*⍳4 ให้เมทริกซ์:

Words.crossing.over
...................
Ducks.quacking.....
...................

(จุดแทนช่องว่าง) คอลัมน์ของมันจะถูกหมุนด้วยจำนวนที่แตกต่างกันดังนั้นสามแถวแรกจะจบลงดูเหมือนกับผลลัพธ์ที่ต้องการ - 3↑ใกล้ถึงจุดเริ่มต้น ส่วนที่เหลือของอัลกอริทึมคำนวณจำนวนการหมุน

ภายใน parens: 3↑⍵สร้างเมทริกซ์เช่น

Words.crossing.over
Ducks.quacking.....
...................

และ2=⌿เปรียบเทียบแถวของมันในแนวนอนกันคือสตริงแรกกับสตริงที่สองและสตริงที่สองเทียบกับแถวเว้นวรรค

0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1

เรามีความสนใจในการที่อดีตเป็นความจริง (1) และเท็จหลัง (0) ดังนั้นเราจึงลดด้วยที่จะได้รับเวกเตอร์บูลชื่อ>⌿a

0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0

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

0 0 0 0 1 0 0 0 0 0 0 1 2 3 0 0 0 0 0

โดย, พูดอย่างหลวม ๆ , แทนที่a[i]ด้วยa[i]*max(a[i-1]+1, a[i])จนกระทั่งผลลัพธ์มีความเสถียร: {⍵⌈a×1+1,¯1↓⍵}⍣≡, และเราใช้ mod 2:2|

0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0

ตอนนี้เรารู้แล้วว่าจะเกิดอะไรขึ้น เราคัดลอกแต่ละ1รายการทางซ้าย - 2∨/ (pairwise "หรือ"):

0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0

และคำนวณผลรวมบางส่วน - +\

0 0 0 0 1 2 2 2 2 2 2 3 4 5 6 6 6 6 6

นั่นทำให้เรามีจำนวนการหมุนเวียนคอลัมน์ที่เราต้องการในตอนแรก Modulo 4 มีความหมายโดยนัย


ดี! แม้ 14 ไบต์สั้นกว่าอดัม คุณสามารถเพิ่มคำอธิบาย (ฉันแน่ใจว่าคุณกำลังทำตามที่เราพูด แต่ในกรณีที่คุณไม่ได้ .. ;)
เควิน Cruijssen

คำอธิบายจะนำความสุขของการคิดออกว่ามันทำงานด้วยตัวคุณเองได้อย่างไร ... :)
ngn

1

Perl 5 , 211 ไบต์

@a=map[/./g],<>;$b=1;($f,@{$r[$i]})=$a[0][$i]eq$a[1][$i]&&$f&&$a[0][$i]ne$"?(0,$",$a[0][$i],$",$t=$b++):(1,$a[$t%2][$i],$",$a[$b%2][$i]),$i++while$a[0][$i]||$a[1][$i];for$i(0..2){print$r[$_][$i]for 0..$#r;say''}

ลองออนไลน์!

# Perl 5 , 234 ไบต์

แก้ไขข้อผิดพลาดที่ Kevin ชี้ให้เห็น

@a=map[/./g],<>;$l=@{$a[0]}>@{$a[1]}?@{$a[0]}:@{$a[1]};$b=1;@{$r[$_]}=$a[0][$_]eq$a[1][$_]&&$_&&$r[$_-1][1]eq$"&&$a[0][$_]ne$"?($",$a[0][$_],$",$t=$b++):($a[$t%2][$_],$",$a[$b%2][$_])for 0..$l;for$i(0..2){print$r[$_][$i]for 0..$l;say}

ลองออนไลน์!


สวัสดีเมื่อฉันพยายามทดสอบกรณีทดสอบ"Can you turn the lights off?" & "Can you try to solve this?"ฉันดูเหมือนจะได้รับข้อผิดพลาด: Modification of non-creatable array value attempted, subscript -1 at .code.tio line 1, <> line 2.นี่เป็นข้อบกพร่องหรือฉันกำลังทำสิ่งผิดพลาดหรือไม่? นี่คือ TIO
Kevin Cruijssen

1
แมลง เมื่ออักขระสองตัวแรกเหมือนกันตัวห้อยของอาร์เรย์คือ -1 ซึ่งใช้ได้เฉพาะเมื่อมีข้อมูลอยู่ในอาร์เรย์ แก้ไขด้วย 4 ไบต์เพิ่มเติม
Xcali

0

05AB1E , 31 ไบต์

ζεËNĀ¾Èyðå_Pi¼ë¾É½}yð«S¾._¨}øJ»

คำตอบJaptของ@ETHproductionsของพอร์ตแต่ด้วยความแตกต่างเล็กน้อยสองประการ:
1) ฉันรับอินพุตเป็นรายการอักขระ 2 มิติแทนที่จะเป็นรายการสตริง
2) counter_variableค่าเริ่มต้นใน 05AB1E คือ 0 โดยค่าเริ่มต้นแทนที่จะเป็น 11 (หรือ 3) เช่นเดียวกับBใน Japt ดังนั้นการเพิ่มจะเป็นการตรวจสอบเพิ่มเติมภายในแผนที่ (และฉันหมุนไปทางขวาแทนซ้าย)

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ζ                  # Zip/transpose (swapping rows/columns) the (implicit) input-list
                   # with space filler by default to create pairs
 ε          }      # Map each pair `y` to:
  Ë                #  Check if both values in the pair are equal
  NĀ               #  Check if the map-index is not 0
  ¾È               #  Check if the counter_variable is even
  yðå_             #  Check if the pair contains no spaces " "
  Pi               #  If all checks are truthy:
    ¼              #   Increase the counter_variable by 1:
   ë               #  Else:
    ¾É             #   Check if the counter_variable is odd
      ½            #   And if it is: increase the counter_variable by 1
   }               #  Close the if-else
    yð«            #  Add a space after both characters in the pair
       S           #  Convert it to a list of characters (implicitly flattens)
        ¾._        #  Rotate this list the counter_variable amount of times towards the right
           ¨       #  And then remove the last character
             ø     # Zip/transpose; swapping rows/columns
              J    # Join each inner character-list to a single string
               »   # Join everything by newlines (and output implicitly)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.