Üzerinden geçen kelimeler


21

Giriş:

İki karakter (NOT: giriş sırası önemlidir).

Çıktı:

Her iki kelime / cümle, aralarında boş bir satır bulunan satırlarda başlar. 'Yan yana' yatay 'yürürler'. Ancak aynı karakterde aynı konumda olduklarında birbirlerini geçerler ve sonra 'birbirlerinin yanında' yürümeye devam ederler.

Söylemiştin mi? Bir örnek verelim:

Giriş: Words crossing over& Ducks quacking:

Word  quack n 
    s      i g
Duck  cross n  over

Gördüğünüz gibi, bunlar yollar:
Kötü MS boya bahane ..

Meydan okuma kuralları:

  • Tekrar geçmeden önce her zaman önce 'çarpıştıktan' sonra düz bir çizgide yürümeye geri dönüyoruz (bkz. Yukarıdaki {1} test durumu - ingeşit, ancak geçtikten sonra iilk önce geri dönmeliyiz) tekrar yürüyebilmemiz için nönce düz yürüyoruz (böylece görmezden geliyoruz g).
  • Girişler farklı uzunluklarda olabilir; bu durumda daha uzun olanı düz bir çizgide yürümeye devam eder (bkz. Test durumları 1, 2, 4 & 6).
  • Her iki giriş de aynı olabilir (bkz. Test durumu 3).
  • Girişler herhangi bir sekme veya yeni satır içermez.
  • Boşluklar, aynı (bir harf büyüklüğü gibi) karakterleri olarak göz ardı edilir ; bu durumda bundan sonraki (boşluksuz) karakter - eğer varsa - bunun yerine geçer (bkz. Test durumları 3, 5 ve 6).
  • Girişlerin aynı konumda bitişik (boşluksuz) karakterleri olamaz, bu durumda her ikisi de yatay olarak düz bir çizgide yürürler (bkz. Test durumları 2).
  • İlk karakter eşit olsa bile, her zaman iki satır birbirimize başlarız (bkz. Test durumları 3 ve 6).
  • Sondaki boşluklar ve sondaki tek satır yeni isteğe bağlıdır.
  • Girişlerin yalnızca yazdırılabilir ASCII karakterleri içereceğini varsayabilirsiniz (yeni satırlar ve sekmeler hariç).
  • Girişler çok harf duyarlı olan Ave aeşit değildir, ve (test durumu 7) üzerinde çapraz olmaz.
  • Her iki giriş uzunluğu da daima en az 2 olacaktır.
  • Giriş ve çıkış herhangi bir makul formatta olabilir. Yeni çizgilerle tek bir Dize olabilir; bir Dize-dizi / liste; STDOUT'a basılmıştır; 2B karakter dizisi; vb.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT fonksiyonlarını, uygun parametrelerle fonksiyonlarını ve geri dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

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 

Yanıtlar:


4

Japt , 56 47 33 bayt

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

Çevrimiçi test edin! Girdiyi iki karakter dizisi olarak alır.

Ben moron ... duyuyorum y ®ikiden farklı uzunlukta dizeleri kullanmak için bir milyon kat daha kolaydır U¬íV¬@...

açıklama

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 hangi durumda olduğumuzu izleyen bir değişkendir:

  • B % 4 == 0 ilk kelime üstte fakat değişime hazır demektir;
  • B % 4 == 1 şimdi yeni değiştirdiğimiz anlamına gelir;
  • B % 4 == 2 üstte ikinci kelime anlamına gelir, ancak değişime hazırdır;
  • B % 4 == 3 demek ki daha yeni geri döndük.

Bönceden ayarlanmış olur 11; o 11 % 4 == 3zaman, ilk sütun her zaman üstte ilk kelimeye sahiptir. Biz artırmak Bkelimeler konumları takas her zaman, ya da (herhangi bir sefer garip B=c2).


6

APL (Dyalog) , 64 bayt

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

Çevrimiçi deneyin!


Dizeler 3 aynı harfle başlarsa, bu ikinci harfleri değil üçüncü harfleri keser . Bu doğru sonuç olup olmadığından emin değilim, OP sordum.
Bay Xcoder

@ Mr.Xcoder Teşekkürler. Şimdi düzeltilmeli.
Adám

Tamam, güzel çözüm o zaman. Zamanınız varsa, belki bir açıklama ekleyebilirsiniz: P
Bay Xcoder

@ Mr.Xcoder Evet, her zaman yaparım. (Açıklanamayan herhangi bir cevabını görürseniz bana ping!)
Adám

1
@ Adám Evet kesinlikle ... ya da belki ? İle ilgili bir şey olabilir bu sıra ... oh ve açıklanamayan bir cevap ! Ya da belki iki ... Ve tam olarak anlamadığım bir şey .
Outgolfer Erik,

4

Kömür , 69 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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 bayt

Officialaimm sayesinde -1 bayt

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

Çevrimiçi deneyin!


1
1 bayt önceden s=' '
officialaimm

1
@officialaimm Bazı değişiklikler yaptım, şimdi aynı bayt sayımına sahip = /
Rod

