Sauber , 284 279 272 262 Bytes
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]])[]
Probieren Sie es online!
Erzeugt die Sequenz für immer.
Hexagon-Zuordnung
Der größte Teil des Codes wird verwendet, um Sechsecke eindeutig auf (x,y)
Koordinaten abzubilden, sodass eine einzige, einfache Funktion zum Bestimmen der Adjazenz für alle Punktzuordnungen verfügbar ist.
Die abgebildeten Punkte sehen folgendermaßen aus:
---
--- < 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.
---
Von dort aus ist das Bestimmen der Adjazenz trivial und tritt ein, wenn einer der folgenden Zustände vorliegt:
x1 == x2
und abs(y1-y2) == 1
y1 == y2
und abs(x1-x2) == 1
y1 == y2 - 1
und x2 == x1 - 1
y1 == y2 + 1
und x2 == x1 + 1
x1 == x2
und y1 == y2
Punktgenerierung
Beachten Sie, dass beim Durchqueren des Sechsecks in einer Spirale die Unterschiede für jede Schicht erneut auftreten n
:
n
Schritte von (1,0)
n-1
Schritte von (1,-1)
n
Schritte von (0,-1)
n
Schritte von (-1,0)
n
Schritte von (-1,1)
n
Schritte von (0,1)
Dadurch werden die Punkte in der richtigen Reihenfolge generiert, indem die Präfixsummen dieser Reihenfolge verwendet werden:
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]]
Bring es zusammen
Der Code, der tatsächlich die Sequenz aus der Frage findet, lautet einfach:
$[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]]
Die wiederum filtert meist nach and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Dieser Filter bezieht Punkte aus m
(der Liste der bereits zugeordneten Punkte) nach:
- Ignorieren von natürlichen Zahlen, die gleich sind
j
- Für jeden,
(i,j)
an den i
angrenztp
- Für jeden,
(p,q)
bei dem der Wert q
gleich istv
- Für jeden
(u,v)
wo u
ist zum aktuellen Punkt benachbart