Учитывая положительное целое число N, определите начальный шаблон на N x N-сетке, который дает самую длинную неповторяющуюся последовательность в правилах Игры Жизни и заканчивается фиксированным шаблоном (цикл длины 1), сыгранным на торе.
Цель - не самая короткая программа, а самая быстрая.
Поскольку мир конечен, вы в конечном итоге окажетесь в цикле, повторяя тем самым уже посещенное состояние. Если этот цикл имеет период 1, то начальный шаблон является допустимым кандидатом.
Вывод: начальный шаблон и общее количество уникальных состояний в последовательности (включая начальный шаблон).
Теперь 1x1-тор особенный, так как клетка может считаться соседней с ней или нет, но на практике проблем нет, одиночная живая клетка в любом случае просто погибнет (от переполненности или одиночества). Таким образом, на входе 1 получается последовательность длиной 2, которая состоит из одной ячейки, которая жива, а затем вечно мертва.
Мотивация для этого вопроса заключается в том, что он является аналогом функции занятого бобра, но определенно менее сложен, поскольку у нас есть ограничения на память. Это будет хорошая последовательность для включения в OEIS.
При N = 3 длина последовательности равна 3, любой шаблон с левой стороны достигает абсолютно черного квадрата 3x3 и затем умирает. (Все паттерны, которые являются частью 1-го цикла, удалены).
источник
Ответы:
C ++ до N = 6
Эта техника основана на быстрой функции следующего состояния. Каждая плата представлена в виде битовой маски из N ^ 2 битов, и хитрые трюки используются для вычисления следующего состояния для всех ячеек одновременно.
next
составляет около200100 инструкций по сборке для N <= 8. Затем мы просто делаем стандартное "все-состояния-пока-они-повторяются" и выбираем самую длинную.Занимает несколько секунд до 5х5, несколько часов за 6х6.
источник
next
считая, а не сортируя.#define H(x,y){x^=y;y&=(x^y);}
а потом что-то вродеH(n1,n2);H(n3,n4);H(n5,n6);H(n7,n8);H(n1,n3);H(n5,n7);H(n2,n4);H(n6,n8);H(n1,n5);H(n3,n7);H(n2,n6);H(n2,n3);H(n2,n5); return n2 & (b | n1) & ~(n3|n4|n5|n6|n7|n8) & ALL;
Я вижу следующие возможные подходы к решению:
Next(board)
функцию, мы увидим, что она имеет некоторые преимущества, хотя и не так много, как я первоначально надеялся.Prev2
.Я не думаю, что микрооптимизация позволит мне догнать код Кейта, но ради интереса я опубликую то, что у меня есть. Это решает N = 5 примерно за минуту на машине с частотой 2 ГГц с использованием Mono 2.4 или .Net (без PLINQ) и примерно за 20 секунд с использованием PLINQ; N = 6 работает в течение многих часов.
источник
фактор
Некоторые временные характеристики:
И тестирование 5 разбило REPL. Хммм. Наиболее неэффективной частью программы, вероятно, является функция game-sequence. Я мог бы сделать это позже.
источник