Trova i giochi Diffy


27

Un gioco divertente da giocare se sei annoiato è il gioco Diffy . È un gioco per un giocatore che è piuttosto semplice e può richiedere molto tempo.

Il gioco Diffy funziona nel modo seguente: Inizi con un elenco di numeri interi non negativi, in questo esempio useremo

3 4 5 8

Quindi prendi la differenza assoluta tra i numeri adiacenti

 (8)  3   4   5   8
    5   1   1   3

Quindi ripeti. Ripeti finché non ti accorgi di essere entrato in un ciclo. E poi generalmente il gioco ricomincia dall'inizio.

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

Spesso il gioco non ha obiettivo, stai solo aspettando il tempo facendo l'aritmetica nella tua testa. Tuttavia, quando ho il piacere di giocare a questo gioco, il mio obiettivo è sempre quello di provare a scegliere un periodo e provare a costruire un gioco che si ripercuote in quel determinato periodo.

Non tutti i giochi sono periodici, l'esempio sopra non è periodico, ad esempio perché alla fine raggiunge un gioco con tutti zeri e quindi non può mai tornare alla sua posizione iniziale. In effetti sembra che la stragrande maggioranza dei giochi non sia periodica rendendo i pochi giochi che sono una gemma rara.


Dato un gioco che gira in un determinato periodo, è banale creare un altro gioco che gira con lo stesso periodo semplicemente raddoppiando la sequenza. Ad esempio il gioco:

1 0 1

Gioca esattamente come il gioco:

1 0 1 1 0 1

In effetti, possiamo considerare che entrambi sono davvero il gioco che si ripete all'infinito:

... 1 0 1 ...

Li considereremo un gioco per il bene di questa sfida.

Allo stesso modo, moltiplicare l'intera sequenza per una costante preserverà anche banalmente il periodo, quindi ancora una volta conteremo due giochi che differiscono per un fattore costante per essere lo stesso gioco.


Le stringhe infinite ... 1 0 1 ...e ... 0 1 1 ...sono ovviamente la stessa stringa spostata da un carattere. Non li considereremo come giochi diversi, ma quando uno raggiunge l'altro non sarà considerata la fine del ciclo nel determinare il periodo di un gioco. Per esempio:

I due giochi

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

sono entrambi i giochi con periodo 6. Condividono nessun termine con l'altro in qualsiasi punto della loro cicli (a differenza ... 1 1 0 ...e ... 1 0 1 ...che raggiungono l'un l'altro), ma perché si sono spostati versioni di ogni altro sono considerati lo stesso gioco quando il conteggio.


Riflettere (o invertire) una stringa infinita dà essenzialmente lo stesso comportamento, ma non necessariamente fornisce lo stesso periodo. Considera, ad esempio,

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

e il suo riflesso

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

Se consideriamo che la prossima generazione verrà prodotta a metà strada tra i personaggi:

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

quindi entrambi avrebbero spostato la posizione di 3,5 elementi. Tuttavia, non consideriamo che la prossima generazione sarà prodotta con quell'offset di mezzo elemento, quindi uno arrotonda per eccesso a uno spostamento di 4 elementi dando un periodo di 15, e l'altro arrotonda per difetto a uno spostamento di 3 elementi dando un periodo di 5.

Per questo motivo consideriamo una stringa asimmetrica e il suo riflesso distinti, anche se i cicli sono in qualche modo isomorfi. Naturalmente, se fanno parte dello stesso ciclo, conta solo come un ciclo.


Con queste restrizioni, un po 'di matematica può mostrare che in realtà esiste un numero finito di cicli di Diffy con un dato periodo finito. Inoltre, ogni stringa infinita con un periodo finito è una ripetizione infinita di una stringa finita.

Si noti che le stringhe possono essere più grandi o più corte dei punti. Ad esempio, esiste una stringa di lunghezza 5 con periodo 15 e una stringa di lunghezza 15 con periodo 5. Tutte le stringhe con periodo 19 sono di lunghezza 9709.

Compito

Dato un numero ntale che n sia maggiore di 1 tramite metodi di input standard, determina il numero di cicli di Diffy distinti con un periodo di esattamente n.

(Sembra che, in letteratura, 0spesso non sia considerato un gioco Diffy periodico. Dato che si tratta di un'area grigia, non ti chiederò di risolvere n = 1)

Questo è , quindi l'obiettivo è ridurre al minimo il numero di byte nel codice sorgente.

Casi 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

suggerimenti

Tutti i giochi diffy periodici conterranno solo zero e una singola costante, ciò significa che ogni gioco periodico sarà isomorfo a qualche gioco diffy composto solo da zero e uno.



Sono 010001->111001->000101->100111->010100->011110->010001e 110110->101101->011011->110110distinti?
Mirac7,

@ Mirac7 Mi dispiace che sia passato così tanto tempo, sono abbastanza sicuro che quei giochi siano distinti
Wheat Wizard il

Risposte:


6

Python 2 , 181 byte

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

Provalo online!

Come funziona

Le regole che trasformano ogni riga di un gioco diffy binario nella riga successiva sono le stesse delle regole che trasformano ogni colonna nella colonna successiva. Pertanto, è sufficiente rilevare tutti i cicli distinti all'interno del grafico di tutti length- canoniche n colonne, dove una colonna è “canonica” se è lexicographically minore di tutte le sue rotazioni (automaticamente esclusi colonne con periodo minore di n ).

Con le colonne rappresentate come numeri binari 0 ≤ i <2 n , la regola invia i alla rotazione più piccola di i XOR ( i ⋅2). (Se i è canonico, il suo alto bit è pari a zero e non abbiamo bisogno di preoccuparsi di avvolgente qui.)

Quindi passiamo in rassegna tutte le possibili colonne i , controlliamo la canonicità, quindi applichiamo ripetutamente la regola fino a quando non troviamo una colonna che abbiamo visitato in precedenza, memorizzando la prima di tali colonne rivisitate. Esattamente una colonna in ciascun ciclo sarà la sua prima colonna rivisitata.


1
Come funziona?
Wheat Wizard,

@WheatWizard Aggiunta una spiegazione.
Anders Kaseorg,

Bel lavoro! Hai guadagnato la taglia. @AndersKaseorg
FantaC,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.