Eine Rückwärtsbeziehung

10

Schreiben Sie ein Programm oder eine Funktion, die bei zwei ASCII-Zeichenfolgen Aund BZeichenfolgen erzeugt A'und B'deren gemeinsame Teilzeichenfolgen an ihrer Stelle umgekehrt werden. Der Prozess zum Finden A'ist wie folgt:

  1. A' ist anfangs leer.
  2. Wenn das erste Zeichen von in Aist B, suchen Sie das längste Präfix, Adessen Teilzeichenfolge von ist B. Entfernen Sie dieses Präfix aus Aund fügen Sie seine Umkehrung hinzu A'.
  3. Entfernen Sie andernfalls dieses erste Zeichen aus Aund fügen Sie es hinzu A'.
  4. Wiederholen Sie die Schritte 2-3, bis sie Aleer sind.

Das Finden B'erfolgt ähnlich.

Beispiel

Betrachten wir die Zeichenfolgen A = "abc bab"und B = "abdabc". Denn A'genau das passiert:

  • A = "abc bab": Das erste Zeichen "a"steht in B und das längste Präfix von A in B ist "abc". Wir entfernen dieses Präfix von A und fügen seine Umkehrung "cba"zu A 'hinzu.
  • A = " bab": Das erste Zeichen " "ist nicht in B, also entfernen wir dieses Zeichen aus A und fügen es A 'hinzu.
  • A = "bab": Das erste Zeichen "b"steht in B und das längste Präfix von A in B ist "b". Wir entfernen dieses Präfix von A und fügen seine Umkehrung (die noch ist "b") zu A 'hinzu.
  • A = "ab": Das erste Zeichen "a"steht in B und das längste Präfix von A in B ist "ab". Wir entfernen dieses Präfix von A und fügen seine Umkehrung "ba"zu A 'hinzu.
  • A = "": A ist leer, also hören wir auf.

So bekommen wir A' = "cba" + " " + "b" + "ba" = "cba bba". Für B 'ist der Prozess ähnlich:

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

So bekommen wir B' = "ba" + "d" + "cba" = "badcba".

Schließlich geben wir die beiden Zeichenfolgen zurück, dh

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

Testfälle

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

Der kürzeste Code in Bytes gewinnt.

orlp
quelle
Nehmen wir an, dass alle Eingaben ASCII in Kleinbuchstaben sind? Wird erwartet, dass die genaue Ausgabe "cba bba", "badcba"Anführungszeichen und Komma enthält?
AdmBorkBork
@TimmyD Das genaue Eingabe- / Ausgabeformat ist Ihre Wahl. Sie können nicht davon ausgehen, dass die Eingabe ASCII in Kleinbuchstaben ist - es kann sich um jede druckbare ASCII-Eingabe handeln.
Orlp
Ist die leere Zeichenfolge eine legale Eingabe?
MtnViewMark
@MtnViewMark Ja.
Orlp

Antworten:

1

Pyth, 29 Bytes

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

Kabelbaum testen.

Das Eingabeformat ist:

abc bab
"abdabc"

Ausgabe ist:

cba bba
badcba
isaacg
quelle
2

Haskell, 120 111 Bytes

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

Testläufe:

λ: "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
quelle
1

SWI-Prolog, 312 Bytes

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

Beispiel: a("birds flying high","whistling high nerds",X,Y).Ausgänge

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

Eine Art und Weise, Art und Weise zu langer Lösung , die wie zu zeigen , geht die ausführlichen Prolog ist , wenn sie mit Strings zu tun. Es könnte möglich sein, dieses Ding mit Codes arrays ( `birds flying high`) anstelle von strings ( "birds flying high") zu verkürzen .

Fatalisieren
quelle
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

Die Funktion verwendet mdie 2 Zeichenfolgen als Eingabe. Sie ruft die bFunktion zweimal auf und führt die eigentliche Verarbeitung gemäß den Spezifikationen durch.
Demo hier .
Testen -

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

AUSGÄNGE:

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

PS: Danke an orlp für die Lösung mit next()

Kamehameha
quelle
m=lambda A,B:(b(A,B),b(B,A))
Orlp
Auch können Sie while len(A)>0mit nur ersetzen while A. Ähnlich if len(p)>0wird if p.
Orlp
if len(p)kann auch sein if p. (Bereits oben gesagt, aber Sie haben es verpasst.)
mbomb007
@ mbomb007 Hat es nicht richtig gelesen. Gerade ersetzt len(p)>0zu len(p). Danke dafür :)
Kamehameha
Noch kürzer : 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