Das Schiff des Theseus ist eine alte Frage, die ungefähr so lautet:
Wenn bei einem Schiff alle Originalteile ausgetauscht wurden, ist es dann immer noch dasselbe Schiff?
Für diesen Golf werden wir langsam "Teile" auf einem "Schiff" ersetzen und sehen, wie lange es dauert, ein ganz neues Schiff zu bekommen.
Aufgabe
Ein Schiff besteht aus mindestens zwei Teilen. Die Teile werden als Array von positiven Ganzzahlen (ungleich Null) angegeben, die den Zustand des Teils darstellen.
Wählen Sie in jedem Zyklus zufällig einen Teil aus der Liste auf einheitliche Weise aus. Der Zustand dieses Teils wird um eins verringert. Wenn der Zustand eines Teils Null erreicht, wird es durch ein neues Teil ersetzt. Das neue Teil beginnt mit demselben Bedingungswert wie das Original.
Halten Sie im ersten Zyklus, in dem alle Teile (mindestens) einmal ausgetauscht wurden, an und geben Sie die Anzahl der Zyklen aus.
Zum Beispiel (nehmen wir an, ich wähle Teile hier zufällig aus):
2 2 3 <- starting part conditions (input)
2 1 3 <- second part reduced
2 1 2 ...
2 1 1
2 2 1 <- second part reduced to zero, replaced
1 2 1
1 2 3 <- third part replaced
1 1 3
2 1 3 <- first part replaced
Die Ausgabe für dieses Beispiel wäre 8
, da es acht Zyklen dauerte, bis alle Teile ausgetauscht waren. Die genaue Ausgabe sollte für jeden Lauf unterschiedlich sein.
I / O.
Die einzige Eingabe ist die Liste / das Array von Ganzzahlen für die Teilbedingung. Die einzige Ausgabe ist eine Anzahl von Zyklen. Sie können diese Werte auf eine der üblichen Arten annehmen / angeben: STDIO, Funktionsargumente / Rückgaben usw.
Testfälle
Da die Ausgabe nicht festgelegt ist, können Sie alles verwenden, was Sie testen möchten. Hier einige Beispiele für Standardisierungszwecke:
1 2 3 4
617 734 248 546 780 809 917 168 130 418
19384 74801 37917 81706 67361 50163 22708 78574 39406 4051 78099 7260 2241 45333 92463 45166 68932 54318 17365 36432 71329 4258 22026 23615 44939 74894 19257 49875 39764 62550 23750 4731 54121 8386 45639 54604 77456 58661 34476 49875 35689 5311 19954 80976 9299 59229 95748 42368 13721 49790
Antworten:
Pyth, 12 Bytes
Demonstration.
Wie es funktioniert:
Dies basiert auf dem unendlichen Filter von Pyth, der einen Ausdruck mit zunehmenden Eingaben testet, bis er etwas Wahres zurückgibt, und dann die Eingabe zurückgibt, die dies verursacht hat. Der zu testende Ausdruck verwendet jedoch nicht den Eingabewert.
Stattdessen ändert der Ausdruck die Eingabeliste, indem er einen zufälligen Eintrag dekrementiert. Dies wird über den Ausdruck erreicht
XOUQQtZ
. Dies bedeutet, den IndexOUQ
in der ListeQ
um zu erhöhentZ
.OUQ
ist ein zufälliger Index in der Länge vonQ
undtZ
ist -1.Q
wird in die Eingabeliste initialisiert.Nachdem
Q
wir auf diese Weise geändert haben, nehmen wir den aktuellen Wert, derX
zurückkehrt, nehmen den maximalen Eintrag miteS
und nehmen das logische Nicht dieses Wertes mit!
. Dies gibt zum ersten Mal einen Wahrheitswert zurück, wenn jedes Element von zum ersten MalQ
auf0
oder unter reduziert wurde.Um sicherzustellen, dass die zurückgegebene Nummer genau der Häufigkeit entspricht,
Q
mit der sie geändert wurde, beginnen wir mit der Zählung und geben an1
, dass beim ersten Aufruf 1 Änderung vorgenommen wurde.Q
Schauen Sie sich die Version hier an , um zu sehen, wie sie nach jeder Iteration des Codes aussieht .quelle
GolfScript (
2624 Byte) / CJam (2018 Byte)GolfScript:
Online-Demo
CJam (gleiche Idee, aber etwas andere Implementierung):
Online-Demo
Die Eingabe erfolgt stdin im Formular
[2 2 3]
.Dies ist eine der seltenen Situationen, in denen der Entfaltungsoperator von GolfScript nützlich ist. Es ermöglicht uns, die Zustände, durch die das Schiff fährt, zu akkumulieren und am Ende zu zählen. Beachten Sie, dass das gezählte Array den Anfangszustand (Eingabezustand) enthält, nicht jedoch den Endzustand, in dem das letzte Element auf 0 reduziert wurde.
Doch obwohl CJam hat nicht entfalten ihre Fähigkeit , für viele eine Reihe einheitlich für nur 2 Zeichen zählt zu mischen und ermöglicht es oben zu kommen.
quelle
Python 3,
9171 Bytes20 (!) Bytes dank @xnor gespeichert.
Rekursive Funktion, die sich mit kleineren Stückwerten aufruft, bis alle Stückwerte 0 oder negativ sind und jede Funktion den Rückgabewert ihres untergeordneten Elements + 1 zurückgibt und die zuletzt aufgerufene 1 zurückgibt.
quelle
max(p)>0
.max(p)<1or-~f(p)
Sie die Bedingung negieren, können Sie das vermeidenor 1
, daTrue==1
.p
mit effektiv dekrementierenshuffle(p);p[0]-=1
.Python 3, 175 Bytes
Nicht besonders gut Golf gespielt .
Probieren Sie es hier online aus
quelle