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 aecdb
anhand des Stapels finden daceb
:
Top of Stack d
: Nicht das, was wir suchen ( a
), so dass wir es mit der Sequenz hinzufügen: d
und drehen Sie den Stapel erhalten: acebd
.
Stapeloberseite a
: Ja! Also fügen wir es der Sequenz hinzu: da
und entfernen es vom Stapel:cebd
.
Top of Stack c
: Nicht das, was wir suchen ( e
), so dass wir es mit der Sequenz hinzufügen: dac
und drehen Sie den Stapel erhalten: ebdc
.
Stapeloberseite e
: Ja! so dass wir es mit der Sequenz hinzufügen: dace
und 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: daceb
und 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: dacebd
und drehen Sie den Stapel erhalten: cbd
.
Stapeloberseite c
: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdc
und 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: dacebdcb
und drehen Sie den Stapel erhalten: db
.
Stapeloberseite d
: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdcbd
und entfernen Sie sie aus dem Stapel: b
.
Stapeloberseite b
: Ja! so dass wir es mit der Sequenz hinzufügen: dacebdcbdb
und 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
99
konkret?