Bulgarian Solitaire ist ein Einzelspielerspiel, das Martin Gardner in seiner mathematischen Kolumne in Scientific American bekannt gemacht hat .
Sie haben N
identische Karten, die in Stapel aufgeteilt sind. Sie nehmen eine Karte von jedem Stapel und bilden mit den entfernten Karten einen neuen Stapel. Sie wiederholen diesen Vorgang, bis Sie einen Zustand erreicht haben, den Sie bereits gesehen haben. Wenn Sie also fortfahren, wird die Schleife wiederholt.
Angenommen, Sie haben 8
Karten, die in einen Stapel 5
und einen Stapel aufgeteilt sind 3
. Wir schreiben die Stapelgrößen in absteigender Reihenfolge : 5 3
. Hier ist eine Abschrift des Spiels:
5 3
4 2 2
3 3 1 1
4 2 2
Sie entfernen zuerst eine Karte von jedem der beiden Stapel, wobei Stapel von 4
und 2
und ein neu erstellter Stapel von 2
Geben übrig bleiben 4 2 2
. Im nächsten Schritt verringern sich diese, 3 1 1
gefolgt von einem neuen Stapel von 3
. Schließlich leert der letzte Schritt die Stapel von Größe 1
und produziert, 4 2 2
was bereits erschienen ist, also hören wir auf.
Beachten Sie, dass die Summe der Stapelgrößen gleich bleibt.
Ihr Ziel ist es, eine solche Abschrift des Spiels aus einer bestimmten Startkonfiguration zu drucken. Dies ist Code Golf, also gewinnen die wenigsten Bytes.
Eingang
Eine Liste positiver Zahlen in absteigender Reihenfolge, die die anfänglichen Stapelgrößen darstellt. Eingabe über STDIN oder Funktionseingabe. Sie können jede gewünschte listenartige Struktur verwenden.
Sie erhalten nicht die Gesamtzahl der Karten N
als Eingabe.
Ausgabe
Drucken Sie die Reihenfolge der Stapelgrößen aus, die das Spiel des bulgarischen Solitaire durchläuft. Beachten Sie, dass ein Druck erforderlich ist und nicht zurückgegeben wird. Jeder Schritt sollte eine eigene Zeile sein.
Jede Zeile sollte eine Folge positiver Zahlen in absteigender Reihenfolge ohne Nein enthalten 0
. Möglicherweise haben Sie Trennzeichen und Start- und End-Token (z. B. [3, 3, 1, 1]
). Die Zahlen können mehrere Ziffern haben, daher sollten sie irgendwie getrennt werden.
Drucken Sie die angezeigten Stapelaufteilungen bis einschließlich einer Wiederholung. Die erste Zeile sollte also die Eingabe sein, und die letzte Zeile sollte eine Wiederholung einer vorherigen Zeile sein. Es sollte keine anderen Wiederholungen geben.
Testfälle
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
mitQ
. 2. Wenn Sie die Liste in absteigender Reihenfolge speichern, brauchen Sie überhaupt nichtN
:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. Es ist genau das gleiche, Charakter für Charakter, bis hin zur Kommutativität.CJam, 26 Bytes
Probieren Sie es online aus.
Beispiellauf
quelle
:p
funktioniert, könnte ich ...:p
Ruby, 98
Erläuterung
Array
.Hash
g
.Array#map
, verringern Sie jedes Element um 1, addieren Sie die Länge desArray
Elements als Element, sortieren Sie es in absteigender Reihenfolge und löschen Sie das Element0
.g
ein Schlüssel für den neuen Spielstatus vorhanden ist.quelle
sort_by
sort.reverse
CJam,
35 3433 Bytes(Verdammt, dieser Stromausfall, den ich nicht als erster in CJam gepostet habe)
Eingang:
Ausgabe:
Probieren Sie es hier online aus
quelle
Python 2 - 103
Ähnlich wie die Antwort von Quincunx, ersetzt jedoch Anhänge durch Hinzufügen und entfernt die letzten beiden Zeilen.
Beispielausgabe:
quelle
GolfScript,
5046Kann mit ziemlicher Sicherheit weiter Golf gespielt werden. Probieren Sie es hier aus.
quelle
Haskell, 99
quelle
CJam,
403634 BytesTesten Sie es hier. Geben Sie die Eingabe als Array im CJam-Stil
[5 3]
in das Feld STDIN ein. Das Ausgabeformat ist ähnlich, daher eckige Klammern und Leerzeichen als Trennzeichen.Selbst wenn ich dies weiter unten Golf spiele (was definitiv möglich ist), gibt es keine Möglichkeit, Pyth damit zu schlagen. Vielleicht ist es Zeit, J. zu lernen. Erklärung kommt später.
quelle
JavaScript (E6) 113
Schlechtester Eintrag bisher :(
Test in der FireFox / FireBug-Konsole
Ausgabe
quelle
Python 2,
148130101Dies merkt sich einfach alle vorherigen Iterationen und prüft, ob die neue in dieser Liste enthalten ist. Dann druckt es es aus.
Probelauf:
Eingang:
Ausgabe:
Bearbeiten: Ich habe die Spezifikationen zum Golf noch einmal gelesen und viel Golf gespielt.
quelle
[4,2,2]
. Es gibt jedoch eine einfache Lösung.Python 3: 89 Zeichen
Ähnlich wie die bereits veröffentlichten Python-Lösungen, jedoch mit rekursiven Funktionsaufrufen anstelle von Schleifen. In der Liste
s
werden die bereits gesehenen Teilungen gespeichert und die Rekursion im Falle einer Wiederholung kurzgeschlossen.Die Funktion
print()
(dies ist Python 3) muss nur irgendwie in jeder Schleife aufgerufen werden. Das Knifflige ist, dass alambda
nur einen einzigen Ausdruck zulässt, also können wir das nichtprint(l);...
. Außerdem gibt es Ausgaben ausNone
, mit denen schwer zu arbeiten ist.print(l)
Am Ende stelle ich eine Ungleichheit auf die Seite;==
funktioniert aus irgendeinem Grund nicht, den ich nicht verstehe.Ein alternativer Ansatz zum Einfügen in eine Liste verwendet gleich viele Zeichen.
Die Verwendung
print(*l)
würde die Ausgaben4 2 2
eher wie als formatieren[4,2,2]
.quelle