Từ ngữ vượt qua


21

Đầu vào:

Hai chuỗi (LƯU Ý: thứ tự đầu vào là quan trọng).

Đầu ra:

Cả hai từ / câu bắt đầu trên các dòng với một dòng trống ở giữa chúng. Họ 'đi bộ' theo chiều ngang 'cạnh nhau'. Nhưng khi chúng có cùng một nhân vật ở cùng một vị trí, chúng giao nhau và sau đó tiếp tục đi 'cạnh nhau'.

Bạn bối rối nói gì? Hãy cho một ví dụ:

Đầu vào: Words crossing over& Ducks quacking:

Word  quack n 
    s      i g
Duck  cross n  over

Như bạn có thể thấy, đây là những đường dẫn:
Xin lỗi vì sơn MS xấu ..

Quy tắc thử thách:

  • Trước tiên, chúng tôi luôn quay lại đi trên một đường thẳng sau khi chúng tôi 'vượt qua' trước khi chúng tôi có thể vượt qua một lần nữa (xem trường hợp thử nghiệm ở trên {1} - nơi ingbằng nhau, nhưng sau khi chúng tôi tiếp tục i, trước tiên chúng tôi phải quay lại đi thẳng (do đó bỏ qua n), trước khi chúng ta có thể đi qua lại g).
  • Các đầu vào có thể có độ dài khác nhau, trong trường hợp đó, đầu vào dài hơn tiếp tục đi trên một đường thẳng (xem các trường hợp thử nghiệm 1, 2, 4 & 6).
  • Cả hai đầu vào có thể giống nhau (xem trường hợp thử nghiệm 3).
  • Các đầu vào sẽ không chứa bất kỳ tab nào cũng như dòng mới.
  • Các không gian được bỏ qua dưới dạng các ký tự giống nhau (như trường hợp cạnh) , trong trường hợp đó, ký tự tiếp theo (không phải khoảng trắng ) sau đó - nếu có - sẽ thay thế (xem trường hợp kiểm tra 3, 5 & 6).
  • Các đầu vào có thể không có ký tự liền kề (không phải khoảng trắng) trên cùng một vị trí, trong trường hợp cả hai chỉ đi theo một đường thẳng theo chiều ngang (xem trường hợp thử nghiệm 2).
  • Ngay cả khi ký tự đầu tiên bằng nhau, chúng ta luôn bắt đầu cách nhau hai dòng (xem trường hợp thử nghiệm 3 & 6).
  • Không gian lưu trữ và một dòng mới duy nhất là tùy chọn.
  • Bạn có thể giả sử các đầu vào sẽ chỉ chứa các ký tự ASCII có thể in được (loại trừ các dòng và tab mới).
  • Các đầu vào phân biệt chữ hoa chữ thường, vì vậy Aakhông bằng nhau và sẽ không giao nhau (xem trường hợp thử nghiệm 7).
  • Cả hai độ dài đầu vào sẽ luôn luôn có ít nhất 2.
  • Đầu vào và đầu ra có thể ở bất kỳ định dạng hợp lý. Có thể là một Chuỗi đơn với các dòng mới; một chuỗi-mảng / danh sách; in ra STDOUT; Mảng 2D của các nhân vật; v.v.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm:

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 

Câu trả lời:


4

Japt , 56 47 33 byte

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

Kiểm tra nó trực tuyến! Lấy đầu vào là một mảng của hai chuỗi.

Tôi là một kẻ ngốc hoàn toàn ... y ®dễ sử dụng hơn hai triệu lần trên hai chuỗi có độ dài khác nhau so với U¬íV¬@...

Giải trình

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 là một biến theo dõi trạng thái chúng ta đang ở:

  • B % 4 == 0 có nghĩa là từ đầu tiên trên đầu, nhưng sẵn sàng để chuyển đổi;
  • B % 4 == 1 có nghĩa là chúng ta vừa chuyển đổi;
  • B % 4 == 2 có nghĩa là từ thứ hai trên đầu, nhưng sẵn sàng để chuyển đổi;
  • B % 4 == 3 có nghĩa là chúng tôi vừa chuyển trở lại.

Bxảy ra để được đặt trước 11; kể từ đó 11 % 4 == 3, cột đầu tiên luôn có từ đầu tiên trên đầu trang. Chúng tôi tăng Bbất cứ khi nào các từ hoán đổi vị trí, hoặc bất cứ lúc nào nó lẻ (với B=c2).


6

APL (Dyalog) , 64 byte

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

Hãy thử trực tuyến!



@ Mr.Xcoder Cảm ơn. Nên sửa ngay.
Adám

Ok, giải pháp tốt đẹp rồi. Nếu bạn có thời gian, có lẽ bạn có thể thêm một lời giải thích: P
Ông Xcoder

@ Mr.Xcoder Có, tôi luôn làm thế. (Ping tôi nếu bạn thấy bất kỳ câu trả lời không giải thích được của tôi!)
Adám

1
@ Adám Vâng chắc chắn ... hoặc có thể ? Có thể có một cái gì đó để làm với điều này là tốt ... oh và một câu trả lời không giải thích được ! Hay có lẽ hai ...? Và một cái gì đó tôi không hoàn toàn nhận được .
Erik the Outgolfer

4

Than , 69 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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 byte

-1 byte nhờ chính thức

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

Hãy thử trực tuyến!


