Ketentuan
Sebuah worm adalah setiap daftar bilangan bulat non-negatif, dan yang paling kanan (yaitu, terakhir ) elemen disebut kepala . Jika kepala bukan 0, cacing memiliki segmen aktif yang terdiri dari blok elemen yang paling panjang yang berdekatan yang mencakup kepala dan memiliki semua elemennya setidaknya sebesar kepala . The segmen aktif berkurang adalah segmen aktif dengan kepala dikurangi dengan 1. Sebagai contoh, worm 3 1 2 3 2
memiliki segmen aktif 2 3 2
, dan segmen aktif berkurang adalah 2 3 1
.
Aturan evolusi
Cacing berevolusi langkah demi langkah sebagai berikut:
Pada langkah t (= 1, 2, 3, ...),
jika head adalah 0: hapus head yang
lain: ganti segmen aktif dengan t + 1 salinan gabungan dari segmen aktif tereduksi.
Fakta : Cacing apa pun akhirnya berevolusi menjadi daftar kosong , dan jumlah langkah untuk melakukannya adalah masa hidup cacing itu .
(Detail dapat ditemukan dalam The Worm Principle , sebuah makalah oleh LD Beklemishev. Penggunaan "daftar" berarti urutan yang terbatas, dan "kepala" yang berarti elemen terakhirnya , diambil dari makalah ini - tidak boleh dikacaukan dengan penggunaan umum untuk daftar sebagai tipe data abstrak , di mana head biasanya berarti elemen pertama .)
Contoh (segmen aktif dalam tanda kurung)
Cacing: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Cacing: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Cacing: 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
Cacing: 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
Cacing: 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 = ??
Cacing: 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 = ??
Ke samping
Umur cacing biasanya sangat besar, seperti yang ditunjukkan oleh batas bawah berikut dalam hal hierarki standar fungsi yang tumbuh cepat 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)
Hebatnya, worm [3] sudah memiliki masa hidup yang jauh melebihi jumlah Graham , G:
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
Tantangan Golf Code
Tulis subprogram fungsi sesingkat mungkin dengan perilaku berikut:
Input : Cacing apa saja.
Output : Masa hidup worm.Ukuran kode diukur dalam byte.
Berikut ini sebuah contoh (Python, golf hingga sekitar 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 : Jika t (n) adalah masa hidup cacing [n], maka laju pertumbuhan t (n) kira-kira sama dengan fungsi Goodstein . Jadi, jika ini bisa di-golf hingga di bawah 100 byte, itu bisa juga memberikan jawaban yang menang untuk pertanyaan Jumlah Cetak Terbesar . (Untuk jawaban itu, laju pertumbuhan bisa sangat dipercepat dengan selalu memulai penghitung langkah di n - nilai yang sama dengan worm [n] - alih-alih memulainya di 0.)
2 1
mungkin terlalu banyak untuk meminta dalam waktu yang wajar, tetapi tes yang berguna adalah bahwa urutan harus mulai (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
yang merupakan elemen paling kiri dari daftar itu?