Знайдіть різні ігри


27

Весела гра, якщо вам нудно - гра Diffy . Це гра з одним гравцем, яка досить проста і може забирати багато часу.

Гра 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 за допомогою стандартних методів введення, визначте кількість різних циклів Diffy з періодом точно n.

(Здається, що в літературі 0часто не вважається періодичною грою Diffy. Оскільки це сіра зона, я не прошу вас вирішити 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

Підказки

Усі періодичні ігри, що містять періодичні дії, містять лише нуль та одну константу, це означає, що кожна періодична гра буде ізоморфною для якоїсь гри, що складається лише з нулів та одиниць.


Гаразд, я створив кімнату чату: chat.stackexchange.com/rooms/56459/diffy-games
Пітер Тейлор

Є 010001->111001->000101->100111->010100->011110->010001і 110110->101101->011011->110110виразними?
Mirac7

@ Mirac7 Вибачте, це було так довго, я майже впевнений, що ці ігри виразні
Wheat Wizard

Відповіді:


6

Пітон 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))

Спробуйте в Інтернеті!

Як це працює

Правила, що перетворюють кожен рядок бінарної дифі-гри в наступний ряд, такі ж, як правила, що перетворюють кожен стовпець у наступний. Тому достатньо знайти всі чіткі цикли у графіку всіх канонічних довжин n стовпців, де стовпець є "канонічним", якщо він лексикографічно менший за всі його обертання (це автоматично виключає стовпчики з періодом, меншим від n ).

Коли стовпці представлені у вигляді двійкових чисел 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.