Hintergrund
Basierend auf einem Spiel, das mein Vierjähriger von seinem Rabbiner bekommen hat.
Das "Ziel" ist es, die Buchstaben in einer bestimmten Reihenfolge "zu finden", z aecdb. Sie erhalten einen Stapel Briefkarten, zdaceb . Sie können den Stapel nur in der angegebenen Reihenfolge durchsuchen, wenn auch zyklisch. Wenn Sie einen Brief finden, den Sie brauchen, nehmen Sie diesen aus dem Stapel.
Zielsetzung
Suchen Sie bei gegebener Reihenfolge und einem Stapel (duplikationsfreie Permutationen) die Reihenfolge der obersten Stapelbuchstaben (alles druckbare ASCII-Zeichen), die Sie während des Spiels sehen.
Beispiel Schritt für Schritt
Wir müssen die Reihenfolge aecdbanhand des Stapels finden daceb:
Top of Stack d: Nicht das, was wir suchen ( a), so dass wir es mit der Sequenz hinzufügen: dund drehen Sie den Stapel erhalten: acebd.
Stapeloberseite a: Ja! Also fügen wir es der Sequenz hinzu: daund entfernen es vom Stapel:cebd.
Top of Stack c: Nicht das, was wir suchen ( e), so dass wir es mit der Sequenz hinzufügen: dacund drehen Sie den Stapel erhalten: ebdc.
Stapeloberseite e: Ja! so dass wir es mit der Sequenz hinzufügen: daceund entfernen Sie sie aus dem Stapel: bdc.
Top of Stack b: Nicht das, was wir suchen ( c), so dass wir es mit der Sequenz hinzufügen: dacebund drehen Sie den Stapel erhalten: dcb.
Top of Stack d: Nicht das, was wir suchen ( c), so dass wir es mit der Sequenz hinzufügen: dacebdund drehen Sie den Stapel erhalten: cbd.
Stapeloberseite c: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdcund entfernen Sie sie aus dem Stapel: bd.
Top of Stack b: Nicht das, was wir suchen ( d), so dass wir es mit der Sequenz hinzufügen: dacebdcbund drehen Sie den Stapel erhalten: db.
Stapeloberseite d: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdcbdund entfernen Sie sie aus dem Stapel: b.
Stapeloberseite b: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdcbdbund entfernen Sie sie aus dem Stapel: .
Und wir sind fertig. Das Ergebnis ist dacebdcbdb.
Referenzimplementierung
def letters(target, stack):
string = ''
while stack:
string += stack[0]
if stack[0] == target[0]:
stack.pop(0)
target = target[1:]
else:
stack.append(stack.pop(0))
return string
print letters('aecdb', list('daceb'))
Testfälle
try, yrt→yrtyry
1234, 4321→4321432434
ABCDEFGHIJKLMNOPQRSTUVWXYZ, RUAHYKCLQZXEMPBWGDIOTVJNSF→RUAHYKCLQZXEMPBWGDIOTVJNSFRUHYKCLQZXEMPWGDIOTVJNSFRUHYKLQZXEMPWGIOTVJNSFRUHYKLQZXMPWGIOTVJNSRUHYKLQZXMPWIOTVJNSRUYKLQZXMPWOTVNSRUYQZXPWOTVSRUYQZXPWTVSRUYQZXWTVSRUYZXWTVSUYZXWTVUYZXWVYZXWYZXYZ
?, ?→?
a, a →a a
abcd, abcd→abcd
99konkret?