J'ai récemment lu sur la théorie des graphes, en particulier les hypercubes et réfléchi à des façons intéressantes de construire des chemins sur eux. Voici ce que j'ai trouvé.
Comme vous le savez peut-être, vous pouvez construire un hypercube à n dimensions en prenant tous les n-tuples constitués 1
et en 0
tant que sommets et les connecter, ssi ils diffèrent sur un chiffre. Si vous interprétez ces chiffres binaires comme un nombre entier, vous vous retrouvez avec un graphique avec des sommets bien numérotés. Par exemple pour n=3
:
Disons que vous voulez vous promener sur cet hypercube et commencer au sommet 0
. Maintenant, comment déterminez-vous le sommet que vous souhaitez visiter ensuite? La règle que j'ai trouvée est de prendre le numéro a
du sommet sur lequel vous êtes, de retourner son mod(a,n)
bit s (indexation à base zéro) et d'aller au sommet résultant. Formellement, cette règle peut être définie récursivement comme
a[m+1] = xor(a[m], 2^mod(a[m],n)).
En suivant cette règle, vous resterez toujours sur le cube et voyagerez le long des bords. Le chemin résultant ressemble à ceci
Comme vous pouvez le voir, vous marcherez en cercle! En fait, dans toutes les dimensions et pour tous les points de départ, votre chemin se terminera en boucle. Par exemple pour n=14
et a[0]=0
cela ressemble à ceci
Pour l'ambler passionné, la longueur de son itinéraire prévu est une information assez cruciale. Donc, votre travail consiste à écrire une fonction ou un programme qui prend la dimension de l'hypercube et n
le sommet de départ a[0]
comme entrées et à afficher le nombre de sommets dans la boucle résultante.
Cas de test
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Règles
- Les failles standard sont interdites
- La sortie / entrée peut être dans n'importe quel format approprié
- Vous pouvez supposer
a[0]
être un sommet valide
Notation
Le code le plus court en octets gagne.
Si vous avez des informations supplémentaires sur ce sujet, je serais heureux de les entendre!
a[m]
était sur l'hypercube, le a[m+1]
sera aussi. Et comme vous pouvez supposer a[0]
être un sommet valide, vous n'avez pratiquement pas besoin de vous soucier de tout hypercube et de simplement suivre la règle.
a[m+1] = xor(a[m], 2^mod(a[m],n))
, ce n'est pas pertinent si les sommets appartiennent à un hypercube, non?