-63 byte nhờ @Arnauld. Ồ
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
Hãy thử trực tuyến!
Đầu tiên, hãy nhắc lại Arnauld, câu trả lời đã cho tôi cảm hứng để đào sâu hơn. Tôi đã cố gắng hết sức để trở thành bản gốc với các thuật toán của mình, mặc dù tôi đã cố tình thay đổi một số mã của mình để sử dụng các biến giống như Arnauld để mã có thể dễ dàng so sánh hơn.
Tìm kiếm các hình lục giác trống
Việc tìm kiếm sinh vật là:
- Khởi tạo danh sách các ô có ô 1 ở 0,0
- Đệ quy:
- Tìm kiếm một hex trống cần thiết để hoàn thành sinh vật
- Nếu tìm thấy hex rỗng
- Thêm từng loại gạch 0,1,2 vào hex rỗng và lặp lại
- Nếu không tìm thấy hex trống
- Nếu sinh vật có kích thước chính xác và chưa có trong sở thú
- Số lượng sinh vật khác biệt được tìm thấy bởi một
- Thêm tất cả các góc quay và phản xạ của sinh vật vào sở thú
Việc tìm kiếm các hình lục giác trống đã phát hiện ra một đối xứng thú vị. Arnauld phát hiện ra rằng một trong sáu hướng có thể bị bỏ qua, nhưng trên thực tế, ba trong số sáu hướng có thể bị bỏ qua!
Đây là hướng ban đầu và khóa gạch của Arnauld:
Hãy tưởng tượng chúng ta bắt đầu ở ô A loại 1 ở chấm màu xanh. Có vẻ như chúng ta phải lặp lại trong d = 0 và d = 5. Tuy nhiên, bất kỳ ô nào được đặt trong d = 0, chắc chắn nó sẽ có lối ra trong d = 4, sẽ truy cập vào cùng một hex như thoát khỏi ô A trong d = 5. Đó là khám phá của Arnauld, và đó là điều khiến tôi suy nghĩ.
Thông báo rằng:
Điều này có nghĩa là chúng ta chỉ cần xem xét hướng 0,2,4. Bất kỳ lối thoát nào theo hướng 1,3,5 đều có thể bị bỏ qua vì các hình lục giác có thể tiếp cận theo hướng 1,3,5 thay vào đó có thể được tiếp cận từ một hình lục giác liền kề bằng cách sử dụng các hướng 0,2 hoặc 4.
Thật tuyệt phải không!?
Chỉ đường
Vì vậy, tôi đã dán nhãn lại các hướng và gạch như thế này (hình ảnh của Arnauld đã được chỉnh sửa):
Bây giờ chúng ta có mối quan hệ sau đây giữa các ô, mục nhập và lối thoát:
| 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
Vậy lối thoát là: d + t == 2? (4-t)% 3: 2-t và 2 * t% 3
Xoay và phản xạ lục giác
Để quay và phản xạ, tôi quyết định thử tọa độ trục hình lục giác x, y thay vì tọa độ khối x, y, z.
-1,2 0,2 1,2 2,2
0,1 1,1 2,1
0,0 1,0 2,0 3,0
Trong hệ thống này, việc xoay và phản xạ đơn giản hơn tôi mong đợi:
120 Rotation: x=-x-y y=x t=(t+1)%3
Reflection: x=-x-y y=y t=(t*2)%3
Để có được tất cả các kết hợp tôi thực hiện: thối, thối, thối, phản xạ, thối, thối
Mã (480 byte gốc)
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
)
Mã (Arnauld 417 byte)
Arnauld vui lòng gửi một tiết kiệm 63 byte sử dụng các thủ thuật khiến tôi mất khá nhiều thời gian để quấn đầu. Vì nó có nhiều chỉnh sửa thú vị, tôi nghĩ rằng tôi đã đặt mã của anh ấy bên dưới (tôi đã thêm nhận xét của mình) để nó có thể tương phản với phiên bản của tôi.
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
trên TIO." - nếu đó là một yêu cầu tốc độ thực thi, vui lòng sử dụng thử thách mã thay vì mã golf , sau này đề cập đến một nhiệm vụ tối ưu hóa byte thuần túy.