ทำความสะอาด , 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อยู่ติดกับจุดปัจจุบัน