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?APL (Dyalog Classic) , 21 Byte
Probieren Sie es online!
Dies ist ein Zug, der dem entspricht
{∊⍵,(⊂⍵)~¨(,\⍺⊂⍨1,2>/⍺⍋⍵)}
⍋
Gibt die Permutation des rechten Arguments⍵
im linken Argument an⍺
1,2>/
Vergleichen Sie aufeinanderfolgende Paare mit>
und stellen Sie eine 1 voran⍺⊂⍨
Verwenden Sie die obige boolesche Maske, um sie⍺
in Gruppen aufzuteilen . Einsen in der Maske markieren den Beginn einer neuen Gruppe,\
kumulative Verkettungen der Gruppen(⊂⍵)~¨
Komplement von jedem in Bezug auf⍵
⍵,
voranstellen⍵
∊
als einzelne Zeichenfolge abflachenquelle
Batch, 155 Bytes
Nimmt das Ziel und den Stapel als Eingaben für STDIN.
quelle
JavaScript (ES6), 54 Byte
Nimmt das Ziel als String und den Stack als Array von Zeichen. Gibt eine Zeichenfolge zurück.
Testfälle
Code-Snippet anzeigen
Wie?
Bei jeder Iteration extrahieren wir das Zeichen
c
oben im Stapel und hängen es an das Endergebnis an. Wir führen dann einen rekursiven Aufruf durch, dessen Parameter vom Ergebnis abhängenc == t[0]
, wot[0]
das nächste erwartete Zeichen ist.Wenn
c
Übereinstimmungent[0]
:c
von der Zielzeichenfolge durch Übergebent.slice(1)
c
aus dem Stapel, indem wirs
unverändert passierenWenn
c
nicht übereinstimmtt[0]
:t.slice(0)
c
am Ende des Stapels zurückquelle
Python 2 , 73 Bytes
Probieren Sie es online!
Ich vermute, das ist sehr gut zum Golfen geeignet.
quelle
Python 2 , 65 Bytes
Probieren Sie es online!
quelle
Haskell ,
4946 BytesProbieren Sie es online!
Ziemlich Einfach. Das linke Argument ist das "Ziel" und das rechte ist der Stapel. Wenn der Kopf des Ziels mit der Spitze des Stapels übereinstimmt, stellen wir ihn voran und wiederholen ihn mit dem Rest des Ziels und des Stapels (ohne den oben liegenden Gegenstand erneut hinzuzufügen). Andernfalls stellen wir das oberste Element voran und wiederholen es mit demselben Ziel, indem wir das oberste Element bis zum Ende des Stapels lesen. Wenn das Ziel leer ist, wählt der Mustervergleich die zweite Zeile und die leere Liste wird zurückgegeben.
BEARBEITEN: -3 Bytes dank @GolfWolf und @Laikoni!
quelle
Sauber , 85 Bytes
Probieren Sie es online!
Definiert die Teilfunktion
f
take[Char]
und[Char]
, wobei das erste Argument das Ziel und das zweite der Stapel ist.quelle
Java 8, 88 Bytes
Eingänge als
char[]
undjava.util.LinkedList<Character>
(java.util.Queue
Implementierung)Erläuterung:
Probieren Sie es online aus.
quelle
> <> ,
3832 BytesEdit: Teal Pelikan hat einen viel besseren
><>
Ansatz hier , dass bei Swaps die EingabemethodenProbieren Sie es online!
Übernimmt die Reihenfolge der Buchstaben durch die
-s
Flag und den Stapel durch die Eingabe.Wie es funktioniert:
quelle
Perl 5 , 42 + 2 (
-pl
) = 44 ByteProbieren Sie es online!
quelle
> <> ,
2116 BytesProbieren Sie es online!
Der Ablauf wurde geändert, um die leeren Bereiche zu nutzen und zusätzliche Code-Umleitungen zu entfernen. (-5 Bytes) - Danke an @JoKing
> <> , 21 Bytes
Probieren Sie es online!
Die andere> <> Antwort finden Sie hier.
Erläuterung
Der Stapel beginnt mit einem ersten Zeichensatz, der das Flag -s verwendet. Die Eingabe ist die vom Benutzer angegebene Zeichenreihenfolge. Diese Erklärung folgt dem Ablauf des Codes.
quelle
Perl, 62 Bytes
Nimmt sein erstes Argument, die Reihenfolge, als Liste von Zeichen und sein zweites, den Stapel, als Zeichenfolge.
Ungolfed:
Sie fragen sich jemals, wofür all diese obskuren Regex-Variablen gedacht waren? Offensichtlich waren sie genau für diese Herausforderung ausgelegt. Wir stimmen mit dem aktuellen Zeichen überein
$x
(das muss leider ausgeblendet werden, falls es sich um ein reguläres Sonderzeichen handelt). Dies teilt die Zeichenfolge zweckmäßigerweise in "vor dem Spiel"$`
, "das Spiel"$&
und "nach dem Spiel" auf$'
. Bei der zyklischen Suche haben wir jeden Charakter vor dem Match klar gesehen und wieder in den Stapel gelegt. Wir haben auch den aktuellen Charakter gesehen, ihn aber nicht zurückgesetzt. Also hängen wir "vor dem Spiel" an die "gesehen" -Liste an$z
und konstruieren den Stack aus "nach dem Spiel" und "vor dem Spiel".quelle
SNOBOL4 (CSNOBOL4) , 98 Bytes
Probieren Sie es online!
Druckt jeden Buchstaben in eine neue Zeile. Verwenden Sie diese Version , um alles in einer Zeile zu drucken. Nimmt die Eingabe als Stapel und dann als Ziel, getrennt durch eine neue Zeile.
quelle
Perl, 44 Bytes
Beinhaltet
+4
für-lF
Geben Sie als Ziel "STDIN" ein und stapeln Sie dann (in umgekehrter Reihenfolge wie in den Beispielen):
Wenn Ihnen eine nachgestellte Zeile nichts ausmacht,
40
funktioniert Folgendes :quelle