Một mối quan hệ ngược


10

Viết chương trình hoặc hàm, cho hai chuỗi ASCII AB, sẽ tạo ra các chuỗi A'B'trong đó các chuỗi con chung được đảo ngược ở vị trí của chúng. Quá trình tìm kiếm A'như sau:

  1. A' ban đầu trống rỗng.
  2. Nếu ký tự đầu tiên của Alà trong B, tìm tiền tố dài nhất trong Ađó là một chuỗi con của B. Xóa tiền tố này khỏi Avà thêm đảo ngược của nó vào A'.
  3. Nếu không, loại bỏ ký tự đầu tiên này Avà thêm nó vào A'.
  4. Lặp lại các bước 2-3 cho đến khi Atrống.

Việc tìm kiếm B'được thực hiện tương tự.

Thí dụ

Hãy xem xét các chuỗi A = "abc bab"B = "abdabc". Đối với A', đây là những gì xảy ra:

  • A = "abc bab": Ký tự đầu tiên "a"nằm trong B và tiền tố dài nhất của A được tìm thấy trong B là "abc". Chúng tôi xóa tiền tố này khỏi A và thêm đảo ngược của nó "cba"vào A '.
  • A = " bab": Ký tự đầu tiên " "không nằm trong B, vì vậy chúng tôi xóa ký tự này khỏi A và thêm nó vào A '.
  • A = "bab": Ký tự đầu tiên "b"nằm trong B và tiền tố dài nhất của A được tìm thấy trong B là "b". Chúng tôi xóa tiền tố này khỏi A và thêm đảo ngược của nó (vẫn còn "b") vào A '.
  • A = "ab": Ký tự đầu tiên "a"nằm trong B và tiền tố dài nhất của A được tìm thấy trong B là "ab". Chúng tôi xóa tiền tố này khỏi A và thêm đảo ngược của nó "ba"vào A '.
  • A = "": A trống, vì vậy chúng tôi dừng lại.

Như vậy chúng ta có được A' = "cba" + " " + "b" + "ba" = "cba bba". Đối với B ', quy trình tương tự:

B = "abdabc"  ->  "a" in A, remove prefix "ab"
B = "dabc"    ->  "d" not in A, remove "d"
B = "abc"     ->  "a" in A, remove prefix "abc"

Như vậy chúng ta có được B' = "ba" + "d" + "cba" = "badcba".

Cuối cùng, chúng tôi trả lại hai chuỗi, tức là

(A', B') = ("cba bba", "badcba")

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

"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"

Mã ngắn nhất trong byte thắng.


Chúng tôi có cho rằng tất cả đầu vào là chữ thường ASCII? Là đầu ra chính xác dự kiến ​​sẽ giống như "cba bba", "badcba"bao gồm dấu ngoặc kép và dấu phẩy?
admBorkBork

@TimmyD Định dạng đầu vào / đầu ra chính xác là lựa chọn của bạn. Bạn không được cho rằng đầu vào là chữ thường ASCII - nó có thể là bất kỳ ASCII có thể in được.
orlp

Là chuỗi rỗng là một đầu vào hợp pháp?
MtnViewMark 27/8/2015

@MtnViewMark Có.
orlp

Câu trả lời:



2

Haskell, 120 111 byte

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

Chạy thử:

λ: "abc bab"&"abdabc"
("cba bba","badcba")

λ: "abcde"&"abcd bcde"
("dcbae","dcba edcb")

λ: "hello test"&"test banana"
("hello tset","tset banana")

λ: "birds flying high"&"whistling high nerds"
("bisdr flyhgih gni","wihstlhgih gni nesdr")

1

SWI-Prolog, 312 byte

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

Ví dụ: a("birds flying high","whistling high nerds",X,Y).đầu ra

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

Một cách, cách giải pháp quá lâu mà đi quá hiển thị như thế nào verbose Prolog là khi giao dịch với chuỗi. Có thể rút ngắn điều này bằng cách sử dụng mảng mã ( `birds flying high`) thay vì chuỗi ( "birds flying high").


1

Python 2.7, 169 156 152 141 byte

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
 return C

Hàm mlấy 2 chuỗi làm đầu vào. Nó gọi bhàm hai lần để xử lý thực tế theo thông số kỹ thuật.
Demo tại đây .
Kiểm tra nó -

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

NGOÀI RA:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

PS: Nhờ orlp cho giải pháp sử dụng next()


m=lambda A,B:(b(A,B),b(B,A))
orlp

Ngoài ra, bạn có thể thay thế while len(A)>0chỉwhile A . Tương tự if len(p)>0trở thành if p.
orlp

if len(p)cũng có thể là if p. (Đã nói ở trên, nhưng bạn đã bỏ lỡ nó.)
mbomb007

@ mbomb007 Không đọc đúng cách. Chỉ cần thay thế len(p)>0để len(p). Cảm ơn vì điều đó :)
Kamehameha

Thậm chí ngắn hơn : while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:].
orlp
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.