Nutzungsbedingungen
Ein Wurm ist eine Liste von nichtnegativen ganzen Zahlen und sein rechtes (dh letztes ) Element heißt head . Wenn der Kopf nicht 0 ist, hat der Wurm ein aktives Segment, das aus dem längsten zusammenhängenden Elementblock besteht, der den Kopf enthält, und dessen Elemente mindestens so groß sind wie der Kopf . Das reduzierte aktive Segment ist das aktive Segment, dessen Kopf um 1 dekrementiert wurde. Beispielsweise hat der Wurm 3 1 2 3 2
ein aktives Segment 2 3 2
und das reduzierte aktive Segment ist 2 3 1
.
Regeln der Evolution
Ein Wurm entwickelt sich Schritt für Schritt wie folgt:
In Schritt t (= 1, 2, 3, ...),
wenn der Kopf 0 ist: lösche den Kopf
sonst: ersetze das aktive Segment durch t + 1 verkettete Kopien des reduzierten aktiven Segments.
Fakt : Jeder Wurm entwickelt sich irgendwann zu einer leeren Liste , und die Anzahl der dazu erforderlichen Schritte ist die Lebensdauer des Wurms .
(Details finden Sie in The Worm Principle , einem Artikel von LD Beklemishev. Die Verwendung von "list" als endliche Sequenz und "head" als letztes Element ist diesem Artikel entnommen - nicht zu verwechseln mit der gebräuchlichen Verwendung für Listen als abstrakten Datentyp , wobei head normalerweise das erste Element bedeutet.)
Beispiele (aktives Segment in Klammern)
Wurm: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Wurm: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Wurm: 1,1
step worm
(1 1)
1 1 0 1 0
2 1 0(1)
3 1 0 0 0 0 0
4 1 0 0 0 0
5 1 0 0 0
...
8 (1)
9 0 0 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0 0
...
18 0
19 <- lifetime = 19
Wurm: 2
step worm
(2)
1 (1 1)
2 1 0 1 0 1 0
3 1 0 1 0(1)
4 1 0 1 0 0 0 0 0 0
5 1 0 1 0 0 0 0 0
6 1 0 1 0 0 0 0
...
10 1 0(1)
11 1 0 0 0 0 0 0 0 0 0 0 0 0 0
12 1 0 0 0 0 0 0 0 0 0 0 0 0
...
24 (1)
25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
...
50 0
51 <- lifetime = 51
Wurm: 2,1
(2 1)
1 2 0 2 0
2 2 0(2)
3 2 0(1 1 1 1)
4 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0
5 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0(1 1 1)
6 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0
7 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0(1 1)
8 2 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0{1 0}^9
...
?? <- lifetime = ??
Wurm: 3
step worm
(3)
1 (2 2)
2 (2 1 2 1 2 1)
3 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0
4 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1(2)
5 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0(2 1 2 1 1 1 1 1 1 1)
6 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0{2 1 2 1 1 1 1 1 1 0}^7
7 2 1 2 1 2 0 2 1 2 1 2 0 2 1 2 1 2 0{2 1 2 1 1 1 1 1 1 0}^6 (2 1 2 1 1 1 1 1 1)
... ...
?? <- lifetime = ??
Beiseite
Worm Lebensdauern liegen typischerweise enorm, wie durch die folgenden unteren Grenzen in Bezug auf die Standard gezeigt schnell wachsenden Hierarchie von Funktionen f α :
worm lower bound on lifetime
---------------- ------------------------------------------
11..10 (k 1s) f_k(2)
2 f_ω(2)
211..1 (k 1s) f_(ω+k)(2)
2121..212 (k 2s) f_(ωk)(2)
22..2 (k 2s) f_(ω^k)(2)
3 f_(ω^ω)(2)
...
n f_(ω^ω^..^ω)(2) (n-1 ωs) > f_(ε_0) (n-1)
Bemerkenswerterweise hat Wurm [3] bereits eine Lebenszeit, die Grahams Zahl bei weitem übertrifft :
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
Code Golf Challenge
Schreiben Sie das kürzestmögliche Funktionsunterprogramm mit folgendem Verhalten:
Eingabe : Beliebiger Wurm.
Ausgabe : Die Lebensdauer des Wurms.Die Codegröße wird in Bytes gemessen.
Hier ist ein Beispiel (Python, Golf auf ca. 167 Bytes):
from itertools import *
def T(w):
w=w[::-1]
t=0
while w:
t+=1
if w[0]:a=list(takewhile(lambda e:e>=w[0],w));a[0]-=1;w=a*(t+1)+w[len(a):]
else:w=w[1:]
return t
Anmerkung : Wenn t (n) die Lebensdauer des Wurms [n] ist, entspricht die Wachstumsrate von t (n) in etwa der der Goodstein-Funktion . Also , wenn diese auf unter 100 Bytes golfed werden, könnte es auch eine Gewinn Antwort auf die gibt größte Zahl Druck Frage . (Für diese Antwort könnte die Wachstumsrate erheblich beschleunigt werden, indem der Schrittzähler immer bei n gestartet wird - dem gleichen Wert wie der Wurm [n] - anstatt bei 0.)
2 1
vielleicht zu viel in einer angemessenen Zeit zu fragen, aber ein nützlicher Test ist , dass die Sequenz beginnen sollte (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
das * am weitesten links stehende Element dieser Liste?