Я бавився зі стільниковим автоматом, і виявив той, який мав цікаву поведінку. Ось як це працює:
Він читає двійковий рядок зліва направо, якщо він зустрічається з 1
наступними 2
іншими значеннями, він додає a 0
до результату і продовжить читання. Якщо він зіткнеться з 0
(або залишилося менше 3 значень), він додасть поточне значення а 1
і продовжить читання. В кінці рядка він додасть єдиний 1
результат.
Ось відпрацьований приклад одного покоління
01011111
^
Ми спочатку стикаємося з 0
таким, щоб додати 01
свій результат
01011111
^
01
Зараз ми стикаємося з а, 1
тому додаємо нуль і пропускаємо наступні два значення
01011111
^
010
Ми зустрічаємо іншого, 1
тому робимо те саме
01011111
^
0100
Тепер у нас є ще одне, 1
але недостатньо місця для стрибка, тому ми додаємо поточну комірку та a 1
(у цьому випадку 11
)
01011111
^
010011
Ми в кінці, тому ми додаємо єдиного 1
і припиняємо це покоління
01011111
^
0100111
Завдання
З огляду на введення в будь-якому розумному форматі, ви повинні створити функцію або програму, яка обчислює одне покоління автомата.
Це питання з кодовим гольфом, тому відповіді будуть набиратись у байтах, менша кількість байтів - краща.
Зразок реалізації
Ось приклад реалізації в Haskell (визначає функцію d
, але програма друкує ітерації нескінченно):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
його, слід надрукувати 11011
? Я думаю, що ще кілька тестових випадків будуть корисними