청소 , 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