-63 byte terima kasih kepada @Arnauld. Wow.
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
Cobalah online!
Pertama, perhatikan Arnauld yang jawabannya memberi saya inspirasi untuk menggali lebih dalam. Saya telah berusaha keras untuk menjadi orisinal dengan algoritma saya, meskipun saya sengaja mengubah beberapa kode saya untuk menggunakan variabel yang sama dengan Arnauld sehingga kode tersebut dapat lebih mudah dibandingkan.
Mencari heksa kosong
Pencarian makhluk adalah:
- Inisialisasi daftar ubin dengan ubin 1 di 0,0
- Secara rekursif:
- Cari hex kosong yang dibutuhkan untuk melengkapi makhluk
- Jika hex kosong ditemukan
- Tambahkan setiap jenis ubin 0,1,2 ke hex kosong dan berulang
- Jika hex kosong tidak ditemukan
- Jika ukuran makhluk benar dan belum ada di kebun binatang
- Jumlah makhluk berbeda yang ditemukan oleh satu
- Tambahkan semua rotasi dan refleksi makhluk ke kebun binatang
Pencarian heksa kosong menemukan simetri yang menarik. Arnauld menemukan bahwa salah satu dari enam arah dapat diabaikan, tetapi pada kenyataannya tiga dari enam arah dapat diabaikan!
Berikut ini arahan asli dan kunci ubin Arnauld:
Bayangkan kita mulai dari ubin A tipe 1 di titik biru. Tampaknya kita harus berulang dalam d = 0 dan d = 5. Namun, ubin mana pun yang ditempatkan di d = 0, itu pasti akan memiliki jalan keluar di d = 4, yang akan mengunjungi hex yang sama seperti keluar dari ubin A di d = 5. Itulah penemuan Arnauld, dan itulah yang mulai saya pikirkan.
Perhatikan itu:
Ini berarti bahwa kita hanya perlu mempertimbangkan arah 0,2,4. Setiap pintu keluar di arah 1,3,5 dapat diabaikan karena heks yang dapat dijangkau dalam arah 1,3,5 malah dapat dicapai dari heks yang berdekatan menggunakan arah 0,2 atau 4.
Betapa kerennya itu!?
Petunjuk Relabelled
Jadi saya menandai ulang arah dan ubin seperti ini (gambar Arnauld diedit):
Sekarang kami memiliki hubungan berikut antara ubin, entri dan keluar:
| 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
Jadi jalan keluarnya adalah: d + t == 2? (4-t)% 3: 2-t dan 2 * t% 3
Rotasi dan Refleksi Heksagonal
Untuk rotasi dan refleksi, saya memutuskan untuk mencoba koordinat sumbu heksagonal x, y alih-alih koordinat kubus 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
Dalam sistem ini, rotasi dan refleksi lebih sederhana daripada yang saya harapkan:
120 Rotation: x=-x-y y=x t=(t+1)%3
Reflection: x=-x-y y=y t=(t*2)%3
Untuk mendapatkan semua kombinasi yang saya lakukan: membusuk, membusuk, membusuk, memantulkan, membusuk, membusuk
Kode (Asli 480 byte)
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
)
Kode (Arnauld 417 byte)
Arnauld dengan ramah mengajukan penghematan 63 byte yang menggunakan trik yang membutuhkan waktu cukup lama untuk membungkus kepala saya. Karena memiliki banyak pengeditan yang menarik, saya pikir saya akan meletakkan kodenya di bawah ini (saya telah menambahkan komentar saya) sehingga dapat dikontraskan dengan versi saya.
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
di TIO." - jika itu adalah persyaratan kecepatan eksekusi, silakan gunakan tantangan kode alih - alih kode-golf , yang terakhir mengacu pada tugas optimasi byte murni.