Di recente ho letto la teoria dei grafi, in particolare ipercubi e ho pensato a modi interessanti per costruirvi dei percorsi. Ecco cosa mi è venuto in mente.
Come forse saprai, puoi costruire un ipercubo n-dimensionale prendendo tutte le n-tuple costituite da 1
e 0
come vertici e collegandole, se differiscono in una cifra. Se interpretate queste cifre binarie come un numero intero, finirete con un grafico con vertici ben numerati. Ad esempio per n=3
:
Diciamo che vuoi fare una passeggiata su questo ipercubo e iniziare dal vertice 0
. Ora, come si determina quale vertice si desidera visitare dopo? La regola che mi è venuta in mente è prendere il numero a
del vertice in cui ti trovi, capovolgerne il mod(a,n)
bit (indicizzazione in base zero) e passare al vertice risultante. Formalmente questa regola può essere definita in modo ricorsivo come
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Seguendo questa regola, rimarrai sempre sul cubo e viaggerai lungo i bordi. Il percorso risultante è simile al seguente
Come puoi vedere, camminerai in cerchio! In effetti, in tutte le dimensioni e per tutti i punti di partenza, il tuo percorso finirà in un ciclo. Ad esempio per n=14
e a[0]=0
sembra così
Per l'avido ambler, la lunghezza del suo percorso pianificato è un'informazione piuttosto cruciale. Quindi, il tuo compito è quello di scrivere una funzione o un programma che prenda la dimensione dell'ipercubo n
e il vertice iniziale a[0]
come input e produca il numero di vertici nel loop risultante.
Casi test
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Regole
- Sono vietate le scappatoie standard
- Output / Input può essere in qualsiasi formato adatto
- Puoi presumere
a[0]
di essere un vertice valido
punteggio
Vince il codice più breve in byte.
Se hai ulteriori informazioni su questo argomento, sarei felice di sapere!
a[m]
fosse sull'ipercubo, a[m+1]
lo sarà anche. E dato che puoi supporre a[0]
che sia un vertice valido, praticamente non devi preoccuparti di alcun materiale ipercubo e seguire semplicemente la regola.
a[m+1] = xor(a[m], 2^mod(a[m],n))
, è irrilevante se i vertici appartengono a un ipercubo, giusto?