Tantangan ini akan membuat Anda menghitung "makhluk" di permainan ubin Palago.
Makhluk adalah segala bentuk tertutup yang dapat dibentuk oleh ubin Palago dengan warna senada dalam kisi heksagonal.
Gim Palago terdiri dari ubin seperti ini:
Ubin ini dapat diputar , , atau tidak sama sekali dan ditempatkan di mana saja pada kisi heksagonal. Sebagai contoh, di sini adalah makhluk (merah) yang membutuhkan 12 ubin.
Tantangan
Tujuan dari tantangan ini adalah untuk menulis sebuah program yang mengambil bilangan bulat n
sebagai input dan menghitung jumlah makhluk (hingga rotasi dan refleksi) yang membutuhkan n
ubin. Program harus mampu menangani hingga n=10
pada TIO . Ini adalah kode-golf , byte paling sedikit menang.
Contoh data
Nilai harus cocok dengan data yang ditemukan di bagian "Jumlah dan Perkiraan Creature" di situs web pembuat . Yaitu
n | output
---+-------
1 | 0
2 | 0
3 | 1
4 | 0
5 | 1
6 | 1
7 | 2
8 | 2
9 | 9
10 | 13
11 | 37
12 | 81
sumber
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.Jawaban:
JavaScript (Node.js) ,
480417 byte-63 byte terima kasih kepada @Arnauld. Wow.
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:
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:
Setiap petak yang memiliki jalan keluar di d = 4 memiliki jalan keluar di d = 3
Setiap petak yang dapat dimasukkan dari d = 0 memiliki jalan keluar di d = 4
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:
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.
Dalam sistem ini, rotasi dan refleksi lebih sederhana daripada yang saya harapkan:
Untuk mendapatkan semua kombinasi yang saya lakukan: membusuk, membusuk, membusuk, memantulkan, membusuk, membusuk
Kode (Asli 480 byte)
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.
sumber
JavaScript (Node.js) ,
578 ... 433431 byteBagaimana?
Arah dan ubin
Kami menggunakan kode berikut untuk kompas 6 arah dan ubin:
Kami berasumsi bahwa makhluk itu berwarna biru.
Koneksi
Kita membutuhkan sebuah meja untuk mengetahui bagian mana dari makhluk itu yang perlu dihubungkan ke ubin lain ketika kita memasukkan ubin tertentu ke arah yang diberikan:
Contoh:
Kumpulan petunjuk yang diperbarui ini pertama kali disandikan ulang sebagai bilangan bulat 5-bit, dan kemudian sebagai karakter ASCII dengan offset tetap sebesar+ 32
Setelah diratakan, ini memberi:
Koordinat
Kredit: www.redblobgames.com
Ini akan membuatnya lebih mudah untuk memproses rotasi dan refleksi pada langkah terakhir dari algoritma.
Pengkodean ubin
Ubin disimpan dalam daftar, tanpa urutan tertentu. Ini berarti bahwa kita tidak perlu khawatir tentang alokasi 2D yang dinamis dan kita dapat dengan mudah beralih pada ubin yang ada. Kelemahannya adalah bahwa, mengingat koordinat tertentu, kita perlu
find()
ubin yang sesuai dalam daftar.Algoritma
Oleh karena itu, ubin ini dikodekan sebagai
[0,0,0,1,1]
.Pada setiap iterasi, kami mencari:
Ubin dengan koneksi yang hilang: dalam hal ini, kami mencoba menyelesaikan koneksi dengan setiap jenis ubin secara berurutan.
Ubin yang sudah terhubung tetapi yang koneksi baru perlu ditambahkan karena mereka telah dicapai dalam arah yang berbeda: dalam hal ini, kami memperbarui topeng arah (dengan bitwise OR) dan memaksa iterasi baru.
Jika semua koneksi valid dan kami telah mencapai jumlah ubin yang diminta, kami masih perlu menguji apakah itu adalah makhluk baru atau hanya versi modifikasi dari yang sudah ada:
Kami menerapkan transformasi berikut:
Kami mengurutkan ubin sesuai dengan koordinat dan jenisnya. (Semacam ini diproses dalam urutan leksikografis, yang baik-baik saja.)
Kami akhirnya memaksa daftar yang dihasilkan ke string kunci yang dapat dibandingkan dengan kunci lainnya.
Kami membatalkan segera setelah kunci yang diketahui cocok, atau menyimpan kunci baru dan meningkatkan hasil akhir jika tidak ada transformasi yang mengarah ke kunci yang dikenal.
Berkomentar
sumber