单词越过


21

输入:

两个字符串(注意:输入顺序很重要)。

输出:

两个单词/句子都从一行开始,中间有一个空行。他们“水平”“彼此相邻”行走。但是,当他们在同一位置有相同的性格时,他们会互相交叉,然后继续“彼此相邻”行走。

令您困惑?让我们举个例子:

输入: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)。
  • 即使第一个字符相等,我们也总是分开两行(请参见测试用例3和6)。
  • 尾随空格和一条尾随换行符是可选的。
  • 您可以假定输入将仅包含可打印的ASCII字符(不包括换行符和制表符)。
  • 输入是区分大小写的,所以Aa是不相等的,并且不会相交(请参见测试用例7)。
  • 两个输入长度都将始终至少为2。
  • 输入和输出可以采用任何合理的格式。可以是带有换行符的单个String;字符串数组/列表;打印到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 

Answers:


4

Japt56 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⌷⍵}

在线尝试!



@ Mr.Xcoder谢谢。现在应该修复。
阿达姆(Adám)

好的,那很好的解决方案。如果您有时间,也许您可​​以添加一个解释:P
Xcoder先生17年

@ Mr.Xcoder是的,我总是这样做。(如果您看到我的任何无法解释的答案,请给我打电话!)
打电话 Adám17年


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 2217个 210字节

-1字节归功于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]))

在线尝试!


1
1字节(预定义)s=' '
Officialaimm

1
@officialaimm我做了一些更改,现在它具有相同的字节数= /
Rod 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)中。另外,我认为您在解释语句中忘记了一个单词“上/下行的返回空间和中线的¿¿¿ ”。
凯文·克鲁伊森

1
@KevinCruijssen:感谢您发现错误。幸运的是,它很容易修复:从开始即可g 0。关于缺少的单词:“ a”和“ a变量”一样,的确令人困惑,所以我改写了它。
nimi

啊,那a。:) a在指示变量时,我个人在解释中使用了它,尽管通常不用它就足够清楚了。感谢您的澄清,我的确希望有一个非常简单的错误修复程序。
凯文·克鲁伊森

我不确定要如何'在注释中执行“ a”(用反引号代替),这就是我想说的。(因此,我在代码块内对变量使用了反引号。)
凯文·克鲁伊森(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)

取消高尔夫:

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↑⍵创建一个矩阵,例如

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

我们对前者为true(1)和后者为false(0)感兴趣,因此我们用 >⌿以得到名为的布尔向量a

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

现在,在每1 s的拉伸中,我们需要将偶数出现的次数清零,因为彼此之间不会发生两次扭曲。首先,我们获得如下编号:

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∨/ (成对的“或”):

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个字节。您能否添加一个解释(我确定您正在按照我们的说法进行解释,但如果您不这样做,
则为

解释只会带走弄清楚它自己如何工作的乐趣... :)
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。
凯文·克鲁伊森'17

1
臭虫 当前两个字符相同时,数组下标为-1,仅当数组中有数据时才有效。用另外4个字节修复了它。
Xcali

0

05AB1E,31 个字节

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

的港口 @ETHproductions的的Japt答案的,但有两个小的区别:
1)我将输入作为2D字符列表而不是字符串列表。
2)counter_variable默认情况下,05AB1E中的in为0,而不是像BJapt中的in (11)(或3),因此在地图内部将其作为附加检查添加(我向右旋转而不是向左旋转)。

在线尝试验证所有测试用例

说明:

ζ                  # 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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.