Propre , 284 279 272 262 octets
import StdEnv
l=[0,-1,-1,0,1,1]
c(u,v)(p,q)=(u-p)^2+(v-q)^2<2||(u-p)*(q-v)==1
$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]
$(scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]])[]
Essayez-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:
---
--- < 2,-2> --- x-axis ___.X'
--- < 1,-2> === < 2,-1> --- /__.X'
< 0,-2> === < 1,-1> === < 2, 0>'
=== < 0,-1> === < 1, 0> ===
<-1,-1> === < 0, 0> === < 1, 1>
=== <-1, 0> === < 0, 1> ===
<-2, 0> === <-1, 1> === < 0, 2>.__
--- <-2, 1> === <-1, 2> --- \ 'Y.___
--- <-2, 2> --- y-axis 'Y.
---
À partir de là, la détermination de l'adjacence est triviale et se produit lorsque l'un des éléments suivants:
x1 == x2
et abs(y1-y2) == 1
y1 == y2
et abs(x1-x2) == 1
y1 == y2 - 1
et x2 == x1 - 1
y1 == y2 + 1
et x2 == x1 + 1
x1 == x2
et y1 == 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:
scan(\(a,b)(u,v)=(a-u,b-v))(0,0)[(i,j)\\n<-[1..],i<-[1,1:l]&j<-l,_<-[max(~j<<i)1..n]]
Le rassembler
Le code qui trouve réellement la séquence de la question est juste:
$[h:t]m=hd[[e: $t[(h,e):m]]\\e<-[1..]|and[e<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]]
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:
- Ignorer les nombres naturels égaux à tout
j
- Pour chaque
(i,j)
où i
est adjacent àp
- Pour chaque
(p,q)
où la valeur q
est égale àv
- Pour chaque
(u,v)
où u
est adjacent au point actuel