Sạch sẽ , 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]])[]
Hãy thử trực tuyến!
Tạo chuỗi mãi mãi.
Ánh xạ lục giác
Hầu hết các mã đi vào ánh xạ các hình lục giác duy nhất theo (x,y)
tọa độ sao cho có một hàm đơn giản, đơn giản để xác định tính phụ thuộc cho tất cả các ánh xạ điểm.
Các điểm được ánh xạ trông như thế nà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.
---
Từ đó, việc xác định kề là không đáng kể và xảy ra khi một trong:
x1 == x2
và abs(y1-y2) == 1
y1 == y2
và abs(x1-x2) == 1
y1 == y2 - 1
và x2 == x1 - 1
y1 == y2 + 1
và x2 == x1 + 1
x1 == x2
và y1 == y2
Thế hệ điểm
Lưu ý rằng khi đi qua hình lục giác theo hình xoắn ốc, sự khác biệt sẽ tái diễn cho mỗi lớp n
:
n
các bước của (1,0)
n-1
các bước của (1,-1)
n
các bước của (0,-1)
n
các bước của (-1,0)
n
các bước của (-1,1)
n
các bước của (0,1)
Điều này tạo ra các điểm theo đúng thứ tự bằng cách lấy tổng các tiền tố của chuỗi này:
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]]
Mang nó lại với nhau
Mã thực sự tìm thấy chuỗi từ câu hỏi chỉ là:
$[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]]
Mà lần lượt chủ yếu là lọc bởi and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Bộ lọc này lấy điểm từ m
(danh sách các điểm đã được ánh xạ) theo:
- Bỏ qua các số tự nhiên bằng với bất kỳ
j
- Đối với mọi
(i,j)
nơi i
liền kềp
- Đối với mọi
(p,q)
nơi mà giá trị q
bằngv
- Đối với mọi
(u,v)
nơi u
liền kề với điểm hiện tại