Temiz , 284 279 272 262 bayt
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]])[]
Çevrimiçi deneyin!
Sonsuza kadar diziyi oluşturur.
Altıgen Eşleme
Kodun çoğu, (x,y)
eşgüdümleri benzersiz şekilde eşleştirmek için tüm nokta eşlemelerini tutan bitişikliği belirleyen tek, basit bir işlev olacak şekilde eşleşir.
Haritalanan noktalar şuna benzer:
---
--- < 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.
---
Oradan, bitişikliği belirlemek önemsizdir ve şunlardan biri olduğunda oluşur:
x1 == x2
ve abs(y1-y2) == 1
y1 == y2
ve abs(x1-x2) == 1
y1 == y2 - 1
ve x2 == x1 - 1
y1 == y2 + 1
ve x2 == x1 + 1
x1 == x2
ve y1 == y2
Nokta Üretimi
Altıgen bir spiral halinde hareket ederken, farkların her katman için yinelendiğine dikkat edin n
:
n
adımları (1,0)
n-1
adımları (1,-1)
n
adımları (0,-1)
n
adımları (-1,0)
n
adımları (-1,1)
n
adımları (0,1)
Bu, bu sıranın öneklerinin toplamlarını alarak doğru sıradaki noktaları oluşturur:
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]]
Bir araya getirmek
Aslında sorudan sırayı bulan kod şudur:
$[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]]
Hangi sırayla çoğunlukla tarafından filtreleme and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Bu filtre şu ana kadar m
(zaten haritalanmış noktaların listesinden) puan alır :
- Herhangi birine eşit olan doğal sayıları dikkate almamak
j
- Bitişik her
(i,j)
yerdei
p
(p,q)
Değerin q
eşit olduğu her yer içinv
- Geçerli noktaya bitişik olan her
(u,v)
yer u
için