Warunki
Robak jest jakaś lista nieujemnych liczb całkowitych, a jej skrajna (czyli ostatni ) element jest nazywany głowy . Jeśli głowa nie jest równa 0, robak ma aktywny segment składający się z najdłuższego ciągłego bloku elementów, który obejmuje głowę i ma wszystkie swoje elementy co najmniej tak duże jak głowa . Zredukowany odcinek czynny jest aktywny segment z głowicą zmniejszana o 1. Na przykład, wirus 3 1 2 3 2
zawiera aktywny fragment 2 3 2
, a zredukowany odcinek czynny 2 3 1
.
Zasady ewolucji
Robak ewoluuje krok po kroku w następujący sposób:
W kroku t (= 1, 2, 3, ...),
jeśli głowa ma wartość 0: usuń głowę
inaczej: zamień aktywny segment na t + 1 konkatenowane kopie zredukowanego aktywnego segmentu.
Fakt : Każdy robak ostatecznie ewoluuje na pustą listę , a liczba kroków, które należy wykonać, to żywotność robaka .
(Szczegóły można znaleźć w dokumencie The Worm Principle , pracy LD Beklemisheva. Użycie „listy” w celu oznaczenia skończonej sekwencji i „głowy” w celu oznaczenia jej ostatniego elementu pochodzi z tego artykułu - nie należy tego mylić z powszechnym użyciem list jako abstrakcyjnego typu danych , gdzie head zwykle oznacza pierwszy element.)
Przykłady (aktywny segment w nawiasach)
Robak: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Robak: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Robak: 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
Robak: 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
Robak: 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 = ??
Robak: 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 = ??
Na bok
Czas życia robaka jest zwykle ogromny, co pokazują poniższe dolne granice w kategoriach standardowej szybko rosnącej hierarchii funkcji 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)
Co ciekawe, robak [3] ma już żywotność znacznie przewyższającą liczbę Grahama , G:
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
Code Golf Challenge
Napisz możliwie najkrótszy podprogram funkcji o następującym działaniu:
Dane wejściowe : dowolny robak.
Dane wyjściowe : czas życia robaka.Rozmiar kodu jest mierzony w bajtach.
Oto przykład (Python, golf do około 167 bajtów):
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 : Jeśli t (n) jest okresem życia robaka [n], wówczas tempo wzrostu t (n) jest mniej więcej takie samo jak funkcja Goodsteina . Więc jeśli można to grałem poniżej 100 bajtów, to może dobrze dać zwycięską odpowiedź na największą liczbę druku pytanie . (W przypadku tej odpowiedzi tempo wzrostu można znacznie przyspieszyć, zawsze uruchamiając licznik kroków od n - tej samej wartości co robak [n] - zamiast od 0).
2 1
może być zbyt wiele, aby poprosić w rozsądnym czasie, ale użytecznym testem jest, że kolejność powinna rozpocząć (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
który jest * skrajnym lewym elementem tej listy?