Описанная выше симуляция является по сути 0-мерной средой, где у всех программ равные шансы провзаимодействовать. Авторы попробовали сделать 1D и 2D среды с локальностью коммуникации. Само-репликаторы возникают во всех конфигурациях. Авторы сфокусировались на 2D с 32400 BFF программами на сетке 240x135. Программы взаимодействовали только с соседями в пределах двух клеток по каждой координате. Итерируются по всем программам P в случайном порядке, для каждой P равномерно выбирают соседа N и, если их ещё не брали в пару, выполняют обычную процедуру split(exec(PN)) → P′ + N′. Результат перезаписывает родителей. Неотобранные программы по-прежнему могут мутировать. В такой конфигурации само-репликаторы по-прежнему возникают, на рисунке 8 они красиво отображены на плоскости, где каждый квадратик 8x8 пикселей представляет одну ленту. Видео этой симуляции тут, можно медитировать пять минут. Игра жызнь на стероидах. Такой сетап влияет на скорость распространения репликаторов, для супа размера n у свежевозникшего репликатора время полузахвата супа составляет примерно log n шагов. Был ещё эксперимент с длинной лентой, 65536 байт, там случайно выбиралась позиция на ленте, откуда стартовало выполнение программы. Здесь саморепликатор -- это подстрока. И в таком эксперименте они тоже возникают, там только с начальными позициями обеих голов надо было поиграть (у второй смещение 12 или 16 относительно первой), чтобы нетривиальные репликаторы начали появляться. Этот эксперимент не обсуждается, но код для воспроизведения лежит в репе. Другие языки Авторы не предлагают пока какой-либо теории, определяющей, что делает язык или среду подходящей для возникновения само-репликаторов, но они наблюдают это поведение и в других языках кроме BFF. Во-первых, в языке форт (Forth), который является стековым языком. Команды с ленты либо запихивают что-то в стек, либо выполняют там операции. С фортом провели два эксперимента: аналог первичного бульона с выполнением пары лент, и аналог длинной ленты, когда индивидуальные интерпретаторы выполняются параллельно в разных частях ленты. Само-репликаторы возникли в обоих случаях, но авторы не нашли набора инструкций, которые работают в этих случаях “из коробки”. В варианте с бульоном использовался форт с ограниченным набором команд и снова ленты фиксированного размера. Интересная особенность такого форта в том, что он позволяет собрать тривиальный однобайтовый само-репликатор (команда с опкодом 0C, скопировать байт из ячейки через 64 символа, то есть с другой ленты в той же позиции), на базе него быстро возникает само-репликатор, копирующий целую ленту. Происходит это всё гораздо быстрее и надёжнее, чем в случае BFF. В варианте с двумерным супом само-репликаторы возникают в разных частях бульона. Они чуть отличаются друг от друга, так что в итоге никто из них в бульоне не доминирует, остаётся конкуренция. В варианте с длинной лентой (65536) несколько вариантов также продуцируют репликаторы, но не все. Возникают примерно за 60 секунд работы или 180B инструкций. В статье есть более подробный анализ, что именно возникает и как оно себя ведёт. На языке SUBLEQ (забавный Тьюринг полный язык с одной инструкцией, но таких языков кроме него -- десятки, см. OISC, сама по себе интересная тема). В терминах языка C инструкция с тремя операндами делает что-то такое (где pc -- program counter): ```*a -= *b; if (*a <= 0) { goto c; } else { goto pc + 3; } ``` Минимальный созданный авторами вручную репликатор занимает 60 байт. Возможно это длинновато для самозарождения. Авторы сделали свой вариант языка RSUBLEQ4, где у единственной инструкции 4 операнда и делает она следующее: ```*(pc + a) = *(pc + b) - *(pc + c); if (*a <= 0) { goto pc + d; } else { goto pc + 4; }``` В этом случае репликатор получается в 25 байт.