Bersih , 284 279 272 262 byte
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]])[]
Cobalah online!
Menghasilkan urutan selamanya.
Pemetaan Hexagon
Sebagian besar kode masuk ke pemetaan segi enam unik untuk (x,y)
koordinat sehingga ada fungsi tunggal, sederhana untuk menentukan kedekatan yang berlaku untuk semua pemetaan titik.
Poin yang dipetakan terlihat seperti ini:
---
--- < 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.
---
Dari sana, menentukan kedekatan adalah sepele, dan terjadi ketika salah satu dari:
x1 == x2
dan abs(y1-y2) == 1
y1 == y2
dan abs(x1-x2) == 1
y1 == y2 - 1
dan x2 == x1 - 1
y1 == y2 + 1
dan x2 == x1 + 1
x1 == x2
dan y1 == y2
Point Generation
Perhatikan bahwa ketika melintasi hexagon dalam spiral, perbedaannya berulang untuk setiap lapisan n
:
n
langkah-langkah (1,0)
n-1
langkah-langkah (1,-1)
n
langkah-langkah (0,-1)
n
langkah-langkah (-1,0)
n
langkah-langkah (-1,1)
n
langkah-langkah (0,1)
Ini menghasilkan poin dalam urutan yang benar dengan mengambil sejumlah awalan dari urutan ini:
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]]
Menyatukannya
Kode yang benar-benar menemukan urutan dari pertanyaan itu adalah:
$[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]]
Yang pada gilirannya sebagian besar disaring oleh and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Filter ini mengambil poin dari m
(daftar poin yang sudah dipetakan) dengan:
- Mengabaikan bilangan asli yang sama dengan apa pun
j
- Untuk setiap
(i,j)
tempat i
yang berdekatanp
- Untuk setiap
(p,q)
tempat nilainya q
sama denganv
- Untuk setiap
(u,v)
tempat u
yang berbatasan dengan titik saat ini