Contexte
La séquence OEIS A272573 décrit une spirale sur une grille hexagonale comme suit:
Commencez une spirale de nombres sur un pavage hexagonal, avec l'hexagone initial sous la forme a (1) = 1. a (n) est le plus petit entier positif non égal ou précédemment adjacent à ses voisins.
La séquence commence
1, 2, 3, 4, 5, 6, 7, 4, 6, 8, 5, 9, 8, 10, 2, 11, ...
Voici une illustration du motif en spirale:
a(11) != 1
car alors3
et1
serait adjacent à deux endroits.a(11) != 2
car alors3
et2
serait adjacent à deux endroits.a(11) != 3
car alors3
serait adjacent à lui-même.a(11) != 4
car alors3
et4
serait adjacent à deux endroits.- Par conséquent
a(11) = 5
.
Défi
Le défi consiste à écrire un programme qui calcule A272573 . C'est le code-golf , donc le code le plus court l'emporte.
code-golf
sequence
hexagonal-grid
Peter Kagey
la source
la source
Réponses:
JavaScript (ES6),
267 .. 206199 octetsRenvoie un tableau contenant les premiers termes de la séquence.N
Essayez-le en ligne!
Comment?
Définitions
Par convention, nous appellerons cellule de coin une cellule qui n'a qu'un seul bord en commun avec la couche précédente de la spirale et cellule latérale une cellule qui a deux bords en commun avec la couche précédente. Comme suggéré par Ourous, nous pouvons également les considérer comme des cellules d'ordre 1 et des cellules d'ordre 2, respectivement.
Les cellules d'angle sont représentées en jaune ci-dessous. Toutes les autres cellules sont des cellules latérales (sauf la cellule centrale qui est un cas spécial).
À propos des voisins de cellule
Nous n'avons pas vraiment besoin de suivre les coordonnées des cellules de la grille. La seule chose que nous devons savoir est la liste des cellules voisines pour chaque cellule de la spirale à un moment donné.
Dans les diagrammes suivants, les voisins de la couche précédente sont représentés en teinte claire et les voisins supplémentaires de la couche actuelle en teinte plus foncée.
Une cellule a 2 voisins parmi les cellules précédentes si:
Une cellule a 3 voisins parmi les cellules précédentes si:
Implémentation de voisins de cellule
L'index de la cellule courante (commençant à ) est stocké dans . La liste des voisins d'une cellule est stockée dans .1 je n A [ n ]
Pour des raisons de golf obscures, nous calculons d'abord les décalages opposés des voisins. Par exemple, signifie , ce qui signifie la cellule précédente .1 - 1
Dans le code ci-dessus:
Nous traitons ensuite unek i - k
map()
boucle qui convertit les décalages en indices ( ) et poussons la cellule actuelle comme nouveau voisin pour toutes les cellules voisines, pour imposer la symétrie de voisinage.Recherche du prochain terme de la séquence
Maintenant que nous avons une liste à jour des voisins pour toutes les cellules, nous pouvons enfin calculer le prochain terme de la séquence, en utilisant une autre fonction d'aide récursive.k
La valeur d'une cellule est stockée dans .n v [ n ]
la source
Propre ,
284279272262 octetsEssayez-le en ligne!
Génère la séquence pour toujours.
Cartographie hexagonale
La plupart du code est utilisé pour mapper des hexagones uniquement aux
(x,y)
coordonnées de sorte qu'il existe une fonction simple et simple pour déterminer la contiguïté qui s'applique à tous les mappages de points.Les points mappés ressemblent à ceci:
À partir de là, la détermination de l'adjacence est triviale et se produit lorsque l'un des éléments suivants:
x1 == x2
etabs(y1-y2) == 1
y1 == y2
etabs(x1-x2) == 1
y1 == y2 - 1
etx2 == x1 - 1
y1 == y2 + 1
etx2 == x1 + 1
x1 == x2
ety1 == y2
Génération de points
Notez que lors de la traversée de l'hexagone en spirale, les différences se reproduisent pour chaque couche
n
:n
étapes de(1,0)
n-1
étapes de(1,-1)
n
étapes de(0,-1)
n
étapes de(-1,0)
n
étapes de(-1,1)
n
étapes de(0,1)
Cela génère les points dans le bon ordre en prenant des sommes de préfixes de cette séquence:
Le rassembler
Le code qui trouve réellement la séquence de la question est juste:
Qui à son tour est principalement filtré par
and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Ce filtre prend des points de
m
(la liste des points déjà mappés) par:j
(i,j)
oùi
est adjacent àp
(p,q)
où la valeurq
est égale àv
(u,v)
oùu
est adjacent au point actuella source