Dessiner le triangle de Sierpinski a été fait à mort . Nous pouvons cependant faire d’autres choses intéressantes. Si nous plions les yeux au triangle, nous pouvons voir les triangles à l'envers comme des nœuds d'un graphe fractal. Trouvons notre chemin autour de ce graphique!
Premièrement, assignons un numéro à chaque nœud. Le triangle inversé le plus grand sera le nœud zéro, puis nous descendons couche par couche (largeur d'abord) en attribuant des nombres consécutifs dans l'ordre haut-gauche-droite:
Cliquez pour une version plus grande où les petits nombres sont un peu moins flous.
(Bien sûr, ce modèle continue à l' infini dans les triangles bleus.) Une autre façon de définir la numérotation est que le noeud central a l' index 0
, et les enfants de noeud i
(triangles adjacents de la prochaine plus petite échelle) ont des indices 3i+1
, 3i+2
et 3i+3
.
Comment pouvons-nous nous déplacer dans ce graphique? Il y a jusqu'à six étapes naturelles que l'on peut entreprendre dans n'importe quel triangle:
- On peut toujours passer par le milieu d'une des arêtes à l'un des trois enfants du nœud actuel. Nous désignerons ces mouvements comme
N
,SW
etSE
. Par exemple , si nous sommes actuellement sur le nœud2
, ces conduirait à des noeuds7
,8
,9
respectivement. Les autres mouvements à travers les bords (vers les descendants indirects) sont interdits. - On peut aussi se déplacer dans l’un des trois coins, à condition qu’il ne touche pas le bord du triangle, jusqu’au parent direct ou à l’un des deux ancêtres indirects. Nous désignerons ces mouvements comme
S
,NE
etNW
. Par exemple, si nous sommes actuellement sur un nœud31
,S
conduirait à10
,NE
serait invalide etNW
conduirait à0
.
Le défi
Etant donné deux entiers non négatifs x
et y
, trouvez le chemin le plus court allant de x
à y
, en utilisant uniquement les six mouvements décrits ci-dessus. S'il existe plusieurs chemins les plus courts, indiquez l'un d'entre eux.
Notez que votre code devrait fonctionner pour plus que les 5 niveaux décrits dans le diagramme ci-dessus. Vous pouvez supposer que x, y < 1743392200
. Cela garantit qu'ils tiennent dans un entier signé 32 bits. Notez que cela correspond à 20 niveaux de l’arbre.
Votre code doit traiter toute entrée valide en moins de 5 secondes . Bien que cela exclue une recherche en force brute avec une largeur d'abord, cela devrait être une contrainte assez vague - mon implémentation de référence gère les entrées arbitraires pour la profondeur 1000 en une demi-seconde (c'est-à-dire des nombres à 480 chiffres pour les nœuds).
Vous pouvez écrire un programme ou une fonction en prenant l’entrée via STDIN (ou l’alternative la plus proche), un argument de ligne de commande ou une argumentation de fonction et en générant le résultat via STDOUT (ou l’alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
La sortie doit être une liste plate, sans ambiguïté des cordes N
, S
, NE
, NW
, SE
, SW
, à l' aide de tout séparateur raisonnable (espaces, virgules, retoursLigne, ","
...).
Les règles standard de code-golf s'appliquent.
Cas de test
Les premiers cas de test peuvent être élaborés à la main en utilisant le diagramme ci-dessus. Les autres veillent à ce que les réponses soient suffisamment efficaces. Pour ceux-là, il peut y avoir d'autres solutions de même longueur qui ne sont pas listées.
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE
la source
APL (Dyalog Unicode) ,
144132129118 118133132130124117 octets SBCSMerci beaucoup à Ven et à Ngn pour leur aide à jouer au golf dans The APL Orchard , un endroit formidable pour apprendre le langage APL.
⎕IO←0
. Les suggestions de golf sont les bienvenues.Édition: -12 octets grâce à Ven et ngn en changeant la
n
définition et en passant de 1 à 2 index. -3 en raison de la correction d'un bogue où tout n'était pas passé à l'indexation 0. -11 octets dus au changement de commentP
etQ
sont définis. +15 octets en raison de la résolution d'un problème d'algorithme incorrect, merci beaucoup à ngn pour son aide dans le calcul de las[⊃⍋|M-s]
section. -2 octets pour réorganiser la méthode de recherche du chemin de retour et +1 octet pour la correction des bogues. -2 octets, grâce à Adám, qui a modifié la définition deI
. -6 octets grâce à ngn pour avoir réorganisé la définition de'S' 'NE' 'NW' 'N' 'SW' 'SE'
et en réorganisé commentt
(la variable n'est plus une variable séparée). -7 octets grâce à ngn de la façon dont le golfs
est défini.Essayez-le en ligne!
Une explication du bug dans l'algorithme
Le problème fondamental est que je pensais que le chemin le plus court passait directement par l'ancêtre commun et ne pouvait en fait pas passer par un ancêtre de cet ancêtre commun. Ceci est incorrect comme le montrent les exemples suivants.
De 66 à 5
De 299792458 à 45687
Explication du code
Solution alternative utilisant Dyalog Extended et dfns
Si nous utilisons
⎕CY 'dfns'
de »adic
la fonction, il met en œuvre notre base n numeration bijective (qui a été l'inspiration pour l'utilisation de la version I) pour les octets beaucoup moins. Le passage à Dyalog Extended permet également d’économiser un grand nombre d’octets. Merci beaucoup à Adám pour son aide dans le golf. Suggestions de golf bienvenues!Edit: -8 octets en raison de la modification de comment
P
etQ
sont définis. -14 octets en raison du passage à Dyalog Extended. -2 en raison de l’utilisation d’un programme complet pour supprimer les supports DFN{}
. +17 octets en raison de la résolution d'un problème d'algorithme incorrect, merci beaucoup à ngn pour son aide dans le calcul de las[⊃⍋|M-s]
section. +1 octet pour la correction de bugs. -2 octets grâce à Adám d'avoir modifié la définitionI
et -1 octet de se souvenir de mettre mes golfs dans les deux solutions. -3 octets grâce à ngn en réorganisant la génération des directions cardinales, +1 octet pour corriger un golf buggy, et -3 octets grâce à ngn en réorganisant le mode det
définition (il ne s'agit plus d'une variable séparée). -7 octets grâce à ngn en réorganisant las
définition.APL (Dyalog Extended) ,
12311510199116117114109102 octetsEssayez-le en ligne!
la source