交差する言葉


21

入力:

2つの文字列(注:入力の順序は重要です)。

出力:

両方の単語/文は、それらの間に1つの空行がある行で始まります。彼らは水平に「隣り合って」「歩きます」。しかし、同じ位置に同じキャラクターがいる場合、彼らは互いに交差し、「隣同士に」歩き続けます。

混乱する?例を挙げましょう:

入力:Words crossing overDucks 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を参照)。
  • 最初の文字が等しい場合でも、常に2行離れて開始します(テストケース3および6を参照)。
  • 末尾のスペースと単一の末尾の改行はオプションです。
  • 入力には印刷可能なASCII文字のみが含まれると想定できます(改行とタブは除外されます)。
  • 入力は大文字と小文字が区別されるためAa等しくなく、クロスオーバーしません(テストケース7を参照)。
  • 入力長は両方とも常に2以上です。
  • 入力と出力は任意の合理的な形式にすることができます。改行を含む単一の文字列にすることができます。文字列配列/リスト。STDOUTに印刷されます。文字の2D配列。等

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、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

Japt56 47 33バイト

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

オンラインでテストしてください!入力を2つの文字列の配列として受け取ります。

私は完全にバカです... y ®2つの異なる長さの文字列で使用するのは100万倍簡単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 上の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つの同一の文字で始まる場合、2番目ではなく3番目の文字と交差します。これが正しい結果かどうかはわかりませんが、OPに尋ねました。
氏Xcoder

@ Mr.Xcoderありがとう。今すぐ修正する必要があります。
アダム

それではいい解決策です。時間がある場合は、説明を追加できます。P
Mr. Xcoder

@ Mr.Xcoderはい、私はいつもやります。(私の説明のない説明が表示されたら私に
連絡してください

1
@アダムうん確かに...または多分これにも何か関係があるかもしれません...ああ、説明のつかない答えです!または多分2 ...?そして、私はまったく得られない何か
エリックアウトゴルファー

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

パイソン2217の 210バイト

officialaimmのおかげで-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=' '
officialaimm

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)のように、最初の2文字が等しいときに交差を開始するため、小さなバグが1つあるようです。また、説明文の「上/下の行にスペースを戻し、中央の行に¿¿¿」を忘れたと思います。
ケビンCruijssen

1
@KevinCruijssen:バグを見つけてくれてありがとう。幸いなことに、修正は簡単です:で始めg 0ます。欠落している単語について:「a」は「aという名前の変数」と同じですが、それは確かに紛らわしいので、書き直しました。
-nimi

あ、あれa。:)私は個人的にa変数に示すときに説明で使用しますが、通常はそれで十分です。明確化してくれてありがとう、そして私は本当にそれのためのかなり簡単なバグ修正を期待していました。
ケビンCruijssen

方法がわからない(と「」行うには'、私が言いたかった...である、もうコメントにバックティックに置き換えられる)(私が使っだから私のコードブロック内で、変数を周囲にバックティック。)
ケビン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)

ゴルフをしていない:

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行は目的の結果のように見え3↑ます。アルゴリズムの残りの部分は回転量を計算します。

括弧内: 3↑⍵ような行列を作成します

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

そして 2=⌿、その行をペアで比較します。つまり、最初の文字列と2番目の文字列、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

前者がtrue(1)で、後者がfalse(0)であることに関心があるため、withを使用し>⌿て、という名前のブールベクトルを取得します。aます。

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

ここで、1のすべてのストレッチで、2つのねじれが隣り合わせで発生することはないため、偶数の発生をゼロにする必要があります。まず、次のような番号を取得します。

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↓⍵}⍣≡2|

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

これで、ねじれが発生する場所がわかりました。それぞれ1を左にコピーします- 2∨/ (ペアワイズ「または」):

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

これにより、最初に必要な列回転量が得られます。モジュロ4が暗示されています。


いいね!Adámよりも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のバイト

ケビンが指摘したバグを修正

@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です。
ケビンCruijssen

1
バグ。最初の2文字が同じ場合、配列添え字は-1でした。これは、配列にデータがある場合にのみ有効です。さらに4バイト修正しました。
Xcali

0

05AB1E、31 バイト

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

@ETHproductionsのJapt回答のポートですが、2つの小さな違いがあります
。1)入力を文字列のリストではなく、文字の2Dリストとして受け取ります。
2)counter_variable05AB1E のin Japtのような11(または3)ではなく、デフォルトで0 Bであるため、マップ内に追加のチェックとして追加されます(そして、左ではなく右に回転します)。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

ζ                  # 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.