Tantangan:
Diberikan papan Sudoku pada input standar, temukan jumlah minimum angka yang ditambahkan untuk membuat papan tersebut unik.
Spesifikasi / Aturan:
Input diformat sebagai berikut (semua spasi putih signifikan)
516|827|943 278|394|615 349|615|872 ---+---+--- 98 |4 2|156 465|189|237 12 |5 6|489 ---+---+--- 892|743|561 634|951|728 751|268|394
Output diformat dengan satu angka per baris, diformat seperti
(x,y):z
- x dan y mulai dari satu di kiri atas dan naik turun dan kanan; z adalah nomor yang akan ditambahkan.- Dalam hal ini semua ini akan menjadi output yang valid:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, dan(5,6):7
, sebagai salah satu dari ini akan memungkinkan papan untuk dipecahkan.
- Dalam hal ini semua ini akan menjadi output yang valid:
- Jika papan Sudoku unik / terpecahkan dimasukkan, program tidak boleh mencetak apa pun, bahkan baris baru.
- Program harus berjalan dalam waktu kurang dari satu jam untuk papan apa pun (saya sarankan pengujian menggunakan papan yang sepenuhnya kosong, atau papan dengan satu nomor acak di atasnya ...).
Mencetak:
- Ambil ukuran kode total (golf) Anda dalam karakter, termasuk semua spasi putih ...
Bonus:
1/2 ukuran kode : Jika program mencetak satu tanda seru dan berhenti setelah papan tanpa solusi dimasukkan.
1/2 ukuran kode : Jika program mencetak dua tanda seru dan berhenti setelah papan dengan kontradiksi internal dimasukkan (dua angka sama pada baris / kolom / kotak yang sama).
Jawaban:
Brachylog , 245 byte / 2 = 122,5
(Perhatikan bahwa Anda harus menggunakan versi bahasa pada komit ini . Kode ini akan membutuhkan sedikit perubahan agar dapat berfungsi dengan baik di versi Brachylog berikut)
Ini mencetak
"!!"
jika papan yang diberikan memiliki kontradiksi internal (ini membutuhkan beberapa detik dalam kasus itu pada TIO, jadi bersabarlah).Saya tidak yakin saya mengerti bonus pertama dengan benar sehingga saya tidak mengatasinya.
Ini jelas non-bersaing karena bahasanya jauh lebih baru daripada tantangan, namun karena tidak ada jawaban lain saya tidak yakin ini sangat berarti ...
Penjelasan
Predikat utama:
Predikat 1: Hapus semua "
|
" pada garis, ubah---+---+---
menjadi-
untuk menghapusnya setelahPredikat 2: Konversi satu karakter menjadi bilangan bulat, atau jika kosong ke variabel antara 1 dan 9.
Predikat 3: Tetapkan bahwa semua nilai daftar input sel harus berbeda
Predikat 4: Menerapkan batasan perbedaan pada nilai dalam 3 * 3 blok
Predikat 5:
Predikat 6: Tetapkan nilai yang memenuhi batasan untuk subset sel kosong, kemudian dengan nilai tersebut hanya ada satu solusi untuk papan tulis.
Predikat 7: Mengubah papan sehingga setiap sel sekarang
[V:X:Y]
bukan hanyaV
(nilainya).Predikat 8: Mengubah garis sehingga setiap sel sekarang
[V:X]
.Predikat 9: Ambil nilai sel
Predikat 10: Tambahkan panjang subset di awal
Predikat 11: Cetak satu sel
sumber