1
1 byte bằng cách xác định trướcs=' '
chính thức tuyên bố

1
@officialaimm Tôi đã thực hiện một số thay đổi, bây giờ nó có cùng số byte = /
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]]

Hãy thử trực tuyến!

Làm thế nào nó hoạt động:

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 câu trả lời hay. Tuy nhiên, nó dường như có một lỗi nhỏ, vì bây giờ nó bắt đầu giao nhau khi hai ký tự đầu tiên bằng nhau, như trong các thử nghiệm 3, 6 và 8 ( TIO ). Ngoài ra, tôi nghĩ rằng bạn đã quên một từ trong câu giải thích của mình "trả lại không gian cho dòng trên / dưới và ¿cho dòng giữa ".
Kevin Cruijssen

1
@KevinCruijssen: Cảm ơn bạn đã tìm ra lỗi. May mắn thay, nó rất dễ sửa chữa: chỉ cần bắt đầu với g 0. Về từ còn thiếu: "a" như trong "biến có tên là a", nhưng điều đó thực sự khó hiểu, vì vậy tôi đã sắp xếp lại nó.
nimi

Ah, đó a. :) Cá nhân tôi sử dụng atrong các giải thích của mình khi chỉ ra các biến, mặc dù thông thường nó đủ rõ ràng mà không có. Cảm ơn đã làm rõ, và tôi thực sự mong đợi một sửa lỗi khá dễ dàng cho nó.
Kevin Cruijssen

Không chắc chắn cách thực hiện 'a' (với 'việc được thay thế bằng dấu kiểm ngược) trong một nhận xét nữa, đó là điều tôi muốn nói .. (Vì vậy, tôi sử dụng dấu kiểm ngược xung quanh các biến, bên trong các khối mã của mình.)
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)

Ung dung:

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

Các trường hợp thử nghiệm:


1

APL (Dyalog) , 50 byte

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

Hãy thử trực tuyến!

⍵⍀⍨¯1*⍳4 đưa ra ma trận:

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

(các dấu chấm đại diện cho không gian). Các cột của nó sẽ được xoay theo số lượng khác nhau để ba hàng đầu tiên kết thúc giống như kết quả mong muốn - do đó 3↑gần đầu. Phần còn lại của thuật toán tính toán số lượng vòng quay.

Trong parens: 3↑⍵tạo một ma trận như

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

2=⌿so sánh các hàng của nó theo cặp, tức là chuỗi thứ nhất với chuỗi thứ hai và chuỗi thứ hai so với hàng không gian.

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

Chúng tôi quan tâm đến nơi cái trước là đúng (1) và cái sau sai (0), vì vậy chúng tôi giảm bớt >⌿để có được một vectơ boolean có tên a.

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

Bây giờ, cứ sau 1 giây chúng ta cần loại bỏ các số chẵn vì không có hai vòng xoắn nào có thể xảy ra cạnh nhau. Đầu tiên chúng ta có được một số như:

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

bởi, nói một cách lỏng lẻo, thay thế a[i]bằng a[i]*max(a[i-1]+1, a[i])cho đến khi kết quả ổn định: {⍵⌈a×1+1,¯1↓⍵}⍣≡, và chúng tôi đi mà mod 2:2|

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

Bây giờ chúng ta biết nơi xoắn sẽ xảy ra. Chúng tôi sao chép từng 1cái sang trái - 2∨/ (cặp "hoặc"):

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

và tính tổng một phần - +\

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

Điều đó mang lại cho chúng tôi số tiền luân chuyển cột mà chúng tôi cần lúc đầu. Modulo 4 được ngụ ý.


Tốt đẹp! Thậm chí ngắn hơn 14 byte so với Adám . Bạn có thể thêm một lời giải thích (tôi chắc chắn rằng bạn đang thực hiện nó như chúng ta nói, nhưng trong trường hợp bạn không ..;)
Kevin Cruijssen

Giải thích chỉ lấy đi niềm vui khi tìm ra cách nó hoạt động theo cách riêng của bạn ... :)
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''}

Hãy thử trực tuyến!

# Perl 5 , 234 byte

Sửa lỗi Kevin chỉ ra

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

Hãy thử trực tuyến!


Xin chào, khi tôi thử kiểm tra trường hợp kiểm tra, "Can you turn the lights off?" & "Can you try to solve this?"tôi dường như đang gặp lỗi: Modification of non-creatable array value attempted, subscript -1 at .code.tio line 1, <> line 2.Đây có phải là lỗi không, hoặc tôi đang làm gì đó không đúng? Đây là TIO.
Kevin Cruijssen

1
Lỗi. Khi hai ký tự đầu tiên giống nhau, một chỉ số mảng là -1, chỉ hợp lệ nếu có dữ liệu trong mảng. Đã sửa nó với 4 byte nữa.
Xcali

0

05AB1E , 31 byte

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

Cảng @ETHproductions 's Japt câu trả lời , nhưng với hai sự khác biệt nhỏ:
1) Tôi lấy đầu vào như một danh sách 2D của nhân vật thay vì danh sách các chuỗi.
2) Theo counter_variablemặc định, 05AB1E là 0, thay vì 11 (hoặc 3) như Btrong Japt, vì vậy được thêm vào dưới dạng kiểm tra bổ sung bên trong bản đồ (và tôi xoay về bên phải thay vì bên trái).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ζ                  # 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.