Я играл с клеточным автоматом и нашел тот, у которого было интересное поведение. Вот как это работает:
Он читает двоичную строку слева направо, если он встречает другое, а 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
? Я думаю, что было бы полезно еще несколько тестовОтветы:
V ,
262221 байтСпасибо @CowsQuack за 4 байта за счет объединения регулярных выражений! И @ ØrjanJohansen для другого байта с некоторыми комбинациями регулярных выражений.
Попробуйте онлайн!
Использует замену несколько раз и добавляет 1 в конце. Ничего особенного. У меня есть версия, которая переназначается
1
и0
в режиме вставки, чтобы получить желаемый эффект, но это немного дольше.(Несколько вариантов замены: попробуйте онлайн! )
источник
Ó1ü0/&1
(ü
есть\|
)Ó./&1
а затемÓ31/0
.JavaScript (ES6), 56 байт
Принимает ввод как массив символов. Возвращает строку или число,
1
если дан пустой массив.демонстрация
Показать фрагмент кода
Анимированная версия
Примеры стабильных входов: 0101, 010011111
Показать фрагмент кода
источник
Python 2 , 88 байт
Попробуйте онлайн!
источник
Python 2 , 89 байт
Попробуйте онлайн!
-4 байта благодаря Rod
-6 байтов благодаря ovs
-1 байту благодаря micsthepick
источник
[0]if v else[x[y],1]
можно переписать как[[x[y],1],[0]][v]
, но вы можете инвертироватьv
значение, чтобы достичь 96 байтSwift 3 , 147 байт
-1 благодаря @ Mr.Xcoder
Разгруженный, возвращающий значение вместо печати:
источник
3<=s.count
с2<s.count
на -1 байт .1
s на входе,0 < element
а неelement == 0
Python 2 , 81 байт
И вход, и выход являются списками (спасибо Эрику Гольфисту)
Попробуйте онлайн!
Некоторые случаи
Python 2 , 85 байт
И вход, и выход являются строками (исходное решение)
Попробуйте онлайн!
Некоторые случаи
Экспликация Это просто гольф рекурсивного метода.
источник
1>Z[0]
вместо0==Z[0]
.Perl 5 , 62 + 2 (
-F
) = 64 байтаПопробуйте онлайн!
источник
Scala , 131 + 29 = 160 байт
Это внутри функции, принимающей строку в
a
качестве параметра и возвращающей вывод в виде строки.Я должен
import util.control.Breaks._
, поэтому мне нужно добавить эти 28 байтов плюс завершающий перевод строки.Попробуйте онлайн!
источник
C # (.NET Core) , 108 байт
Попробуйте онлайн!
Ввод принимается как строка, а строка возвращается в качестве вывода.
источник