Encontre Diffy Games


27

Um jogo divertido de jogar, se você está entediado, é o Diffy Game . É um jogo para um jogador que é bastante simples e pode consumir uma boa parte do seu tempo.

O jogo Diffy funciona da seguinte maneira: Você começa com uma lista de números inteiros não negativos; neste exemplo, usaremos

3 4 5 8

Então você toma a diferença absoluta entre números adjacentes

 (8)  3   4   5   8
    5   1   1   3

Então você repete. Você repete até perceber que inseriu um loop. E então geralmente o jogo começa do começo novamente.

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

Muitas vezes, o jogo não tem objetivo, você está apenas aguardando fazendo aritmética em sua cabeça. No entanto, quando tenho o prazer de jogar este jogo, meu objetivo é sempre tentar escolher um período e tentar construir um jogo que se encaixe nesse período específico.

Nem todos os jogos são periódicos, o exemplo acima não é periódico, por exemplo, porque finalmente alcança um jogo com todos os zeros e, portanto, nunca pode voltar à sua posição inicial. De fato, parece que a grande maioria dos jogos não é periódica, tornando os poucos jogos uma jóia rara.


Dado um jogo que faz um loop com um período específico, é trivial criar outro jogo que faça um loop com o mesmo período, apenas duplicando a sequência. Por exemplo, o jogo:

1 0 1

Reproduz exatamente o mesmo que o jogo:

1 0 1 1 0 1

De fato, podemos considerar que ambos são realmente o jogo que se repete infinitamente:

... 1 0 1 ...

Vamos considerá-los um jogo para o bem deste desafio.

De maneira semelhante, multiplicar toda a sequência por uma constante também preservará trivialmente o período, para que mais uma vez contemos dois jogos que diferem por um fator constante para serem o mesmo jogo.


As seqüências infinitas ... 1 0 1 ...e ... 0 1 1 ...obviamente são a mesma sequência deslocada por um caractere. Não os contaremos como jogos diferentes, mas quando um chegar ao outro, não será considerado o fim do ciclo ao determinar o período de um jogo. Por exemplo:

Os dois jogos

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

e

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

ambos são jogos com o período 6. Eles não compartilham termos entre si em nenhum momento de seus loops (ao contrário ... 1 1 0 ...e ... 1 0 1 ...que se alcançam), mas, por serem versões trocadas um do outro, são considerados o mesmo jogo ao contar.


Refletir (ou reverter) uma sequência infinita fornece essencialmente o mesmo comportamento, mas não necessariamente fornece o mesmo período. Considere, por exemplo,

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

e seu reflexo

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

Se considerarmos que a próxima geração será produzida a meio caminho entre os personagens:

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

então ambos teriam mudado de posição em 3,5 elementos. No entanto, não consideramos que a próxima geração seja produzida com esse deslocamento de meio elemento, portanto, um arredonda para um turno de 4 elementos, dando um período de 15, e o outro arredonda para um turno de 3 elementos, dando um período de 5.

Por esse motivo, consideramos uma corda assimétrica e seu reflexo distintos, embora os ciclos sejam, em certo sentido, isomórficos. Obviamente, se eles fazem parte do mesmo ciclo, isso conta apenas como um ciclo.


Com essas restrições, um pouco de matemática pode mostrar que há de fato um número finito de ciclos de Diffy com um determinado período finito. Além disso, toda corda infinita com um período finito é uma repetição infinita de uma corda finita.

Observe que as seqüências de caracteres podem ser maiores ou menores que os períodos. Por exemplo, há uma cadeia de comprimento 5 com o período 15 e uma cadeia de comprimento 15 com o período 5. Todas as cadeias de caracteres com o período 19 são 9709.

Tarefa

Dado um número ntal que n é maior que 1 por métodos de entrada padrão, determine o número de ciclos Diffy distintos com um período exato n.

(Parece que, na literatura, 0muitas vezes não é considerado um jogo Diffy periódico. Como essa é uma área cinzenta, não vou pedir para você resolver n = 1)

Isso é , portanto, o objetivo é minimizar o número de bytes no seu código-fonte.

Casos de teste

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

Dicas

Todos os jogos periódicos diffy conterão apenas zero e uma única constante, isso significa que todos os jogos periódicos serão isomórficos para algum jogo diffy consistindo apenas de zeros e uns.


Ok, eu criei uma sala de bate-papo: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

São 010001->111001->000101->100111->010100->011110->010001e 110110->101101->011011->110110distintos?
precisa saber é o seguinte

@ Mirac7 Desculpe a sua sido tão longo, eu tenho certeza que esses jogos são distintos
Assistente de trigo

Respostas:


6

Python 2 , 181 bytes

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

Experimente online!

Como funciona

As regras que transformam cada linha de um jogo binário diffy na próxima linha são as mesmas que as regras que transformam cada coluna na próxima coluna. Portanto, é suficiente para encontrar todos os ciclos distintos dentro do gráfico de todas as canónicos Length- n colunas, em que uma coluna seja “canónica” se é lexicograficamente menor do que todas as suas rotações (isto automaticamente exclui colunas com período menor do que N ).

Com colunas representadas como números binários 0 ≤ i <2 n , a regra envia i para a menor rotação de i XOR ( i ⋅2). (Se eu for canônico, seu bit alto é zero e não precisamos nos preocupar com a envolvente aqui.)

Então, nós percorrer todas as colunas possíveis i , verifique se há canonicidade, em seguida, aplicar repetidamente a regra até encontrarmos uma coluna que já visitou antes, memoizing o primeiro tal coluna revisitado. Exatamente uma coluna em cada ciclo será sua primeira coluna revisitada.


1
Como é que isso funciona?
Assistente de trigo

@WheatWizard Adicionada uma explicação.
Anders Kaseorg

Bom trabalho! Você ganhou a recompensa. @AndersKaseorg
FantaC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.