Kata-kata menyeberang

21

Memasukkan:

Dua string (CATATAN: urutan input penting).

Keluaran:

Kedua kata / kalimat tersebut dimulai pada baris dengan satu baris kosong di antaranya. Mereka 'berjalan' secara horizontal 'berdampingan'. Tetapi ketika mereka memiliki karakter yang sama di posisi yang sama, mereka saling silang, dan kemudian terus berjalan 'bersebelahan'.

Membingungkan Anda katakan? Mari kita beri contoh:

Masukan: Words crossing over& Ducks quacking:

Word  quack n 
    s      i g
Duck  cross n  over

Seperti yang Anda lihat, ini adalah jalannya:
Maaf cat MS buruk ..

Aturan tantangan:

  • Kami selalu pertama kembali berjalan garis lurus setelah kami 'menyeberang' sebelum kita bisa menyeberang lagi (lihat test case di atas {1} - di mana ingsama, tetapi setelah kami menyeberang i, pertama-tama kita harus kembali berjalan lurus (dengan demikian mengabaikan n), sebelum kita bisa menyeberang lagi g).
  • Input dapat memiliki panjang yang berbeda, dalam hal ini semakin lama berjalan dalam garis lurus (lihat kotak uji 1, 2, 4 & 6).
  • Kedua input bisa sama (lihat test case 3).
  • Masukan tidak akan mengandung tab atau baris baru.
  • Spasi diabaikan sebagai karakter yang sama (sebagai case tepi) , dalam hal ini karakter selanjutnya (non-spasi) setelah itu - jika ada - yang melintas sebagai gantinya (lihat test case 3, 5 & 6).
  • Input tidak boleh memiliki karakter yang berdekatan (non-spasi) pada posisi yang sama, dalam hal ini keduanya berjalan dalam garis lurus secara horizontal (lihat kotak uji 2).
  • Bahkan jika karakter pertama sama, kami selalu memulai dua baris terpisah (lihat kasus uji 3 & 6).
  • Ruang trailing dan satu garis baru trailing adalah opsional.
  • Anda dapat berasumsi bahwa input hanya akan berisi karakter ASCII yang dapat dicetak (baris dan tab baru dikecualikan).
  • Input peka huruf besar-kecil, sehingga Adan atidak sama, dan tidak akan melintas (lihat uji kasus 7).
  • Kedua panjang input akan selalu minimal 2.
  • Input & output dapat dalam format apa pun yang masuk akal. Dapat berupa String tunggal dengan baris baru; array-string / daftar; dicetak ke STDOUT; Array karakter 2D; dll.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

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 
Kevin Cruijssen
sumber

Jawaban:

4

Japt , 56 47 33 byte

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

Uji secara online! Mengambil input sebagai array dari dua string.

Saya benar-benar tolol ... y ®sejuta kali lebih mudah digunakan pada dua string dengan panjang berbeda daripada U¬íV¬@...

Penjelasan

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 adalah variabel yang melacak keadaan kita saat ini:

  • B % 4 == 0 berarti kata pertama di atas, tetapi siap untuk beralih;
  • B % 4 == 1 berarti kita baru saja beralih;
  • B % 4 == 2 berarti kata kedua di atas, tetapi siap untuk beralih;
  • B % 4 == 3 berarti kita baru saja beralih kembali.

Bkebetulan telah diatur untuk 11; karena 11 % 4 == 3, kolom pertama selalu memiliki kata pertama di atas. Kami Bsetiap saat kata swap posisi, atau kapan saja itu aneh (dengan B=c2).

Produksi ETH
sumber
6

APL (Dyalog) , 64 byte

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

Cobalah online!

Adm
sumber
Jika string dimulai dengan 3 huruf identik, ini memotong huruf ketiga, bukan yang kedua . Saya tidak yakin apakah ini hasil yang benar, saya telah bertanya kepada OP.
Tn. Xcoder
@ Mr.Xcoder Terima kasih. Harus diperbaiki sekarang.
Adám
Ok, solusi bagus kalau begitu. Jika Anda punya waktu, mungkin Anda dapat menambahkan penjelasan: P
Mr. Xcoder
@ Mr.Xcoder Ya, saya selalu melakukannya. (Ping saya jika Anda melihat jawaban saya yang tidak dapat dijelaskan!)
Adám
1
@ Adam Ya tentu saja ... atau mungkin ? Mungkin ada hubungannya dengan ini juga ... oh dan jawaban yang tidak bisa dijelaskan ! Atau mungkin dua ...? Dan sesuatu yang saya tidak mengerti .
Erik the Outgolfer
4

Arang , 69 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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
Neil
sumber
3

Python 2 , 217 210 byte

-1 byte terima kasih kepada officialaimm

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]))

Cobalah online!

tongkat
sumber
1
1 byte oleh predefinings=' '
officialaimm
1
@officialaimm Saya melakukan beberapa perubahan, sekarang memiliki jumlah byte yang sama = /
Rod
2