2

Haskell, 142 138 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır:

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 güzel cevap. Bununla birlikte, küçük bir böceğe sahip gibi görünüyor, çünkü ilk iki karakter eşit olduğunda, şimdi 3, 6 ve 8 ( TIO ) testlerinde olduğu gibi geçmeye başlıyor . Ayrıca, açıklama cümlenizdeki bir kelimeyi unuttuğunuzu düşünüyorum "üst / alt satır için bir boşluk ve orta satır için bir " ¿¿ ".
Kevin Cruijssen

1
@KevinCruijssen: Hatayı bulduğun için teşekkürler. Neyse ki düzeltmek kolaydır: sadece başlayın g 0. Eksik kelime ile ilgili olarak: "a" isimli "değişken" olarak adlandırılmıştır, ancak bu gerçekten kafa karıştırıcıdır, bu yüzden onu yeniden değerlendirdim.
nimi

Ah, bu a. :) aDeğişkenleri belirtirken açıklamalarımda şahsen kullanırım , ancak genellikle yeterince açık olmasa da. Açıklama için teşekkürler ve gerçekten çok kolay bir hata düzeltmeyi bekliyordum.
Kevin Cruijssen

Emin değil nasıl ( 'a' yapmak 'Söylemek istediğim şey .. olan artık bir açıklamada bir arka kene değiştirilmektedir) (kullandığım Yani benim kod blokları içinde değişkenler etrafında arka keneler.)
Kevin Cruijssen

2

JavaScript (ES6), 112 bayt

(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

Test durumları:


1

APL (Dyalog) , 50 bayt

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

Çevrimiçi deneyin!

⍵⍀⍨¯1*⍳4 matrisi verir:

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

(noktalar boşlukları temsil eder). Sütunları farklı miktarlarda döndürülecek, böylece ilk üç sıra istenen sonuç gibi görünecek şekilde sona ermektedir - bu nedenle 3↑en baştan yakındır. Algoritmanın geri kalanı rotasyon miktarlarını hesaplar.

Parens içinde: 3↑⍵gibi bir matris oluşturur

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

ve 2=⌿satırlarını ikili olarak karşılaştırır, yani birinci dize ile ikinci dize ve ikinci dize ile tüm boşluklar satırını karşılaştırır.

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

İlkinin doğru (1) ve ikincisi yanlış (0) olduğu için ilgileniyoruz, bu yüzden >⌿isminde bir boole vektörü elde etmek için azaldık a.

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

Şimdi, her 1-s'lik gerginlikte, çiftleri sıfırlamamız gerekiyor, çünkü yan yana iki bükülme olamaz. İlk önce şöyle bir numaralandırma elde ediyoruz:

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

gevşek bir şekilde konuşursak, sonuç kararlı hale gelinceye kadar a[i]ile değiştirerek a[i]*max(a[i-1]+1, a[i]): {⍵⌈a×1+1,¯1↓⍵}⍣≡ve bu mod 2'yi alırız:2|

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

Şimdi bükülmelerin nerede olacağını biliyoruz. Her 1birini sola kopyalıyoruz - 2∨/ (çift olarak "veya"):

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

ve kısmi toplamları hesapla - +\

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

Bu bize başlangıçta ihtiyaç duyduğumuz sütun rotasyon miktarlarını verir. Modulo 4 ima edildi.


Güzel! Adám'dan bile daha kısa 14 byte . Eğer (.. Biz konuşurken emin bunu yapıyoruz değilim, ama durumda değildir;) bir açıklama eklemek Could
Kevin Cruijssen

Açıklamalar yalnızca kendi başınıza nasıl çalıştığını bulma
zevkini ortadan kaldırıyor

1

Perl 5 , 211 bayt

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

Çevrimiçi deneyin!

# Perl 5 , 234 bayt

Kevin'ın işaret ettiği hatayı düzeltti

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

Çevrimiçi deneyin!


Merhaba, test senaryosunu test etmeye çalıştığımda "Can you turn the lights off?" & "Can you try to solve this?"hata alıyorum gibi görünüyor: Modification of non-creatable array value attempted, subscript -1 at .code.tio line 1, <> line 2.Bu bir hata mı, yoksa yanlış bir şey mi yapıyorum? İşte TIO.
Kevin Cruijssen

1
Vosvos. İlk iki karakter aynı olduğunda, bir dizi alt öğesi -1 idi; bu yalnızca dizide veri varsa geçerlidir. 4 bayt daha düzeltildi.
Xcali

0

05AB1E , 31 bayt

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

Port @ETHproductions 'ın Japt cevap , ancak iki küçük farklılıklar ile:
1) Bir 2D karakterlerin listesinin yerine dizeleri listesi olarak girdi alır.
2) counter_variable05AB1E'deki değerler, Japt'deki gibi 11 (veya 3) yerine varsayılan Bolarak 0'dır, bu nedenle harita içinde ek kontrol olarak eklenir (ve sol yerine sağa doğru dönerim ).

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

ζ                  # 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.