क्लीन , 284 279 272 262 बाइट्स
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]])[]
इसे ऑनलाइन आज़माएं!
क्रम को हमेशा के लिए पैदा करता है।
षट्भुज मानचित्रण
अधिकांश कोड (x,y)
निर्देशांक के लिए विशिष्ट रूप से मानचित्रण हेक्सागोन्स में जाते हैं ताकि आसन्नता को निर्धारित करने के लिए एक एकल, सरल कार्य हो जो सभी बिंदु मैपिंग के लिए हो।
मैप किए गए अंक इस तरह दिखते हैं:
---
--- < 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.
---
वहाँ से, आसन्न का निर्धारण तुच्छ है, और तब होता है जब एक:
x1 == x2
तथा abs(y1-y2) == 1
y1 == y2
तथा abs(x1-x2) == 1
y1 == y2 - 1
तथा x2 == x1 - 1
y1 == y2 + 1
तथा x2 == x1 + 1
x1 == x2
तथा y1 == y2
प्वाइंट जनरेशन
ध्यान दें कि जब सर्पिल में षट्भुज को पार करते हैं तो प्रत्येक परत के लिए अंतर पुनरावृत्ति होते हैं n
:
n
के कदम (1,0)
n-1
के कदम (1,-1)
n
के कदम (0,-1)
n
के कदम (-1,0)
n
के कदम (-1,1)
n
के कदम (0,1)
यह इस क्रम के उपसर्गों की रकम लेकर सही क्रम में अंक उत्पन्न करता है:
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]]
साथ लाना
कोड जो वास्तव में प्रश्न से अनुक्रम पाता है, वह है:
$[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]]
बदले में, ज्यादातर फ़िल्टरिंग द्वारा किया जाता है and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
यह फ़िल्टर m
(पहले से मैप किए गए बिंदुओं की सूची) से अंक लेता है:
- प्राकृतिक संख्याओं को अनदेखा करना जो किसी के बराबर हैं
j
- हर
(i,j)
जहाँ के i
लिए आसन्न हैp
- प्रत्येक के लिए
(p,q)
जहां मूल्य q
के बराबर हैv
- प्रत्येक के लिए
(u,v)
जहां u
वर्तमान बिंदु से सटे हैं