Haskell, 142 138 byte

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]]

Cobalah online!

Bagaimana itu bekerja:

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  
nimi
sumber
+1 jawaban yang bagus. Namun tampaknya memiliki satu bug kecil, karena sekarang mulai menyeberang ketika dua karakter pertama sama, seperti dalam tes 3, 6 dan 8 ( TIO ). Juga, saya pikir Anda lupa satu kata dalam kalimat penjelasan Anda "mengembalikan ruang untuk garis atas / bawah dan ¿¿¿untuk garis tengah ".
Kevin Cruijssen
1
@KevinCruijssen: Terima kasih telah menemukan bug. Untungnya mudah diperbaiki: mulai saja dengan g 0. Mengenai kata yang hilang: "a" seperti pada "variabel bernama a", tapi itu memang membingungkan, jadi saya menulis ulang.
nimi
Ah, itu a. :) Saya pribadi menggunakan apenjelasan saya ketika menunjukkan variabel, meskipun biasanya cukup jelas tanpa. Terima kasih atas klarifikasi, dan saya memang mengharapkan perbaikan bug yang cukup mudah untuk itu.
Kevin Cruijssen
Tidak yakin bagaimana melakukan 'a' (dengan 'diganti dengan tanda centang kembali) dalam komentar lagi, yang ingin saya katakan .. (Jadi saya menggunakan tanda centang kembali di sekitar variabel, di dalam blok kode saya.)
Kevin Cruijssen
2

JavaScript (ES6), 112 byte

(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)

Tidak Disatukan:

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

Kasus uji:

Rick Hitchcock
sumber
1

APL (Dyalog) , 50 byte

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

Cobalah online!

⍵⍀⍨¯1*⍳4 memberikan matriks:

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

(titik mewakili spasi). Kolom-kolomnya akan diputar dengan jumlah yang berbeda sehingga tiga baris pertama berakhir seperti hasil yang diinginkan - maka 3↑mendekati awal. Algoritma lainnya menghitung jumlah rotasi.

Di dalam parens: 3↑⍵membuat matriks seperti

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

dan 2=⌿membandingkan barisnya secara berpasangan, yaitu string pertama vs string kedua dan string kedua vs semua spasi spasi.

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

Kami tertarik di mana yang pertama benar (1) dan yang kedua salah (0), jadi kami mengurangi dengan >⌿untuk mendapatkan nama vektor boolean a.

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

Sekarang, dalam setiap rentangan 1-s kita perlu untuk nol kejadian genap karena tidak ada dua tikungan dapat terjadi di samping satu sama lain. Pertama kita mendapatkan penomoran seperti:

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

oleh, secara longgar, ganti a[i]dengan a[i]*max(a[i-1]+1, a[i])sampai hasilnya stabil:, {⍵⌈a×1+1,¯1↓⍵}⍣≡dan kita ambil mod 2:2|

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

Sekarang kita tahu di mana tikungan akan terjadi. Kami menyalin masing 1- masing ke kiri - 2∨/ (berpasangan "atau"):

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

dan hitung jumlah parsial - +\

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

Itu memberi kita jumlah rotasi kolom yang kita butuhkan di awal. Modulo 4 tersirat.

ngn
sumber
Bagus! Bahkan 14 byte lebih pendek dari Adám . Bisakah Anda menambahkan penjelasan (Saya yakin Anda membuatnya saat kami berbicara, tetapi jika Anda tidak ..;)
Kevin Cruijssen
Penjelasan hanya menghilangkan kesenangan mencari tahu cara kerjanya sendiri ... :)
ngn
1

Perl 5 , 211 byte

@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''}

Cobalah online!

# Perl 5 , 234 byte

Memperbaiki bug yang ditunjukkan 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}

Cobalah online!

Xcali
sumber
Hai, ketika saya mencoba menguji test case "Can you turn the lights off?" & "Can you try to solve this?"saya sepertinya mendapatkan kesalahan: Modification of non-creatable array value attempted, subscript -1 at .code.tio line 1, <> line 2.Apakah ini bug, atau apakah saya melakukan sesuatu yang salah? Inilah TIO.
Kevin Cruijssen
1
Bug. Ketika dua karakter pertama adalah sama, subscript array adalah -1, yang hanya valid jika ada data dalam array. Memperbaikinya dengan 4 byte lagi.
Xcali
0

05AB1E , 31 byte

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

Port dari @ETHproductions menjawab , tetapi dengan dua perbedaan kecil:
1) Saya mengambil input sebagai daftar karakter 2D alih-alih daftar string.
2) The counter_variabledi 05AB1E adalah 0 secara default, bukan 11 (atau 3) seperti Bdi Japt, jadi ditambahkan sebagai cek tambahan di dalam peta (dan saya memutar ke arah kanan, bukan ke kiri).

Cobalah online atau verifikasi semua kasus uji .

Penjelasan:

ζ                  # 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)
Kevin Cruijssen
sumber