Сотовые автоматы действительно очаровательны. Те, о которых обычно говорят, являются двоичными, то есть представляемыми числом. Тем не менее, те, на мой взгляд, были сделаны до смерти. Тройные CA более интересны, но мы должны рассмотреть все ASCII! Какое это может быть удовольствие!
Вместо того, чтобы выбирать набор правил для каждого символа, я буду использовать простое решающее правило, о котором я скоро расскажу. Чтобы принять решение о следующем поколении, мы смотрим на три «верхние» клетки, очень похожие на клеточные автоматы. Посмотрите на пример:
QWERTY
X Y Z
«Верх» Y
- WER
это ячейки сверху и справа, сверху и сверху и слева. Y будет результатом функции, которую я собираюсь определить, которая является функцией для трехсимвольных строк. «Вершина» X
есть QW
, или заполнение пространства в несуществующей / отсутствующую клетке .
Теперь для забавной функции! Я называю эту последовательность последовательностью XOROR по причине. Позвольте A
быть верхним левым символом ячейки, B
быть вышеуказанным кодексом ячейки, и C
быть верхним правым символом ячейки. Затем полученная ячейка - это символ, чей код - (A XOR B) OR C
это (A^B)|C
. (Если результирующее значение больше 126, тогда оно установлено на (CHARCODE % 127) + 32
. Ничего не делается, если значение меньше 32.) Вот пример начального числа Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
И мы можем продолжить некоторое время после этого. Эта модификация строки называется последовательностью XOROR.
Цель Вы должны написать программу или функцию, которая выполняет одну из следующих задач:
- Учитывая строку
s
и числоn >= 0
, выведитеn
задана th-ю последовательность в последовательности XOROR с помощью seeds
,n = 0
являющейся первым преобразованием строки. - Для
s
заданной строки выведите (для программ) или сгенерируйте (для функций / генераторов) бесконечный поток последовательности XOROR с начальным числомs
. Вы можете остановить, если последовательность повторяется, но это не обязательно.
s
всегда будет состоять только из печатных символов ASCII, от пробела до тильды и табуляции (без перевода строки).
Это код-гольф , поэтому выигрывает самая короткая программа в байтах.
источник
o
делают это похоже на порыв зергов .127%127+32==32
.n=0
не оригинальная строка?(d^!)|(space)
. Что касается второго вопроса, вы выполняете(CHAR%127)+32
после выполнения XOROR.Ответы:
MATL ,
3331 байтЭто работает в выпуске 13.1.0 языка / компилятора, который предшествовал вызову.
Первый вход - это число, второй - строка.
Попробуйте онлайн!
источник
Mathematica, 133 байта
Было бы неплохо сделать
CellularAutomaton[]
решение работало, но я продолжал терпеть неудачу. Кто угодно?Редактировать: некоторые красивые картинки (нажмите, чтобы увеличить)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:источник
CellularAutomaton
свою функцию обновления? (Фактический номер правила с 127 действительными состояниями был бы безумным.)Ява,
193185 байтПотому что Java.
-8 байт, переключаясь на цикл, а не на повторение, чтобы сделать его анонимной функцией
Возвращает n-ю итерацию XOROR для s.
Читаемая версия:
Практически буквальная реализация спецификации с рекурсивным циклом для применения операции n раз. Некоторые байты были сохранены, однако, с моим наблюдением, что предложение CHARCODE> 126 будет когда-либо происходить только с CHARCODE == 127, что приводит к сохранению
SPACE
вместоDEL
.Я пробежал свой код по нескольким произвольно выбранным строкам и нашел этот замечательный цикл:
источник
ok
!CJam, 38 байт
Проверьте это здесь.
объяснение
источник
lri){2S*\*3ew{)\:^|}%127c' er}*
потому что операция pre-modulo символов никогда не превышает 127Haskell, 123 байта
Это возвращает бесконечный поток последовательности XOROR. Пример использования (выведите первые 5 элементов семени
"Hello, World!"
):Как это работает:
источник
PHP, 186 байт (с n) | 177 байт (бесконечно)
Оказалось, что бесконечная печать короче ...
Разгромленный
Бесконечный бесконечный
источник
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
имеет длину 141 байт (-36 байт).C ++
N-я последовательность (212)
Un-Golfed
N-последовательность, использующая синтаксис указателя вместо синтаксиса массива, чтобы сделать это еще более запутанным: (231)
Un-Golfed
Функция отладки (для удовольствия)
источник
JAVA 240/280 байт
Популярная версия Java на момент написания этой статьи утверждала, что она имеет размер 185 байт, но есть две важные особенности. Во-первых, измерение предположительно только для функции, а не для всего рабочего источника. Может быть, не такая проблема. Во-вторых, он использует BiFunction без импорта или полного имени. Добавление требуемых битов для запуска «как есть» (затем минимизации, справедливо) довело его до 348 байт. Добавление только полностью определенного имени класса BiFunction приводит к его увеличению до 248 байтов.
Напротив, я считаю, что у меня 240 байтов при игре по тем же правилам (без класса, без фактического вывода, только мясо). Полный исполняемый класс имеет размер 280 байт и выглядит следующим образом (без объединения):
Или, минимизированный:
источник
Perl, 47 байт
Включает +2 для
-lp
Запустите с помощью ввода на STDIN, например,
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Это работает как есть, но замените
\x7f
его на соответствующее двоичное значение, чтобы получить заданную оценкуисточник
Свифт: 273 персонажа
Ух ты, Свифт хуже Явы! (Все эти API с длинными именами!: P)
Ungolfed:
Благодаря @ CAD97 за упоминание о том, что (A ^ B) | C может быть больше 126, когда это 127.
Я также понял, что вам не нужны круглые скобки вокруг A ^ B | C, потому что XOR выполняется перед ORing, поэтому я сэкономил несколько байтов.
источник