condizioni
Un worm è un elenco di numeri interi non negativi e il suo elemento più a destra (ovvero l' ultimo ) è chiamato head . Se la testa non è 0, il worm ha un segmento attivo costituito dal blocco contiguo più lungo di elementi che include la testa e ha tutti i suoi elementi almeno grandi quanto la testa . Il segmento attivo ridotto è il segmento attivo con la testa decrementata di 1. Ad esempio, il worm 3 1 2 3 2
ha il segmento attivo 2 3 2
e il segmento attivo ridotto lo è 2 3 1
.
Regole dell'evoluzione
Un worm si evolve passo dopo passo come segue:
Nel passaggio t (= 1, 2, 3, ...),
se la testa è 0: elimina la testa
altrimenti: sostituisce il segmento attivo con t + 1 copie concatenate del segmento attivo ridotto.
Fatto : qualsiasi worm alla fine si evolve in un elenco vuoto e il numero di passaggi per farlo è la durata del worm .
(I dettagli possono essere trovati in The Worm Principle , un articolo di LD Beklemishev. L'uso di "list" per indicare una sequenza finita, e "head" per indicare il suo ultimo elemento, è preso da questo documento - non dovrebbe essere confuso con l'uso comune degli elenchi come tipo di dati astratto , dove head di solito indica il primo elemento.)
Esempi (segmento attivo tra parentesi)
Verme: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Verme: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Verme: 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
Verme: 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
Verme: 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 = ??
Verme: 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 = ??
A parte
Le vite dei vermi sono in genere enormi, come mostrato dai seguenti limiti inferiori in termini della gerarchia standard delle funzioni in rapida crescita 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)
Sorprendentemente, worm [3] ha già una vita che supera di gran lunga il numero di Graham , G:
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
Code Golf Challenge
Scrivere il sottoprogramma della funzione più breve possibile con il seguente comportamento:
Input : qualsiasi worm.
Output : la durata del worm.La dimensione del codice è misurata in byte.
Ecco un esempio (Python, golf a circa 167 byte):
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
NB : Se t (n) è la durata del worm [n], allora il tasso di crescita di t (n) è approssimativamente quello della funzione di Goodstein . Quindi, se questo può essere giocato a meno di 100 byte, potrebbe anche dare una risposta vincente alla domanda stampabile con il numero più grande . (Per questa risposta, il tasso di crescita potrebbe essere notevolmente accelerato avviando sempre il contapassi su n - lo stesso valore del worm [n] - invece di avviarlo su 0.)
2 1
potrebbe essere troppo chiedere in un tempo ragionevole, ma un test utile è che la sequenza dovrebbe iniziare (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
elemento * più a sinistra di quella lista?