Kubus dapat dibuat dari enam kotak sebagai sisi. Tetapi Anda juga bisa melipat tiga 2x1 persegi panjang menjadi dua dan menempelkannya menjadi satu kubus. Sekarang dalam tantangan ini Anda mendapatkan satu set potongan yang masing-masing terbuat dari kotak, dan Anda harus menentukan apakah Anda dapat memilih potongan untuk membentuk unit kubus. Tidak semua bagian harus digunakan, mungkin ada beberapa yang tersisa.
Detail
Potongan diberikan sebagai string dari dua karakter yang berbeda atau gambar hitam dan putih atau format raster 2D yang nyaman. Berikut ini saya menganggap piksel yang membentuk potongan berwarna hitam, dan latar belakang berwarna putih.
Dua piksel yang berbagi sisi dianggap milik bagian yang sama. Potongan hanya bisa dilipat di sepanjang garis kisi yang memisahkan piksel, dan tidak dapat dipotong. Setiap sisi kubus memiliki ukuran satu piksel, dan setiap sisi kubus hanya dapat dibuat dari satu lapisan tunggal.
Output harus truthy atau falsey nilai.
Testcases
Berikut ini, spasi adalah latar belakang dan simbol hash
#
mewakili potongan.
(lebih banyak untuk ditambahkan)
Sah
##
##
##
#
####
#
# # # # # # #
# ##
## #
Tidak valid
###
###
# #
####
### ## ####
Jalankan cuplikan berikut untuk lebih banyak testcases.
PS: Ini generalisasi dari tantangan ini
Jawaban:
C,
824803 byteCobalah online!
... dan sebelum menjelaskan ini secara terperinci, ada baiknya ikhtisar tingkat tinggi.
Tinjauan Dasar
Algoritma ini menerapkan pencocokan pola untuk mengklasifikasikan setiap polyomino yang ditemukannya dengan pola yang diberikan sebagai subsetnya. Karena polyomino cocok, mereka "tidak ditandai", mengeluarkannya dari pencocokan pola lagi. Klasifikasi awal yang diberikan oleh korek api hanyalah hitungan jumlah ubin di poliomino.
Pencocokan diterapkan terlebih dahulu untuk menyisihkan semua poliomino yang tidak dapat dilipat ke kubus; klasifikasi polyominos ini dibuang. Kecocokan berhasil jika polyomino ini muncul dalam yang tingkat yang lebih tinggi; oleh karena itu, kami hanya peduli pada subset terkecil dari "tidak dapat dilipat" untuk setiap kelas. Ditampilkan di sini bersama dengan penyandian berlapis adalah semua polyominoes tersebut (tidak termasuk refleksi vertikal). Pengkodean menggunakan bit 4-0 dari setiap karakter untuk mewakili kotak pada setiap baris:
Setelah polyomino ini diambil, kami mengelompokkan polomino yang tersisa ke dalam kategori yang relevan. Perlu dicatat bahwa dalam hampir semua kasus, seseorang hanya dapat menemukan poliomino yang tersisa (yang dapat dilipat menjadi kubus) dan hanya mencari jumlah enam. Ada dua pengecualian:
Untuk dapat mengakomodasi pembatasan ini, kami membentuk 8 kategori, dari AH: A untuk monomino (ubin tunggal), B untuk domino, C untuk tromino sudut, D untuk tromino garis, E untuk tetromino garis, E untuk tetromino garis, F untuk tetromino garis, F untuk tetromino lainnya, G untuk pentomino, dan H untuk hexomino. Apa pun yang tidak termasuk dalam salah satu dari kategori ini diabaikan saja. Menghitung poliomino yang termasuk dalam setiap kategori sudah cukup.
Pada akhirnya, kami hanya mengembalikan kebenaran atau kepalsuan berdasarkan persamaan raksasa dan tabulasi ini.
Tidak dikoleksi dengan komentar
sumber