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!
la source
a[m+1] = xor(a[m], 2^mod(a[m],n))
, ce n'est pas pertinent si les sommets appartiennent à un hypercube, non?a[m]
était sur l'hypercube, lea[m+1]
sera aussi. Et comme vous pouvez supposera[0]
être un sommet valide, vous n'avez pratiquement pas besoin de vous soucier de tout hypercube et de simplement suivre la règle.Réponses:
Gelée, 9 octets
Prend deux arguments de ligne de commande.
Essayez-le ici .
la source
Haskell, 124
Cela trouve le cercle par l'algorithme à deux pointeurs circulant à différentes vitesses et utilise fortement / abuse l'approche de Haskell des listes (par exemple, les deux pointeurs sont en fait des listes).
g
est la fonction qui calcule la réponse. donnez-len
et puisa[0]
et il vous renverra le numéro (notez que celan
devrait être défini comme étant de typeInt
pour éviter toute ambiguïté de type).la source
JavaScript (ES6), 69 octets
Renvoie 18812 pour (23, 10).
la source
MATL ,
383728 octetsCela fonctionne dans la version actuelle (15.0.0) de la langue.
Essayez-le en ligne !
Explication
la source
Pyth,
2217 octetsExplication:
Essayez-le ici .
la source