@Arnauld sayesinde -63 bayt. Vay.
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
Çevrimiçi deneyin!
İlk olarak, cevabı bana daha derine inmemiz için ilham veren Arnauld'a saygı gösterin. Kodları daha kolay karşılaştırılabilir böylece Arnauld ile aynı değişkenleri kullanmak için kasıtlı olarak bazı kodumu değiştirdim, ancak benim algoritmaları ile orijinal olmak zor çalıştım.
Boş altıgenleri arama
Yaratıkların arayışı:
- Fayans 1 ile döşemelerin listesini 0,0 ile başlat
- Tekrarlı:
- Yaratığı tamamlamak için gereken boş bir hex'i arayın
- Boş altıgen bulunursa
- Her altı çini tipini 0,1,2 boş altıgen ve recurse ekleyin
- Boş altıgen bulunmazsa
- Yaratık doğru büyüklükteyse ve halihazırda hayvanat bahçesinde değilse
- Birinin bulduğu farklı canlıların sayısını artırın
- Yaratığın tüm dönüşlerini ve yansımalarını hayvanat bahçesine ekleyin
Boş altıgenler arayışı ilginç bir simetri ortaya çıkardı. Arnauld, altı yönden birinin göz ardı edilebileceğini keşfetti, ancak aslında altı kişiden üçü göz ardı edilebilir!
Arnauld'un orijinal yönü ve döşeme anahtarı:
Mavi noktadaki tip 1 kiremitle başladığımızı düşünün. Görünüşe göre d = 0 ve d = 5'de çürütmek zorundayız. Bununla birlikte, hangi karo d = 0'a yerleştirilirse, d = 4'te kesinlikle bir çıkış olacaktır, bu da d = 5'teki A döşemesinden çıkmakla aynı hex'i ziyaret edecektir. Arnauld'un keşfi bu ve beni düşünmeye iten şey buydu.
Dikkat:
Bu, yalnızca 0,2,4 yönlerini dikkate almamız gerektiği anlamına gelir. 1,3,5 yönlerinde herhangi bir çıkış göz ardı edilebilir, çünkü 1,3,5 yönlerinde ulaşılabilir altıgenlere bunun yerine 0,2 veya 4 yönleri kullanılarak bitişik bir altıgenden ulaşılabilir.
Ne kadar serin!?
Yeniden Etiketlenmiş Yönler
Bu yüzden yönleri ve fayansları yeniden etiketliyorum (Arnauld'un resmi düzenlendi):
Şimdi karolar, girişler ve çıkışlar arasında şu ilişkiye sahibiz:
| 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
Yani çıkışlar: d + t == 2? (4-t)% 3: 2-t ve 2 * t% 3
Altıgen Dönüşler ve Yansımalar
Dönüşler ve yansımalar için, x, y, z küp koordinatları yerine x, y altıgen eksenel koordinatlarını denemeye karar verdim .
-1,2 0,2 1,2 2,2
0,1 1,1 2,1
0,0 1,0 2,0 3,0
Bu sistemde, dönme ve yansıma beklediğimden daha basitti:
120 Rotation: x=-x-y y=x t=(t+1)%3
Reflection: x=-x-y y=y t=(t*2)%3
Yaptığım tüm kombinasyonları elde etmek için: rot, rot, rot, refl, rot, rot
Kod (Orijinal 480 bayt)
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
)
Kod (Arnauld 417 bayt)
Arnauld nazikçe bana kafamı sarmak için biraz zaman alan hileler kullanılan 63 baytlık bir tasarruf sundu. Birçok ilginç düzenlemeye sahip olduğundan, kodumu aşağıya koyacağımı düşündüm (yorumlarımı ekledim), böylece sürümümle kontrast oluşturabilir.
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 üzerinde çalışabilmelidir ." - O bir yürütme hızı gereksinimi ise, kullanın lütfen kod meydan yerine kod golf ikincisi saf bayt optimizasyon görev atıfta bulunarak,.