Polystrips adalah subset dari polyomino yang sesuai dengan aturan berikut:
- masing-masing bagian terdiri dari 1 atau lebih sel
- tidak ada sel yang dapat memiliki lebih dari dua tetangga
- sel-sel seharusnya tidak menutup lubang
Polyomino bebas berbeda ketika tidak ada transformasi kaku (terjemahan, rotasi, refleksi atau glide refleksi) dari yang lain (potongan yang dapat diambil dan dibalik). Menerjemahkan, memutar, memantulkan, atau meluncur yang mencerminkan polyomino gratis tidak mengubah bentuknya ( Wikipedia )
Misalnya, ada 30 heptastrip gratis (polistrip dengan panjang 7). Berikut semuanya, dikemas dalam kisi 14x15.
Kredit gambar: Miroslav Vicher
Tujuan
Tulis program / fungsi yang mengambil bilangan bulat positif n
sebagai input dan menghitung n
-polistrip bebas yang berbeda .
n = 1 -> 1 (Satu kotak)
n = 2 -> 1 (Hanya ada satu kemungkinan 2-polystrip yang terbuat dari 2 kotak)
n = 3 -> 2 (Satu terdiri dari 3 kotak bergabung dalam satu garis dan yang lainnya berbentuk L)
n = 4 -> 3 (Satu lurus, satu berbentuk L dan satu berbentuk Z)
. . .
Kasus uji:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
Mencetak gol
Ini kode-golf , jadi kode yang lebih pendek lebih baik. Saya akan sangat menghargai penjelasan rinci tentang algoritma dan kodenya.
Implementasi referensi parsial dalam J
Saya memutuskan untuk menggambarkan setiap bagian dalam format "vektor" dan saya hanya perlu n-2 blok untuk menggambarkan bagian n-polystrip (hanya ada 1 2-polystrip dan dikembalikan secara eksplisit). Blok menggambarkan arah relatif: 0 - tidak ada perubahan; 1 - belok kiri; 2 - belok kanan. Tidak masalah ke arah mana seseorang akan mulai tetapi hanya untuk menunjukkan di mana sel selanjutnya akan diletakkan. Bisa ada jumlah 0s berurutan, tetapi 1s dan 2s selalu tunggal. Implementasi ini parsial, karena tidak memperhitungkan lubang - solusi untuk n> 6 juga menghitung bagian yang berlubang.
101010
dalam notasi sampel Anda)?