Hubungan mundur

10

Tulis program atau fungsi yang, diberi dua string ASCII Adan B, akan menghasilkan string A'dan di B'mana substring umum dibalikkan di tempatnya. Proses untuk menemukan A'adalah sebagai berikut:

  1. A' awalnya kosong.
  2. Jika karakter pertama Aadalah dalam B, temukan awalan terpanjang Ayang merupakan substring dari B. Hapus awalan ini dari Adan tambahkan pembalikannya ke A'.
  3. Jika tidak, hapus karakter pertama ini dari Adan tambahkan ke A'.
  4. Ulangi langkah 2-3 hingga Akosong.

Menemukan B'dilakukan dengan cara yang sama.

Contoh

Mari kita pertimbangkan senar A = "abc bab"dan B = "abdabc". Sebab A', inilah yang terjadi:

  • A = "abc bab": Karakter pertama "a"dalam B dan awalan terpanjang dari A ditemukan di B adalah "abc". Kami menghapus awalan ini dari A dan menambahkan pembalikannya "cba"ke A '.
  • A = " bab": Karakter pertama " "tidak dalam B, jadi kami menghapus karakter ini dari A dan menambahkannya ke A '.
  • A = "bab": Karakter pertama "b"dalam B dan awalan terpanjang dari A ditemukan di B adalah "b". Kami menghapus awalan ini dari A dan menambahkan pembalikannya (yang masih "b") ke A '.
  • A = "ab": Karakter pertama "a"dalam B dan awalan terpanjang dari A ditemukan di B adalah "ab". Kami menghapus awalan ini dari A dan menambahkan pembalikannya "ba"ke A '.
  • A = "": A kosong, jadi kami berhenti.

Demikian kita dapatkan A' = "cba" + " " + "b" + "ba" = "cba bba". Untuk B ', prosesnya mirip:

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

Demikian kita dapatkan B' = "ba" + "d" + "cba" = "badcba".

Akhirnya, kami mengembalikan dua string, yaitu

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

Uji kasus

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

Kode terpendek dalam byte menang.

orlp
sumber
Apakah kita menganggap semua input adalah huruf kecil ASCII? Apakah output yang tepat diharapkan mirip dengan "cba bba", "badcba"menyertakan tanda kutip dan koma?
AdmBorkBork
@TimmyD Format input / output yang tepat adalah pilihan Anda. Anda tidak boleh berasumsi bahwa inputnya adalah ASCII huruf kecil - bisa saja ASCII yang bisa dicetak
orlp
Apakah string kosong merupakan input hukum?
MtnViewMark
@ MTnViewMark Ya.
orlp

Jawaban:

1

Pyth, 29 byte

M&G+_Je|f}TH._GhGg.-GJHgzQgQz

Uji Harness.

Format input adalah:

abc bab
"abdabc"

Output adalah:

cba bba
badcba
isaacg
sumber
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

Tes berjalan:

λ: "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")
MtnViewMark
sumber
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).

Contoh: a("birds flying high","whistling high nerds",X,Y).keluaran

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

Sebuah cara, cara solusi terlalu lama yang masuk terlalu menunjukkan bagaimana verbose Prolog adalah ketika berhadapan dengan string. Dimungkinkan untuk mempersingkat hal ini menggunakan array kode ( `birds flying high`) alih-alih string ( "birds flying high").

Fatalisasi
sumber
1

Python 2.7, 169 156 152 141 Bytes

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

Fungsi mmengambil 2 string sebagai input. Ini memanggil bfungsi dua kali yang melakukan pemrosesan aktual sesuai dengan spesifikasi.
Demo di sini .
Mengujinya -

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

OUTPUT:

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

PS: Terima kasih kepada orlp untuk solusi yang digunakan next()

Kamehameha
sumber
m=lambda A,B:(b(A,B),b(B,A))
orlp
Anda juga bisa menggantinya while len(A)>0dengan adil while A. Demikian pula if len(p)>0menjadi if p.
orlp
if len(p)bisa juga if p. (Sudah dikatakan di atas, tetapi Anda melewatkannya.)
mbomb007
@ mbomb007 Tidak membacanya dengan benar. Baru diganti len(p)>0menjadi len(p). Terima kasih untuk itu :)
Kamehameha
Bahkan lebih pendek: 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