şartlar
Bir solucan negatif olmayan tamsayılar herhangi listesidir ve onun en sağdaki (yani son ) eleman denir kafa . Eğer kafa 0 değilse, kurtçuk, kafayı içeren en uzun bitişik elemanlar bloğundan oluşan ve tüm elemanlarına en az baş kadar büyük olan aktif bir segmente sahiptir . Düşük aktif bölümü Örneğin 1 ile indirildiği baş aktif bölümü olan, sonsuz 3 1 2 3 2
etkin bir kesite sahiptir 2 3 2
, ve böylece, aktif bölümdür 2 3 1
.
Evrim kuralları
Bir solucan, aşağıdaki gibi adım adım gelişir:
T adımında (= 1, 2, 3, ...),
eğer kafa 0 ise: baş başlığını sil
: aktif kısmı, azaltılmış aktif parçanın t + 1 birleştirilmiş kopyalarıyla değiştirin.
Gerçek : Herhangi bir solucan sonunda boş listeye evrilir ve bunu yapmak için atılacak adımların sayısı solucanın ömrüdir .
( LD Beklemişev'in bir makalesi olan The Worm Principle'de detaylar bulunabilir . Sonlu bir sekans için "list" ve son elementini ifade etmek için "head" kullanımı bu makaleden alınmıştır - karıştırılmamalıdır) listelerin genel olarak kullanımı , başın genellikle ilk öğe olduğu soyut veri türü olarak kullanılır .
Örnekler (parantez içindeki aktif bölüm)
Solucan: 0,1
step worm
0(1)
1 0 0 0
2 0 0
3 0
4 <- lifetime = 4
Solucan: 1,0
step worm
1 0
1 (1)
2 0 0 0
3 0 0
4 0
5 <- lifetime = 5
Solucan: 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
Solucan: 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
Solucan: 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 = ??
Solucan: 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 = ??
bir kenara
Solucan ömürleri, f α'nın standart hızlı büyüyen fonksiyon hiyerarşisi açısından aşağıdaki alt sınırlarla gösterildiği gibi tipik olarak muazzamdır :
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)
Dikkat çekici bir şekilde, solucan [3] zaten Graham’ın sayısını , G’yi aşan bir ömre sahip :
f ω ω (2) = f ω 2 (2) = f ω2 (2) = f ω + 2 (2) = f ω + 1 (f ω + 1 (2)) >> f ω + 1 (64) > G.
Code Golf Mücadelesi
Mümkün olan en kısa fonksiyonu olan alt programı aşağıdaki davranışla yazın:
Giriş : Herhangi bir kurt.
Çıktı : Solucanın ömrü.Kod boyutu bayt cinsinden ölçülür.
İşte bir örnek (Python, golf yaklaşık 167 bayta kadar):
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
Not : Eğer t (n) solucanın ömrü [n] ise, o zaman t (n) 'nin büyüme oranı kabaca Goodstein fonksiyonununkidir . Yani bu 100 bayt aşağıda golfed edilebilirse, iyi bir kazanan cevabı verebilir Büyük Numara Yazdırılabilir soruya . (Bu cevap için, büyüme hızı her zaman n-adım sayacını her zaman n - solucanın [n] ile aynı değeri - 0'da başlatmak yerine) başlatarak büyük ölçüde hızlandırılabilir.)
2 1
makul bir süre içinde istemek çok olabilir, ama yararlı bir testtir dizisi başlaması gerektiğini (2 1)
, 2 0 2 0
, 2 0 (2)
, 2 0 (1 1 1 1)
, ...
w[0]
o listenin * en soldaki elemanı olarak bakıyorsunuz.