Найди отличные игры


27

Забавная игра, если вам скучно, это Diffy Game . Это однопользовательская игра, которая довольно проста и может занять много вашего времени.

Игра Diffy работает следующим образом: вы начинаете со списка неотрицательных целых чисел, в этом примере мы будем использовать

3 4 5 8

Тогда вы берете абсолютную разницу между соседними числами

 (8)  3   4   5   8
    5   1   1   3

Тогда вы повторяете. Вы повторяете, пока не поймете, что вступили в цикл. И тогда, как правило, игра начинается заново.

3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0

Часто игра не имеет цели, вы просто выжидаете время, делая арифметику в своей голове. Однако, когда я имею удовольствие играть в эту игру, моя цель всегда состоит в том, чтобы попытаться выбрать период и попытаться создать игру, которая повторяется с этим конкретным периодом.

Не все игры являются периодическими, пример выше не является периодическим, например, потому что он в конечном итоге достигает игры со всеми нулями и, таким образом, никогда не сможет вернуться в исходное положение. На самом деле, кажется, что подавляющее большинство игр не являются периодическими, что делает несколько игр редким украшением.


Для игры с циклом с определенным периодом тривиально создать другую игру с таким же периодом, просто удвоив последовательность. Например, игра:

1 0 1

Играет точно так же, как игра:

1 0 1 1 0 1

На самом деле, мы можем считать, что обе игры действительно бесконечно повторяются:

... 1 0 1 ...

Мы будем считать их одной игрой ради этого вызова.

Аналогичным образом умножение всей последовательности на константу также будет тривиально сохранять период, поэтому мы снова собираемся считать любые две игры, которые отличаются постоянным фактором, как одну и ту же игру.


Бесконечные строки ... 1 0 1 ...и ... 0 1 1 ..., очевидно, одна и та же строка, сдвинутая на один символ. Мы не будем считать их различными играми, но когда одна из них достигнет другой, это не будет считаться концом цикла при определении периода игры. Например:

Две игры

... 0 0 0 1 0 1 ...  = A
... 0 0 1 1 1 1 ...  = B
... 0 1 0 0 0 1 ...  = A << 4
... 1 1 0 0 1 1 ...  = B << 4
... 0 1 0 1 0 0 ...  = A << 2
... 1 1 1 1 0 0 ...  = B << 2

а также

... 0 0 1 0 1 0 ...  = A << 1
... 0 1 1 1 1 0 ...  = B << 1
... 1 0 0 0 1 0 ...  = A << 5
... 1 0 0 1 1 1 ...  = B << 5
... 1 0 1 0 0 0 ...  = A << 3
... 1 1 1 0 0 1 ...  = B << 3

являются игры с периодом 6. Они не имеют ни термина друг с другом в любой момент в их петель ( в отличие ... 1 1 0 ...и ... 1 0 1 ...которые достигают друг друга) , но потому , что они сдвинуты версии друг друга , они считаются в ту же игру , когда подсчет.


Отражение (или обращение) бесконечной строки дает по существу то же поведение, но не обязательно дает тот же период. Рассмотрим, например,

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...

и его отражение

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...

Если мы считаем, что следующее поколение будет создано на полпути между персонажами:

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
 ... 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 ...

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
 ... 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 ...

тогда оба сместились бы на 3,5 элемента. Однако мы не считаем, что следующее поколение будет создано с этим смещением на половину элемента, поэтому один округляет до сдвига из 4 элементов, давая период 15, а другой округляет до сдвига из 3 элементов, давая период из 5

По этой причине мы считаем, что асимметричная строка и ее отражение различны, хотя циклы в некотором смысле изоморфны. Конечно, если они образуют часть одного и того же цикла, то он считается только одним циклом.


С этими ограничениями небольшая математика может показать, что на самом деле существует конечное число циклов Диффи с любым заданным конечным периодом. Более того, каждая бесконечная строка с конечным периодом является бесконечным повторением конечной строки.

Обратите внимание, что строки могут быть больше или короче, чем периоды. Например, есть строка длиной 5 с периодом 15 и строка длиной 15 с периодом 5. Все строки с периодом 19 имеют длину 9709.

задача

Учитывая число, nтакое, что n больше 1 с помощью стандартных методов ввода, определите количество различных циклов Диффи с периодом точно n.

(Похоже, что в литературе 0часто не считают периодической игрой Диффи. Так как это серая область, я не буду просить вас решить n = 1)

Это , поэтому цель состоит в том, чтобы минимизировать количество байтов в исходном коде.

Тестовые случаи

2  ->   0
3  ->   1
4  ->   0
5  ->   1
6  ->   1
7  ->   3
8  ->   0
9  ->   4
10 ->   4
11 ->   3
12 ->   5
13 ->   5
14 ->  24
15 ->  77
16 ->   0
17 -> 259
18 -> 259
19 ->  27
20 -> 272
21 -> 811
22 -> 768
23 ->  91
24 -> 340
25 -> 656

Советы

Все периодические игры с диффузией будут содержать только ноль и одну константу, это означает, что каждая периодическая игра будет изоморфна некоторой игре с диффузией, состоящей только из нулей и единиц.



Существуют 010001->111001->000101->100111->010100->011110->010001и 110110->101101->011011->110110различны?
Mirac7

@ Mirac7 Извините, это было так долго, я уверен, что эти игры отличны
Wheat Wizard

Ответы:


6

Python 2 , 181 байт

n=input()
m=2**n
a=[m]*m
r=lambda i:[i*-~m>>k&m-1 for k in range(n)]
def s(i):
 if a[i]&m:a[i]=i;a[i]=s(min(r(i^i*2)))
 return a[i]
print sum(min(r(i)[1:])>i==s(i)for i in range(m))

Попробуйте онлайн!

Как это работает

Правила, которые преобразуют каждую строку бинарной игры-диффузии в следующий ряд, аналогичны правилам, которые преобразуют каждый столбец в следующий столбец. Поэтому достаточно , чтобы найти все различные циклы в графе всех канонических длина- п столбцов, где столбец «канонический» , если она лексический меньше , чем все его вращений (это автоматически исключает столбцов с периодом , меньшим , чем п ).

Когда столбцы представлены в виде двоичных чисел 0 ≤ i <2 n , правило отправляет i в наименьшее вращение i XOR ( i ⋅2). (Если я канонический, его старший бит равен нулю, и нам не нужно беспокоиться об этом.)

Таким образом, мы перебираем все возможные столбцы i , проверяем каноничность, затем неоднократно применяем правило, пока не найдем столбец, который мы посетили ранее, запоминая первый такой повторный столбец. Ровно один столбец в каждом цикле будет его собственным первым пересмотренным столбцом.


1
Как это работает?
Пшеничный волшебник

@WheatWizard Добавлено объяснение.
Андерс Касорг

Хорошая работа! Вы заработали награду. @AndersKaseorg
FantaC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.