Hücresel otomatla oynuyordum ve ilginç davranışları olan bir tane buldum. Şöyle çalışır:
Soldan sağa bir ikili dize okur, 1
ardından 2
başka değerlerle karşılaşırsa 0
sonuca a ekler ve okumaya devam eder. Bir 0
(veya 3 değerden daha az değer kaldı) ile karşılaşırsa, geçerli değeri ve a'yı ekler 1
ve okumaya devam eder. Dizenin sonunda 1
sonuca bir tek ekler .
İşte bir jenerasyonun çalışılmış bir örneği
01011111
^
Önce bir karşılaşmaya 0
biz eklemek böylece 01
bizim sonuca
01011111
^
01
Şimdi bir ile karşılaştık, 1
sıfır ekledik ve sonraki iki değeri atladık
01011111
^
010
Başka biriyle karşılaşıyoruz, 1
böylece aynısını yapıyoruz
01011111
^
0100
Artık 1
atlamak için başka bir alanımız var, ancak atlamak için yeterli alanımız yok, bu yüzden mevcut hücreyi ve a 1
(bu örnekte 11
)
01011111
^
010011
Sonundayız, bu yüzden tek bir tane ekliyoruz 1
ve bu nesli sonlandırıyoruz
01011111
^
0100111
Görev
Herhangi bir makul formatta girdi verildiğinde, otomatın bir neslini hesaplayan bir fonksiyon veya program oluşturmalısınız.
Bu bir kod golf sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.
Örnek uygulama
İşte Haskell'deki örnek bir uygulama (bir işlevi tanımlar d
, ancak program süresiz olarak bir yineleme yazdırır):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
baskı yapmalı 11011
mı? Birkaç test vakasının yardımcı olacağını düşünüyorum