Trouver des jeux Diffy

27

Un jeu amusant à jouer si vous vous ennuyez est le jeu Diffy . C'est un jeu à un joueur qui est assez simple et peut consommer une bonne partie de votre temps.

Le jeu Diffy fonctionne comme suit: Vous commencez avec une liste d'entiers non négatifs, dans cet exemple, nous utiliserons

3 4 5 8

Ensuite, vous prenez la différence absolue entre les nombres adjacents

 (8)  3   4   5   8
    5   1   1   3

Ensuite, vous répétez. Vous répétez jusqu'à ce que vous réalisiez que vous êtes entré dans une boucle. Et puis généralement le jeu recommence depuis le début.

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

Souvent, le jeu n'a pas de but, vous ne faites que gagner du temps en faisant de l'arithmétique dans votre tête. Cependant, quand j'ai le plaisir de jouer à ce jeu, mon objectif est toujours d'essayer de choisir une période et d'essayer de construire un jeu qui boucle avec cette période particulière.

Tous les jeux ne sont pas périodiques, l'exemple ci-dessus n'est pas périodique par exemple car il atteint finalement un jeu avec tous les zéros et ne peut donc jamais revenir à sa position de départ. En fait, il semble que la grande majorité des jeux ne soient pas périodiques, ce qui fait des quelques jeux qui sont un joyau rare.


Étant donné un jeu qui boucle avec une période particulière, il est trivial de créer un autre jeu qui boucle avec la même période en doublant simplement la séquence. Par exemple le jeu:

1 0 1

Joue exactement la même chose que le jeu:

1 0 1 1 0 1

En fait, nous pouvons considérer que les deux sont vraiment le jeu à répétition infinie:

... 1 0 1 ...

Nous les considérerons comme un jeu pour relever ce défi.

De la même manière, multiplier la séquence entière par une constante préservera également la période de manière triviale, nous allons donc une fois de plus compter deux jeux qui diffèrent par un facteur constant pour être le même jeu.


Les chaînes infinies ... 1 0 1 ...et ... 0 1 1 ...sont évidemment la même chaîne décalée d'un caractère. Nous ne les compterons pas comme des jeux différents, mais lorsque l'un atteint l'autre, il ne sera pas considéré comme la fin du cycle lors de la détermination de la période d'un jeu. Par exemple:

Les deux jeux

... 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

et

... 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

sont tous les deux des jeux avec la période 6. Ils ne partagent aucun terme les uns avec les autres à aucun moment de leurs boucles (contrairement ... 1 1 0 ...et ... 1 0 1 ...qui se rejoignent) mais parce qu'ils sont des versions décalées les uns des autres, ils sont considérés comme le même jeu lors du comptage.


La réflexion (ou l'inversion) d'une chaîne infinie donne essentiellement le même comportement, mais ne donne pas nécessairement la même période. Considérez, par exemple,

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

et son reflet

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

Si l'on considérait que la prochaine génération serait produite à mi-chemin entre les personnages:

... 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 ...

alors les deux auraient décalé la position de 3,5 éléments. Cependant, nous ne considérons pas que la prochaine génération soit produite avec ce décalage d'un demi-élément, donc l'un arrondit à un décalage à 4 éléments donnant une période de 15, et l'autre arrondit à un décalage à 3 éléments donnant une période de 5.

Pour cette raison, nous considérons une chaîne asymétrique et sa réflexion comme distinctes, même si les cycles sont en quelque sorte isomorphes. Bien sûr, s'ils font partie du même cycle, cela ne compte que pour un cycle.


Avec ces restrictions, un peu de mathématiques peuvent montrer qu'il existe en fait un nombre fini de cycles Diffy avec une période finie donnée. De plus, chaque chaîne infinie avec une période finie est une répétition infinie d'une chaîne finie.

Notez que les chaînes peuvent être plus grandes ou plus courtes que les périodes. Par exemple, il existe une chaîne de longueur 5 avec période 15 et une chaîne de longueur 15 avec période 5. Toutes les chaînes avec période 19 sont de longueur 9709.

Tâche

Étant donné un nombre ntel que n est supérieur à 1 via des méthodes d'entrée standard, déterminez le nombre de cycles Diffy distincts avec une période d'exactement n.

(Il semble que, dans la littérature, il 0n'est souvent pas considéré comme un jeu Diffy périodique. Comme il s'agit d'une zone grise, je ne vous demanderai pas de la résoudre n = 1)

C'est du , donc l'objectif est de minimiser le nombre d'octets dans votre code source.

Cas de test

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

Astuces

Tous les jeux périodiques diffy ne contiendront que zéro et une seule constante, cela signifie que chaque jeu périodique sera isomorphe à certains jeux diffy composés uniquement de zéros et de uns.

Assistant de blé
la source
Ok, j'ai créé une salle de chat: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor
Sont 010001->111001->000101->100111->010100->011110->010001et 110110->101101->011011->110110distincts?
Mirac7
@ Mirac7 Désolé, ça fait si longtemps, je suis presque sûr que ces jeux sont distincts
Wheat Wizard

Réponses:

6

Python 2 , 181 octets

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))

Essayez-le en ligne!

Comment ça marche

Les règles qui transforment chaque ligne d'un jeu diffy binaire en ligne suivante sont les mêmes que les règles qui transforment chaque colonne en colonne suivante. Par conséquent, il suffit de trouver tous les cycles distincts dans le graphique de toutes les colonnes de longueur canonique n , où une colonne est «canonique» si elle est lexicographiquement plus petite que toutes ses rotations (cela exclut automatiquement les colonnes dont la période est inférieure à n ).

Avec des colonnes représentées par des nombres binaires 0 ≤ i <2 n , la règle envoie i à la plus petite rotation de i XOR ( i ⋅2). (Si i est canonique, son bit haut est nul et nous n'avons pas à nous soucier du bouclage ici.)

Nous parcourons donc toutes les colonnes possibles i , vérifions la canonicité, puis appliquons à plusieurs reprises la règle jusqu'à ce que nous trouvions une colonne que nous avons visitée auparavant, en mémorisant la première colonne revisitée. Exactement une colonne dans chaque cycle sera sa propre première colonne revisitée.

Anders Kaseorg
la source
1
Comment cela marche-t-il?
Wheat Wizard
@WheatWizard Ajout d'une explication.
Anders Kaseorg
Bon travail! Vous avez gagné la prime. @AndersKaseorg
FantaC