Usaha saya menyatakan pertanyaan ini , tetapi dengan kriteria penyelesaian yang lebih objektif.
Tugas Anda adalah membangun program atau fungsi yang mengambil kisi-kisi Sudoku yang dipecahkan S
dalam format pilihan Anda dan berupaya menghasilkan kisi-kisi masalah dengan sesedikit mungkin petunjuk yang dimiliki S
sebagai solusi uniknya. (Tidak masalah metode apa yang S
merupakan solusi unik oleh, termasuk brute force, selama solusi tersebut terbukti unik.)
Program Anda akan dinilai dengan menjalankannya melalui sekumpulan 100.000 kisi solusi yang ditemukan dalam file ini (unduhan 7.82 MB), dan menambahkan jumlah petunjuk dalam semua 100.000 kisi masalah yang dihasilkan solusi Anda.
Solusi Sudoku dalam file tes di atas dinyatakan sebagai string 81 karakter, dari kiri ke kanan, kemudian dari atas ke bawah. Kode yang diperlukan untuk mengubah input dalam file uji menjadi solusi yang dapat digunakan tidak akan dihitung terhadap jumlah byte solusi Anda.
Seperti dalam tantangan Cat Banjir saya , program Anda harus benar-benar menghasilkan keluaran yang valid untuk semua 100.000 teka-teki yang akan dianggap sebagai solusi yang valid. Program yang menghasilkan petunjuk total paling sedikit untuk semua 100.000 kasus uji adalah pemenangnya, dengan kode yang lebih pendek memutus ikatan.
Papan skor saat ini:
Jawaban:
C - 2.361.024
2.509.949petunjukHapus petunjuk yang dimulai dari sel terakhir jika seorang brute force solver hanya menemukan satu solusi unik.
Percobaan kedua: gunakan heuristik untuk memutuskan untuk menghapus petunjuk bukannya mulai dari yang terakhir. Ini membuat kode berjalan lebih lambat (20 menit, bukan 2 untuk menghitung hasilnya). Saya bisa membuat pemecah lebih cepat, untuk bereksperimen dengan heuristik yang berbeda, tetapi untuk sekarang akan dilakukan.
sumber
Python - 7.200.000 petunjuk
Seperti biasa, berikut ini adalah solusi referensi tempat terakhir:
Menghapus baris paling bawah dari angka-angka dapat dibuktikan menyisakan teka-teki dalam semua kasus, karena setiap kolom masih memiliki 8 dari 9 angka yang terisi, dan setiap angka di baris bawah hanyalah angka kesembilan yang tersisa dalam kolom.
Jika ada pesaing serius yang berhasil mencetak skor lebih buruk dari yang satu ini, saya akan heran.
sumber
Python 2 - 6.000.000 petunjuk
Sebuah solusi sederhana yang menggunakan 3 metode umum untuk memecahkan teka-teki ini:
Fungsi ini menghasilkan format petunjuk seperti ini:
Ini selalu bisa diselesaikan. Bagian 4 3x3 diselesaikan terlebih dahulu, lalu 8 kolom, lalu 9 baris.
sumber
PHP - 2.580.210 petunjuk
Ini pertama menghapus baris dan kolom terakhir, dan sudut kanan bawah setiap kotak. Kemudian mencoba untuk membersihkan setiap sel, menjalankan papan melalui pemecah sederhana setelah setiap perubahan untuk memastikan papan masih dapat dipecahkan.
Banyak kode di bawah ini dimodifikasi dari salah satu jawaban lama saya .
printBoard
menggunakan 0s untuk sel kosong.sumber