Я играл с клеточным автоматом и нашел тот, у которого было интересное поведение. Вот как это работает:
Он читает двоичную строку слева направо, если он встречает другое, а 1
затем 2
другие значения, он добавляет 0
к результату и продолжает чтение. Если он встретит a 0
(или осталось менее 3 значений), он добавит текущее значение и a 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
? Я думаю, что было бы полезно еще несколько тестов