Theseus 'neues Schiff

9

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
Geobits
quelle
1
Vermisse ich etwas oder spielt es keine Rolle, dass ein Teil, wenn es 0 erreicht, durch ein neues Teil ersetzt wird?
xnor
@xnor Nun, es ist egal, die Antwort zu bekommen, nein (und es scheint das Richtige zu sein, um sie zu überspringen). Aber thematisch müssen die Schiffsteile ersetzt werden: P
Geobits

Antworten:

4

Pyth, 12 Bytes

f!eSXOUQQtZ1

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 Index OUQin der Liste Qum zu erhöhen tZ. OUQist ein zufälliger Index in der Länge von Qund tZist -1. Qwird in die Eingabeliste initialisiert.

Nachdem Qwir auf diese Weise geändert haben, nehmen wir den aktuellen Wert, der Xzurückkehrt, nehmen den maximalen Eintrag mit eSund nehmen das logische Nicht dieses Wertes mit !. Dies gibt zum ersten Mal einen Wahrheitswert zurück, wenn jedes Element von zum ersten Mal Qauf 0oder unter reduziert wurde.

Um sicherzustellen, dass die zurückgegebene Nummer genau der Häufigkeit entspricht, Qmit der sie geändert wurde, beginnen wir mit der Zählung und geben an 1, dass beim ersten Aufruf 1 Änderung vorgenommen wurde. QSchauen Sie sich die Version hier an , um zu sehen, wie sie nach jeder Iteration des Codes aussieht .

isaacg
quelle
5

GolfScript ( 26 24 Byte) / CJam ( 20 18 Byte)

GolfScript:

~{$)*}{.,rand{(+}*((+}/,

Online-Demo

CJam (gleiche Idee, aber etwas andere Implementierung):

q~{_mr((+_$)*}g;],

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.

Peter Taylor
quelle
3

Python 3, 91 71 Bytes

20 (!) Bytes dank @xnor gespeichert.

from random import*
def f(p):shuffle(p);p[0]-=1;return max(p)<1or-~f(p)

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.

randomra
quelle
Sie können mit überprüfen, ob eine positive Zahl vorhanden ist max(p)>0.
xnor
Und wenn max(p)<1or-~f(p)Sie die Bedingung negieren, können Sie das vermeiden or 1, da True==1.
xnor
Sie können ein zufälliges Element von pmit effektiv dekrementieren shuffle(p);p[0]-=1.
xnor
@xnor Wow, danke! Das sind alles tolle!
Randomra
1

Python 3, 175 Bytes

import random
p,t=input().split(),0;f,r=[int(i)for i in p],[0]*len(p)
while 0 in r:
 f[random.randint(0,len(f)-1)]-=1;t+=1
 for x in range(len(f)):
  r[x]=int(f[x]<1)
print(t)

Nicht besonders gut Golf gespielt .

Probieren Sie es hier online aus

Tim
quelle
Selbstzerstörungskommentar
Tim