Kombinasi Kakuro
Karena saya tidak dapat melakukan aritmatika mental, saya sering bergumul dengan Puzzle Kakuro , yang mengharuskan korban untuk berulang kali mencari angka yang berbeda di kisaran 1 hingga 9 (termasuk) jumlah ke angka lain di kisaran 1 hingga 45 ketika Anda tahu caranya banyak jumlahnya ada. Misalnya, jika Anda ingin tahu cara mendapatkan 23 dari 3 angka, satu-satunya jawaban adalah 6 + 8 + 9. (Ini adalah ide yang sama dengan Killer Sudoku jika Anda terbiasa dengan itu).
Kadang-kadang Anda akan memiliki informasi lain, seperti bahwa angka 1 tidak dapat hadir, sehingga untuk mencapai 8 hanya dalam 2 angka, Anda hanya dapat menggunakan 2 + 6 dan 3 + 5 (Anda tidak dapat menggunakan 4 + 4, karena mereka adalah tidak berbeda). Atau, mungkin Anda telah menemukan angka 3 dalam solusi, dan sekitar 19 dalam 3 angka harus 3 + 7 + 9.
Tugas Anda adalah menulis program yang mencantumkan semua solusi yang mungkin untuk masalah yang diberikan, dalam urutan yang ketat, dalam tata letak yang ketat.
Memasukkan
Solusi Anda dapat menerima input sebagai string ASCII tunggal baik melalui stdin, argumen baris perintah, argumen ke fungsi, nilai yang tersisa di tumpukan, atau apa pun kegilaan yang dipekerjakan oleh bahasa esoterik favorit Anda. String dalam bentuk
number_to_achieve number_of_numbers_required list_of_rejected_numbers list_of_required_numbers
2 argumen pertama adalah tipikal basis-10 non-negatif bilangan bulat nol di kisaran 1 hingga 45 dan 1 hingga 9 masing-masing (menggunakan titik desimal akan menjadi input yang tidak valid), kedua daftar hanyalah digit yang digantung bersama tanpa batas dalam tidak ada urutan tertentu tanpa pengulangan, atau '0' jika daftar kosong. Tidak boleh ada angka bersama di antara daftar (kecuali untuk 0). Pembatas adalah ruang tunggal.
Keluaran
Output Anda harus mulai dengan garis yang berisi sejumlah solusi yang mungkin. Program Anda harus mencetak solusi batas-batas yang dipisah-pisah yang diurutkan berdasarkan setiap digit yang semakin signifikan, di mana setiap digit ditempatkan pada posisi semestinya jika Anda mencantumkan angka dari 1 hingga 9. Contoh-contoh di bawah ini diharapkan akan membuat ini lebih jelas.
Jika input yang tidak valid diberikan, saya tidak peduli apa program Anda, meskipun saya lebih suka itu tidak nol sektor boot saya.
Contohnya
Untuk input contoh ini
19 3 0 0
Output yang diharapkan adalah
5
2 89
3 7 9
4 6 9
4 78
56 8
Perhatikan spasi di tempat masing-masing nomor "hilang", ini diperlukan; Saya tidak peduli tentang ruang yang tidak memiliki nomor setelah mereka (seperti angka 9 yang hilang di atas). Anda dapat mengasumsikan bahwa apa pun yang Anda cetak akan menggunakan font mono-space. Perhatikan juga urutannya, di mana solusi dengan digit terkecil terkecil didaftar pertama, dan kemudian yang dengan digit terkecil terkecil berikutnya, dll.
Contoh lain, berdasarkan itu di atas
19 3 57 9
Output yang diharapkan adalah
2
2 89
4 6 9
Perhatikan bahwa setiap hasil berisi angka 9, dan tidak ada hasil yang mengandung angka 5 atau 7.
Jika tidak ada solusi, misalnya
20 2 0 0
Maka Anda harus menampilkan satu baris dengan 0 di atasnya.
0
Saya sengaja membuat parsing bagian input dari kesenangan dari pertanyaan ini. Ini kode-golf, semoga solusi terpendek menang.
sumber
Jawaban:
GolfScript, 88 karakter
Implementasi langsung dalam GolfScript. Mengambil input dari STDIN atau stack.
Kode dapat diuji di sini .
Kode dengan beberapa komentar:
sumber
JavaScript (E6) 172
180 275 296Sebagai fungsi (dapat diuji) dengan argumen 1 string dan mengembalikan output yang diminta. Untuk mendapatkan perubahan output nyata kembali dengan alert (), jumlah byte yang sama, tetapi waspadalah, font peringatan bukan monospace.
Tes di FireFox atau konsol FireBug
Hasil tes:
Tidak disatukan
sumber
Mathematica, 239 byte
(Saya akui saya mulai mengerjakan ini saat masih di kotak pasir.)
Tidak disatukan
Ia mengharapkan string input untuk disimpan
i
.Ini cukup mudah. Pertama, input parsing. Lalu saya gunakan
IntegerPartitions
untuk mencari tahu bagaimana saya bisa membagi angka pertama menjadi angka yang diizinkan. Lalu saya memfilter semua partisi yang menggunakan duplikat atau tidak mengandung angka yang diperlukan. Dan kemudian untuk setiap solusi saya membuat daftar dari1
ke9
dan mengubah angka sekarang menjadi representasi string mereka dan yang lainnya menjadi spasi. Dan kemudian saya menggabungkan semuanya.sumber
Groovy - 494 karakter
Besar, jawaban tidak terinspirasi, tetapi menggunakan Google Guava untuk menghasilkan "set daya".
Golf:
Sampel berjalan:
Tidak Disatukan:
sumber