Tantangan ini didasarkan pada game Layerz.
Diberikan, pada stdin atau sebagai argumen fungsi, array sel 2D persegi panjang di mana setiap sel berisi salah satu kosong (Anda dapat memilih untuk menggunakan 0s daripada kosong tanpa penalti), 1, 2, 3, atau 4 ; temukan cara untuk membaginya menjadi wilayah yang valid (seperti yang didefinisikan di bawah) sehingga setiap sel yang tidak kosong dikandung oleh tepat satu wilayah. Kemudian, keluarkan solusi yang ditemukan dalam format apa pun yang masuk akal. Jika tidak ada solusi, baik berhenti tanpa menghasilkan output atau output nilai falsey tunggal kemudian berhenti.
Salah satu dari yang berikut ini merupakan wilayah yang valid:
- Sel tunggal yang mengandung 1
- Sel yang mengandung 2 dan persis salah satu tetangganya yang tidak kosong
- Sel yang mengandung 3 dan tepat dua tetangganya yang tidak kosong ortogonal
- Sebuah sel yang mengandung 4 dan tepatnya tiga tetangganya yang tidak kosong ortogonal
Ini adalah kode-golf , jadi jawaban tersingkat yang valid, dalam byte, menang.
Beberapa test case:
1. Yang agak sepele:
Dan ini solusinya, dengan masing-masing daerah dengan warna yang berbeda:
2. Yang lebih menarik
Yang ini memiliki lebih dari satu solusi, tetapi inilah salah satunya:
3. Yang lebih kecil, berisi yang kosong, yang tidak memiliki solusi (tergantung pada apakah Anda menggunakan salah satu dari keduanya untuk "menangkap" ketiganya, atau tiga untuk mengambil dua dari keduanya, Anda mungkin pergi dengan sepasang dua-dua atau dua yang tidak berdekatan (dan karena itu tidak dapat dikelompokkan) sendiri:
Karena kisi ini tidak memiliki solusi, program Anda harus berhenti tanpa menghasilkan keluaran apa pun ketika diberi kisi ini.
4. Yang ini (dengan 2 sel teratas bergeser ke kiri) memang memiliki solusi:
Larutan:
(Kanan bawah 2 digunakan untuk "menangkap" 3)
5. Karena kami membutuhkan test case dengan merangkak:
Satu solusi:
sumber
4
s jika itu adalah input yang valid.Jawaban:
Saya tahu tantangan ini sudah lebih dari setahun, tetapi saya baru saja menemukan ini di "belum dijawab" dan terlihat cukup menarik bagi saya.
Dengan asumsi bahwa jumlah sel "root" adalah satu-satunya yang signifikan di setiap wilayah (dapat dikurangkan dari contoh-contoh), berikut ini adalah solusi backtracking saya:
Python 3 ,
355351349 byteCobalah online!
Format input adalah daftar 2D bilangan bulat, kosong sebagai nol, dan format output juga merupakan daftar 2D bilangan bulat yang mewakili satu wilayah per angka. Nomor wilayah dimulai pada satu; nol dicadangkan untuk sel kosong (seperti pada input). Jika input yang diberikan tidak dapat dipecahkan, fungsi mengembalikan nol tunggal (nilai falsy).
Misalnya, test case 5 adalah input as
dan hasilnya
Tidak disatukan, dengan komentar:
Cobalah online!
Catatan: Ini adalah kasus khusus Set Packing yang terkenal sebagai NP-complete. Masalah khusus ini memiliki ukuran set terbatas (maks. 4) dan terdapat algoritma perkiraan untuk menemukan set packing "baik" dalam waktu polinomial, tetapi mereka tidak menjamin set seting maksimum yang dimungkinkan (yang sangat diperlukan dalam masalah ini).
sumber