Buat CHECKER solusi Sudoku
Ada banyak sekali SOLOTER Sudoku di sini, tapi saya ingin Anda membuat CHECKER solusi sekecil mungkin secara manusiawi (kode-golf).
Entri yang valid akan dapat mengambil array 9x9 sebagai argumen (disahkan oleh referensi, diserialisasi pada baris perintah, atau bagaimanapun Anda ingin mengambilnya) atau menerima file input sembilan baris dari sembilan angka untuk kisi terakhir . Lihat contoh input di bawah ini.
Masukan yang valid harus berupa angka dasar-10 (1-9)
Posisi yang hilang, kosong, ekstra, non-numerik, atau posisi dengan angka di luar 1-9 harus ditolak sebagai input yang tidak valid dengan mengembalikan hasil yang tidak nol, mencetak kesalahan, atau keduanya.
Program Anda perlu menguji apakah setiap angka muncul satu kali per kolom, sekali per baris, dan sekali per 3x3 sub-grid. Jika lolos, kembalikan "0" dan jika tidak, kembalikan hasil yang tidak nol.
Penggunaan sumber daya eksternal (situs web, dll.) Harus dihindari.
Jika solusi Anda adalah program yang berdiri sendiri, keluar dengan status keluar dari, atau mencetak, "0" atau tidak nol untuk "Pass" atau "Fail", masing-masing, ok.
Biarkan jawaban terkecil menang!
Contoh Input:
c array:
int input[9][9]={{1,2,3,4,5,6,7,8,9},
{4,5,6,7,8,9,1,2,3},
{7,8,9,1,2,3,4,5,6},
{2,3,1,5,6,4,8,9,7},
{5,6,4,8,9,7,2,3,1},
{8,9,7,2,3,1,5,6,4},
{3,1,2,6,4,5,9,7,8},
{6,4,5,9,7,8,3,1,2},
{9,7,8,3,1,2,6,4,5}
};
mengajukan:
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
9 sub-grid:
+---+---+---+
|123|456|789|
|456|789|123|
|789|123|456|
+---+---+---+
|231|564|897|
|564|897|231|
|897|231|564|
+---+---+---+
|312|645|978|
|645|978|312|
|978|312|645|
+---+---+---+
sumber
1
atau-1
Python, 103
Saya benci sudoku.
Cara kerjanya: setiap baris, kolom, dan blok harus memiliki masing-masing angka dari 1 hingga 9. Jadi untuk masing-masing
0 <= i, j < 9
, seli,j
di blok3*floor(i/3) + floor(j/3)
. Dengan demikian, ada 243 persyaratan yang harus dipenuhi. Saya membuat masing-masing persyaratan tuple di((item index,item type number),symbol)
manaitem index
angka antara 0 dan 8 (inklusif),item type number
adalah 0,1, atau 2 untuk menunjukkan baris, kolom atau blok masing-masing, dansymbol
merupakan entrib[i][j]
.Sunting: Saya keliru tidak memeriksa entri yang valid. Sekarang saya lakukan.
sumber
0
jika solusinya lewat, tidakTrue
APL (46)
Ini membutuhkan matriks 9-oleh-9. Contohnya bisa dimasukkan di TryAPL seperti:
Penjelasan:
↓⍉⍵
: dapatkan kolom⍵
,↓⍵
: dapatkan baris⍵
,3/3⌿3 3⍴Z←⍳9
: Membuat matriks 3-by-3 yang berisi angka-angka1
untuk9
, maka rangkap tiga masing-masing nomor di kedua arah, memberikan matriks 9-by-9 dengan angka1
untuk9
menunjukkan masing-masing kelompok,Z∘.=
: Untuk setiap nomor1
untuk9
, membuat bitmask untuk kelompok tertentu,/∘(,⍵)¨
: dan topeng⍵
dengan masing-masing, memberikan kelompok⍵
.∊∘Z¨
: Untuk setiap sub-array, melihat apakah mengandung angka1
untuk9
,∧/,↑
: ambil yang logisand
dari semua angka ini bersama-sama.sumber
↓9 9⍴1 3 2⍉3 3 9⍴⍵
setara dengan/∘(,⍵)¨↓Z∘.=,3/3⌿3 3⍴Z←⍳9
tetapi cukup pendek. Saya yakin bahkan ada formula yang lebih pendek.⍪
dan melakukan pemisahan tunggal di akhir:↓(9 9⍴1 3 2⍉3 3 9⍴⍵)⍪⍵⍪⍉⍵
∊∘Z¨
ini menguji apakah setiap sub-array (baris, kolom atau blok) hanya terbuat dari angka 1 hingga 9. Itu tidak menguji apakah semua angka diwakili. Anda perlu melakukan sesuatu sepertiZ∘.∊
yang menguji bahwa setiap angka dalam Z terkandung dalam setiap sub-array.∧/,↑
bisa disingkat∧/∊
. Aku sudah selesai, sudah selesai! ;-)If it passes, return "0" and if not, return a non-zero result.
Java / C # -
183/180181/178173/170 byte(Ubah
boolean
kebool
untuk C #)Diformat:
Metode ini menciptakan sebuah array
u
dengan 27 bitmask, mewakili digit yang ditemukan di sembilan baris, kolom, dan kotak.Itu kemudian beralih di atas semua sel, melakukan operasi
1 << a[x][y]
untuk membuat bitmask yang mewakili digit dan OR kolomnya, baris dan bitmask persegi dengannya.Itu kemudian beralih ke semua 27 bitmasks, memastikan bahwa mereka semua menambahkan hingga 27594 (1022 * 9, 1022 menjadi bitmask untuk semua digit 1-9 yang hadir). (Catatan yang
y
berakhir sebagai 27603 karena sudah mengandung 9 mengikuti loop ganda.)Sunting: Tidak sengaja tertinggal dalam
%3
yang tidak lagi diperlukan.Sunting 2: Terinspirasi oleh komentar Bryce Wagner, kode ini telah dikompres lebih sedikit.
sumber
python = 196
Bukan yang paling golf, tetapi idenya ada di sana. Set sangat berguna.
Naik:
Program:
sumber
n={*range(1,10)}
, tapi itu lebih baru daripada tantangannya. Alih-alih gunakanset(range(1,10))
seperti kata MatrixFrog.Java -
385 306 328260 karakterSunting: Saya dengan bodohnya salah membaca instruksi bahwa jawabannya harus merupakan program yang lengkap. Karena itu bisa menjadi fungsi yang valid, saya telah menulis ulang dan meminimalkan menjadi fungsi, dan menulis ulang pengenalan solusi saya dengan itu dalam pikiran.
Jadi, sebagai tantangan bagi diri saya, saya pikir saya akan mencoba membuat pemeriksa solusi Java terkecil.
Untuk mencapai ini saya berasumsi bahwa teka-teki sudoku akan diteruskan sebagai array multidimensi java, seperti:
Kemudian, kami memiliki pemecah yang sebenarnya, yang mengembalikan "0" jika solusi yang valid, "1" jika tidak.
Sepenuhnya golf:
Dapat dibaca:
Jadi bagaimana cara kerjanya? Saya pada dasarnya hanya membuat basis angka saya sendiri dengan resolusi yang cukup di setiap digit yang saya hanya perlu melakukan tiga perbandingan numerik setelah melewati teka-teki sekali untuk mengetahui apakah itu valid. Saya memilih basis 49 untuk masalah ini, tetapi setiap basis yang lebih besar dari 45 akan cukup.
Contoh (mudah-mudahan) jelas: bayangkan bahwa setiap "baris" dalam teka-teki sudoku adalah satu digit dalam nomor basis-49. Kami akan merepresentasikan setiap digit pada nomor basis-49 sebagai angka dasar-10 dalam vektor untuk kesederhanaan. Jadi, jika semua baris "benar", kami mengharapkan nomor base-49 berikut (sebagai vektor base-10):
atau dikonversi ke nomor basis-10 tunggal:
1526637748041045
Ikuti logika serupa untuk semua kolom, dan sama untuk "sub-grid". Nilai apa pun yang ditemukan dalam analisis akhir yang tidak sama dengan "angka ideal" ini berarti solusi puzzle tidak valid.
Edit untuk mengatasi kerentanan semua-5 dan masalah terkait lainnya: Saya menambahkan nomor basis-49 keempat, berdasarkan gagasan bahwa harus ada 9 dari setiap angka dalam setiap puzzle. Jadi, saya menambahkan 5 ke setiap digit dalam nomor basis-49 untuk setiap kemunculan nomor basis-10 yang mewakili indeks digit. Contoh, jika ada 10 9 dan 9 8, 9 7, 8 6, dan 9 dari yang lainnya, Anda akan mendapatkan nomor basis-49 (sebagai vektor basis-10 ukuran 10 untuk menangani overflow):
Yang akan gagal jika dibandingkan dengan nomor base-49 "ideal" kami.
Solusi saya memanfaatkan solusi matematika ini, untuk menghindari sebanyak mungkin perulangan dan perbandingan. Saya hanya menggunakan
long
nilai untuk menyimpan setiap nomor base-49 sebagai nomor base-10 dan menggunakan array pencarian untuk mendapatkan "faktor" untuk setiap digit base-49 selama perhitungan nilai kolom / baris / subgrid perhitungan.Karena Java tidak dirancang untuk ringkas, berhati-hati dalam konstruksi matematika adalah satu-satunya cara saya pikir saya bisa membangun pemeriksa ringkas.
Biarkan aku tahu apa yang Anda pikirkan.
sumber
R 145
Kode de-golfed (kurang lebih) dapat ditemukan di sini /programming//a/21691541/1201032 .
sumber
Haskell (Lambdabot), 65 byte
sumber
Perl, 193 byte
Input diharapkan dalam bentuk array:
Kode keluar adalah 0, jika
@a
merupakan solusi, jika1
tidak dikembalikan.Versi tidak disatukan:
Masing-masing dari 9 baris, 9 kolom dan 9 sub array dimasukkan ke dalam array yang diurutkan dan diperiksa, apakah cocok dengan array
(1..9)
. Jumlahnya$r
bertambah untuk setiap pertandingan yang berhasil yang harus berjumlah hingga 27 untuk solusi yang valid.sumber
J
5254Membawa argumen yang ditempel di baris perintah, diakhiri dengan a) sebagai:
Mengembalikan 1 jika lulus, 0 jika tidak.
Secara internal, ini mengkonversi grid 9x9 menjadi grid 3x3x3x3, dan melakukan beberapa permutasi pada sumbu untuk mendapatkan unit yang diinginkan (baris, garis, dan kotak) dalam 2 dimensi terakhir.
Setelah melakukan itu, diperiksa bahwa setiap unit memiliki 9 nilai unik.
Mungkin jauh dari sempurna, tetapi sudah mengalahkan mayoritas ;-)
sumber
Mathematica,
8479 karakterContoh:
sumber
3
selalu menunjukkan input yang tidak valid, atau adakalanya respons terhadap solusi yang gagal?Javascript ES6, 150 karakter
Mengambil input sebagai string 81-char tanpa pembatas.
Fungsi kembali
null
sebagai jawaban negatif dan sebuah array dengan string asli di elemen pertama sebagai positif. Dapat berubah menjadi bool dengan menambahkan!!
fungsi awal.Tes (lihat tantangan terkait untuk lebih banyak detais):
sumber
R,
6350 byteMengasumsikan input
m
adalah matriks angka 9x9.Saya benar bahwa golf lebih lanjut adalah mungkin.
Penjelasan:
Ambil
m
, dan untuk setiap baris, terapkanmatch
fungsi. Kami menentukan argumen lebih lanjutx=1:9
untuk diteruskanmatch
.x
adalah argumen posisi pertama default, dan oleh karena itu setiap baris ditempatkan di posisi argumen kedua, yaitutable
. Fungsimatch
mencari instancex
intable
. Dalam hal ini, maka, ia mencari1:9
(angka 1 hingga 9) di setiap baris. Untuk masing-masing1:9
, itu akan kembaliTRUE
(atauFALSE
) jika nomor itu ditemukan (atau tidak).Jadi, ini menghasilkan serangkaian 81 nilai boolean.
Ulangi langkah di atas untuk setiap kolom input.
Akhirnya,
all
periksa apakah setiap elemen dari daftar boolean adalahTRUE
. Ini akan menjadi kasus jika dan hanya jika solusinya benar (yaitu setiap angka1:9
hanya ada satu kali di setiap kolom dan setiap baris).Pendekatan lama:Dibutuhkan setiap baris, mengurutkannya, dan kemudian membandingkannya[1, 2, ... 9]
. Baris yang benar harus sama persis. Kemudian ia melakukan hal yang sama untuk setiap kolom. Secara total, kita harus memiliki 162 pencocokan tepat, yang merupakan bagian terakhir untuk memeriksa. Kemungkinan ada beberapa ruang untuk bermain golf lebih lanjut di sini ...sumber
Haskell - 175
Fungsi
v
adalah fungsi untuk memanggil. Ini bekerja dengan mendapatkan perbedaan dari setiap baris, kolom dan blok terhadap daftar[1..9]
dan merangkum panjang daftar perbedaan tersebut.Demo menggunakan contoh Sudoku:
sumber
Javascript - 149 Karakter
Mengharapkan array
a
ada dan membuat variabelo
untuk output yang0
sukses dan bukan nol sebaliknya.Bekerja dengan memeriksa bahwa jumlah posisi di mana setiap nilai terjadi untuk setiap baris, kolom, dan 3 * 3 kotak sama dengan 36 (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8).
Pengujian
Memberi 'o = 0'
(2 digit terakhir ditukar)
Memberi
o=-1
Memberi
o=-284
sumber
Haskell,
121130127 byte (87 Lambdabot)menggunakan:
Lambdabot memuat Data.List dan Data.List.Split secara default (Saya tidak berpikir solusi BlackCap memeriksa kotak).
Gagasan untuk perbaikan disambut
// Edit: Saya mengacaukan :)
// Edit: 3 byte disimpan oleh BlackCap
sumber
(map sort)
dengan(sort<$>)
.c$(sort<$>)<$>
dengan$(sort<$>)=<<
05AB1E , 36 bytes | NoN-Competing |
Cobalah online!
1 itu benar, yang lain salah.
sumber
Clojure, 151 byte
Cukup lama, tetapi yang lain tampaknya juga. Juga mengganggu bahwa set himpunan membutuhkan
require
, jadi saya menggunakan vektor sebagai gantinya.Ulangi setiap baris dan kolom dan jika nilainya antara 1 dan 9, ia memancarkan tiga vektor, satu untuk baris, col, dan sel 3x3. Mengembalikan 0 pada kesuksesan dan
nil
sebaliknya, dengan dua karakter tambahan dapat mengembalikan 1 pada gagal. Menangani angka di luar 1 - 9 dengan mengembalikannil
tetapi akan crash pada anomali lain seperti nilai non-integer. Quotients adalah 0 - 2 sehingga aman untuk menggunakan nilai8
dan9
untuk membedakan nilai sel dari baris dan kolom.Input adalah vektor vektor bersarang (sehingga
nth
berfungsi):Tidak Disatukan:
sumber
PHP,
196190 byteProgram mengambil 9 argumen baris perintah yang terpisah (satu string angka untuk setiap baris grid);
keluar dengan
1
(kesalahan) untuk tidak valid,0
(ok) untuk valid.Jalankan dengan
php -nr '<code>' <row1> <row2> ...
.kerusakan
penjelasan
count_chars
menghitung karakter dalam string dan biasanya membuat array dengan kode ascii sebagai kunci dan karakter dihitung sebagai nilai; tetapi dengan3
sebagai parameter mode, itu menciptakan string yang diurutkan dari karakter; dan itu dapat dengan mudah dibandingkan dengan angka dengan angka yang diinginkan.Perbandingan tidak hanya memeriksa duplikat, tetapi juga mencakup pemeriksaan untuk karakter yang tidak valid. Dan itu hanya memerlukan
<
, bukan!=
, karena ini adalah perbandingan numerik: PHP akan mengartikan string sejauh mungkin.123e56789
,0x3456789
atau yang serupa tidak dapat muncul, karena karakter diurutkan; dan bilangan bulat murni dengan digit yang hilang lebih kecil dari123456789
... dan.23456789
juga, tentu saja.$a=$argv
menyimpan satu byte,$d=123456789
menyimpan sembilan dan$u=count_chars
menyimpan 13.sumber
C # -
306298288 karakterProgram Konsol berikut digunakan untuk memanggil fungsi pemeriksaan;
Semua ini dilakukan adalah menginisialisasi array dan meneruskannya ke fungsi pemeriksaan P.
Fungsi pemeriksaan adalah seperti di bawah ini (dalam bentuk Golf);
Atau dalam bentuk yang ditata sepenuhnya;
Ini menggunakan gagasan bahwa semua kolom, baris, dan sub-grid harus berjumlah hingga 45. Ia bekerja melalui array input dan mengurangi nilai setiap posisi dari baris, kolom, dan sub-grid itu. Setelah selesai maka periksa bahwa tidak ada baris, kolom atau sub-grid yang masih memiliki nilai.
Seperti yang diminta mengembalikan 0 jika array adalah solusi Sudoku yang valid dan bukan nol (1) di mana tidak.
sumber
private static int P(int[,]i){int[]r=new int[9],c=new int[9],g=new int[9];
sebagai gantinya. (Perhatikan penghapusan ruang setelah braket kotak dekat]
.) Juga, saya tidak yakin tapi saya pikir Anda dapat menyingkirkanprivate static
.for(int p=0;p<9;p++)if(r[p]>0|c[p]>0|g[p]>0)return 1;return 0;}
, tidak yakin apakah itu berfungsi di C #. (Saya sebenarnya tidak tahu C #)