@Arnauld 덕분에 -63 바이트. 와.
n=>(E=(x,y,d,k,h)=>V[k=[x+=1-(d%=3),y+=~d%3+1,d]]?0:(V[k]=1,h=H.find(h=>h[0]==x&h[1]==y))?(d^(t=2-h[2])?E(x,y,t)||E(x,y,h[2]*2):E(x,y,t+2)):[x,y,0],I=c=>c.map(([x,y,t])=>[x-g(0),y-g(1),t],g=p=>Math.min(...c.map(h=>h[p]))).sort(),S=e=>(V={},e=E(0,0,0))?(--n&&H.pop(H.push(e),S(),S(e[2]=1),S(e[2]=2)),++n):n-1||E[I(c=H)]||[0,0,0,++N,0,0].map(r=>E[I(c=c.map(([x,y,t])=>[-x-y,r?y:x,(r?t*2:t+1)%3]))]=1))(H=[[N=0,0,1]])&&N
온라인으로 사용해보십시오!
첫째, Arnauld에게 답을 보내면 답이 더 깊이 파고들 것입니다. 코드를 좀 더 쉽게 비교할 수 있도록 Arnauld와 동일한 변수를 사용하도록 일부 코드를 의도적으로 변경했지만 알고리즘을 사용하여 독창적이려고 노력했습니다.
빈 육각형 검색
생물체 검색은 다음과 같습니다.
- 0,0에서 타일 1로 타일 목록 초기화
- 재귀 적으로 :
- 생물을 완성하는 데 필요한 빈 16 진수를 찾으십시오.
- 빈 16 진수가 발견되면
- 16 진수를 비우고 재귀하기 위해 각 유형의 타일 0,1,2 추가
- 빈 16 진수를 찾지 못한 경우
- 생물이 올바른 크기이고 아직 동물원에 있지 않은 경우
- 하나에 의해 발견 된 독특한 생물의 수 증가
- 동물원에 생물의 모든 회전과 반사를 추가
빈 육각형을 검색 한 결과 흥미로운 대칭이 발견되었습니다. Arnauld는 6 가지 방향 중 하나는 무시해도되지만 실제로 6 개 중 3 개는 무시할 수 있음을 발견했습니다!
Arnauld의 원래 방향과 타일 키는 다음과 같습니다.
파란색 점에서 유형 1의 타일 A에서 시작한다고 상상해보십시오. d = 0과 d = 5로 되풀이해야 할 것 같습니다. 그러나 d = 0에 배치 된 타일은 반드시 d = 4로 종료되며, d = 5에서 타일 A를 종료하는 것과 같은 16 진수를 방문합니다. 그것이 Arnauld의 발견이며, 제가 생각하기 시작한 것입니다.
그것을주의해라:
즉, 방향 0,2,4 만 고려하면됩니다. 방향 1, 3, 5에 도달 할 수있는 육각형은 방향 0, 2 또는 4를 사용하여 인접한 16 진수에서 도달 할 수 있기 때문에 방향 1, 3, 5의 출구는 무시할 수 있습니다.
얼마나 멋진가요?!
레이블이 지정된 방향
따라서 다음과 같이 방향과 타일의 레이블을 다시 지정합니다 (Arnauld의 이미지 편집).
이제 우리는 타일, 입구 및 출구 사이에 다음과 같은 관계가 있습니다.
| t=0 | t=1 | t=2
----+-------+-------+-------
d=0 | 0,2 | 1,2 | 2
d=1 | 0,2 | 0 | 0,1
d=2 | 1 | 1,2 | 0,1
따라서 종료는 다음과 같습니다. d + t == 2? (4-t) % 3 : 2-t 및 2 * t % 3
6 각형 회전 및 반사
회전과 반사 를 위해 x, y, z 큐브 좌표 대신 x, y 육각 축 좌표를 사용 하기로 결정했습니다 .
-1,2 0,2 1,2 2,2
0,1 1,1 2,1
0,0 1,0 2,0 3,0
이 시스템에서는 회전과 반사가 예상보다 간단했습니다.
120 Rotation: x=-x-y y=x t=(t+1)%3
Reflection: x=-x-y y=y t=(t*2)%3
내가 수행 한 모든 조합을 얻으려면 : 썩음, 썩음, 썩음, 반영, 썩음, 썩음
코드 (원본 480 바이트)
f=n=>(
// H:list of filled hexes [x,y,tile] during search for a complete creature
// N:number of distinct creatures of size n
// B:record of all orientations of all creatures already found
H=[[0,0,1]],N=0,B={},
// E: find an empty hex required to complete creature starting in direction d from x,y
E=(x,y,d,k,h)=>(
x+=1-d,
y+=1-(d+1)%3,
// V: list of visited hexes during this search in E
V[k=[x,y,d]] ?
0
: (V[k]=1, h=H.find(h=>h[0]==x&&h[1]==y)) ?
// this hex is filled, so continue search in 1 or 2 directions
(d==2-h[2] ? E(x,y,(4-h[2])%3) : (E(x,y,2-h[2]) || E(x,y,h[2]*2%3)))
: [x,y,0] // return the empty hex
),
// I: construct unique identifier for creature c by moving it so x>=0 and y>=0
I=c=>(
M=[0,1].map(p=>Math.min(...c.map(h=>h[p]))),
c.map(([x,y,t])=>[x-M[0],y-M[1],t]).sort()
),
// A: add complete creature c to B
A=c=>{
n==1&&!B[I(c)]&&(
// creature is correct size and is not already in B
N++,
[0,0,0,1,0,0].map(
// Add all rotations and reflections of creature into B
// '0' marks a rotation, '1' marks a (vertical) reflection
// rotation: x=-x-y y=x t=(t+1)%3
// reflection: x=-x-y y=y t=(t*2)%3
r=>B[I(c=c.map(([x,y,t])=>[-x-y,r?y:x,(r?t*2:t+1)%3]))]=1)
)
},
// S: recursively search for complete creatures starting with hexes H
S=e=>{
V={};
(e=E(0,0,0)) ?
// e is a required empty hex, so try filling it with tiles 0,1,2
(--n && (H.push(e),S(),S(e[2]=1),S(e[2]=2),H.pop()), ++n)
: A(H) // creature is complete, so add it to B
},
S(),
N
)
코드 (Arnauld 417 바이트)
Arnauld는 친절하게 63 바이트 절약을 제출하여 트릭을 사용하여 머릿속을 감싸는 데 상당한 시간이 걸렸습니다. 그것은 많은 흥미로운 편집이 있기 때문에, 나는 그의 코드를 아래에 넣을 것이라고 생각했습니다 (내 의견을 추가했습니다). 내 버전과 대조 될 수 있습니다.
f=n=>(
// E:find an empty hex required to complete creature starting in direction d from x,y
E=(x,y,d,k,h)=>
V[k=[x+=1-(d%=3),y+=~d%3+1,d]] ?
0
:(V[k]=1,h=H.find(h=>h[0]==x&h[1]==y)) ?
(d^(t=2-h[2]) ? E(x,y,t) || E(x,y,h[2]*2) : E(x,y,t+2))
:[x,y,0],
// I: construct unique identifier for creature c by moving it so x>=0 and y>=0
I=c=>c.map(([x,y,t])=>[x-g(0),y-g(1),t],g=p=>Math.min(...c.map(h=>h[p]))).sort(),
// S: recursively search for complete creatures starting with hexes H
S=e=>
(V={},e=E(0,0,0)) ?
(--n&&H.pop(H.push(e),S(),S(e[2]=1),S(e[2]=2)),++n)
:n-1
||E[I(c=H)]
// creature is the correct size and has not been seen before
// so record all rotations and reflections of creature in E[]
||[0,0,0,++N,0,0].map(r=>E[I(c=c.map(([x,y,t])=>[-x-y,r?y:x,(r?t*2:t+1)%3]))]=1)
)
// This wonderfully confusing syntax initializes globals and calls S()
(H=[[N=0,0,1]]) && N
n=10
TIO 를 처리 할 수 있어야합니다 ." -이것이 실행 속도 요구 사항이라면 code-golf 대신 code-challenge 를 사용 하십시오. 후자는 순수한 바이트 최적화 작업을 나타냅니다.