Умови
Черв'як є будь-яким списком невід'ємних цілих чисел, а його правий (тобто останній ) елемент називається головою . Якщо в голові немає 0, у черв'яка є активний сегмент, що складається з найдовшого суміжного блоку елементів, що включає голову і має всі її елементи принаймні такі ж великі, як і голова . Зменшується активний сегмент є активним сегментом з головою зменшується на 1. Наприклад, хробак 3 1 2 3 2
має активний сегмент 2 3 2
, і відновлений активний сегмент 2 3 1
.
Правила еволюції
Черв'як розвивається поетапно так:
На кроці t (= 1, 2, 3, ...),
якщо заголовок дорівнює 0: видаліть голівку
іншим: замініть активний сегмент на t + 1 об'єднані копії зменшеного активного сегмента.
Факт : Будь-який черв'як врешті-решт перетворюється на порожній список , і кількість кроків для цього - це тривалість життя черв'яка .
(Докладні відомості можна знайти в «Принципі черв'яка» , статті Л.Д. Беклемішева. Використання «списку» для позначення кінцевої послідовності, а «голова» для позначення останнього елемента взято з цього документу - це не слід плутати із загальним використанням для списків як абстрактного типу даних , де голова зазвичай означає перший елемент.)
Приклади (активний сегмент у дужках)
Черв'як: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Черв'як: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Черв'як: 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
Черв'як: 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
Черв'як: 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 = ??
Черв'як: 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 = ??
Убік
Тривалість життя черв'яків зазвичай величезна, про що свідчать наступні нижчі межі щодо стандартної швидко зростаючої ієрархії функцій 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)
Примітно, що черв'як [3] вже має тривалість життя, що набагато перевершує кількість Грема , G:
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > Г.
Code Golf Challenge
Напишіть найкоротшу можливу функціональну підпрограму з такою поведінкою:
Введення : Будь-який глист.
Вихід : Термін експлуатації хробака.Розмір коду вимірюється в байтах.
Ось приклад (Python, гольфи до приблизно 167 байт):
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
Примітка : Якщо t (n) - тривалість життя черв'яка [n], то темп зростання t (n) приблизно відповідає функції Гудштейна . Так що, якщо це може бути golfed нижче 100 байт, він цілком може дати виграшну відповідь на саме велика кількість друку питання . (Для цього відповідь, темп зростання може бути значно прискорений, завжди запускаючи лічильник кроків на n - те саме значення, що і черв'як [n] - замість того, щоб запускати його з 0.)
2 1
може бути занадто багато , щоб запитати , в розумний термін, але корисний тест , що послідовність повинна починатися (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
що є * лівим елементом цього списку?