Condiciones
Un gusano es cualquier lista de enteros no negativos, y su elemento más a la derecha (es decir, último ) se llama cabeza . Si la cabeza no es 0, el gusano tiene un segmento activo que consiste en el bloque contiguo más largo de elementos que incluye la cabeza y tiene todos sus elementos al menos tan grandes como la cabeza . El segmento activo reducido es el segmento activo con la cabeza disminuida en 1. Por ejemplo, el gusano 3 1 2 3 2
tiene segmento activo 2 3 2
, y el segmento activo reducido es 2 3 1
.
Reglas de evolución.
Un gusano evoluciona paso a paso de la siguiente manera:
En el paso t (= 1, 2, 3, ...),
si el encabezado es 0: elimine el encabezado
más: reemplace el segmento activo por t + 1 copias concatenadas del segmento activo reducido.
Hecho : Cualquier gusano eventualmente evoluciona a una lista vacía , y el número de pasos para hacerlo es la vida del gusano .
(Los detalles se pueden encontrar en The Worm Principle , un documento de LD Beklemishev. El uso de "lista" para referirse a una secuencia finita, y "cabeza" para referirse a su último elemento, se toma de este documento; no debe confundirse con el uso común de las listas como un tipo de datos abstracto , donde head generalmente significa el primer elemento).
Ejemplos (segmento activo entre paréntesis)
Gusano: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Gusano: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Gusano: 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
Gusano: 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
Gusano: 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 = ??
Gusano: 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 = ??
Aparte
La vida útil de los gusanos suele ser enorme, como lo demuestran los siguientes límites inferiores en términos de la jerarquía estándar de funciones de rápido crecimiento 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, el gusano [3] ya tiene una vida que supera con creces el número de 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
Escriba el subprograma de funciones más corto posible con el siguiente comportamiento:
Entrada : cualquier gusano.
Salida : la vida útil del gusano.El tamaño del código se mide en bytes.
Aquí hay un ejemplo (Python, golf a unos 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
NB : Si t (n) es la vida útil del gusano [n], entonces la tasa de crecimiento de t (n) es aproximadamente la de la función Goodstein . Entonces, si esto se puede jugar por debajo de los 100 bytes, bien podría dar una respuesta ganadora a la pregunta imprimible del número más grande . (Para esa respuesta, la tasa de crecimiento podría acelerarse enormemente al iniciar siempre el contador de pasos en n, el mismo valor que el gusano [n], en lugar de comenzarlo en 0.)
2 1
que podría ser demasiado pedir en un tiempo razonable, pero una prueba útil es que la secuencia debe comenzar (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
el elemento más a la izquierda de esa lista?