Tahmin Etmeyen Sudoku Çözücü Uygula


27

En kısa Sudoku çözücüyü uygulayın.

Sudoku Yapboz:

 | 1 2 3 | 4 5 6 | 7 8 9
-+-----------------------
A|   3   |     1 |
B|     6 |       |   5
C| 5     |       | 9 8 3
-+-----------------------
D|   8   |     6 | 3   2
E|       |   5   |
F| 9   3 | 8     |   6
-+-----------------------
G| 7 1 4 |       |     9
H|   2   |       | 8
I|       | 4     |   3

Cevap:

 | 1 2 3 | 4 5 6 | 7 8 9
-+-----------------------
A| 8 3 2 | 5 9 1 | 6 7 4
B| 4 9 6 | 3 8 7 | 2 5 1
C| 5 7 1 | 2 6 4 | 9 8 3
-+-----------------------
D| 1 8 5 | 7 4 6 | 3 9 2
E| 2 6 7 | 9 5 3 | 4 1 8
F| 9 4 3 | 8 1 2 | 7 6 5
-+-----------------------
G| 7 1 4 | 6 3 8 | 5 2 9
H| 3 2 9 | 1 7 5 | 8 4 6
I| 6 5 8 | 4 2 9 | 1 3 7

Kurallar:

  1. Tüm labirentlerin yalnızca mantıkla çözülebilir olduğunu varsayalım.
  2. Tüm girdiler 81 karakter uzunluğunda olacak. Eksik karakterler 0 olacaktır.
  3. Çözümü tek bir dizge olarak çıktılayın.
  4. “Izgara” dilediğiniz gibi dahili olarak saklanabilir.
  5. Çözüm, tahmin edilemeyen bir çözüm kullanmalıdır. (bkz. Sudoku Çözücü )

Örnek G / Ç:

>sudoku.py "030001000006000050500000983080006302000050000903800060714000009020000800000400030"
832591674496387251571264983185746392267953418943812765714638529329175846658429137

Gerçekten bir zaman sınırı eklemelisin.
JPvdMerwe

1
@JPvdMerwe: İyi nokta, ancak bir zaman sınırı standardize etmek zor olurdu.
snmcdonald

1
@gnibbler: Daha önce yapılmış olabilir (ancak codegolf.se'de değil). Özellikle dürüst olmak gerekirse, topluma bir miktar değer katmanın yanı sıra çözmenin de eğlenceli olacağını düşünüyorum.
snmcdonald

2
Bunu beğendim. Gerçek bir golf çözümünü denemekte tereddüt ettim ve bir Sudoku çözücü yazmayı düşünüyorum (eğlenceli bir egzersiz gibi görünüyor). Sanırım benim gibi, daha önce hiç golf oynamamış insanların atlama noktası olarak kullanabilecekleri bir şey. Ve bir kere geldiğimde daha sonra golf oynayabilirim.
Andy

4
"Yalnızca mantıkla çözülebilir" sorunlar çok belirsizdir. Muhtemelen, yalnızca temel adımlarını kullanarak mı demek istiyorsun?) Bir satırda, satırında, sütununda ve satırında değeri olmayan bir hücreye değer yazma b) Bir satırda yalnızca bir yerde gidebilecek bir sayı belirleme, sütun , veya engelle ve orada yazarak mı?
xnor

Yanıtlar:


4

RUBY ( 449 436 karakter)

I=*(0..8)
b=$*[0].split('').map{|v|v<'1'?I.map{|d|d+1}:[v.to_i]};f=b.map{|c|!c[1]}
[[z=I.map{|v|v%3+v/3*9},z.map{|v|v*3}],[x=I.map{|v|v*9},I],[I,x]
].map{|s,t|t.map{|i|d=[a=0]*10;s.map{|j|c=b[i+j];c.map{|v|d[v]+=1if !f[i+j]}
v,r=*c;s.map{|k|b[i+k].delete(v)if j!=k}if !r 
s[(a+=1)..8].map{|k|s.map{|l|b[i+l]-=c if l!=k&&l!=j}if c.size==2&&c==b[i+k]}}
v=d.index 1;f[i+k=s.find{|j|b[i+j].index v}]=b[i+k]=[v]if v}}while f.index(!1)
p b*''

Örnek:

C:\golf>soduku2.rb 030001000006000050500000983080006302000050000903800060714000009020000800000400030
"832591674496387251571264983185746392267953418943812765714638529329175846658429137"

Hızlı açıklama:
Board b, her hücre için tüm olası değerleri tutan 81 diziden oluşan bir dizidir. Üçüncü satırdaki dizi, her grup için (kutular, satırlar, sütunlar) [offset, start_index] değerini tutar. Gruplar arasında yineleme yaparken üç görev yapılır.

  1. Boyut 1'in herhangi bir hücresinin değeri, grubun geri kalanından çıkarıldı.
  2. Herhangi bir hücre çifti aynı 2 değeri içeriyorsa, bu değerler grubun geri kalanından kaldırılır.
  3. Her değerin sayısı içinde depolanır d- bir değerin sadece 1 örneği varsa, içeren hücreyi bu değere ayarlarız ve sabitlenmiş hücreyi işaretleriz.f

Tüm hücreler sabitlenene kadar tekrarlayın.


Parantezleri atlayabilirsiniz, I=*(0..8)2 karakter kazandırır.
Dogbert

Ben olsun sudokusolver.rb:8: unterminated string meets end of fileben bunu başlatırsanız ruby1.8 sudokusolver.rb 030.... Neyi yanlış yapıyorum?
kullanıcı bilinmeyen,

Son satırda fazladan var gibi görünüyor. Oraya nasıl gittiğinden emin değilim ...
AShelly

2

Prolog - 493 Karakterler

:-use_module(library(clpfd)).
a(X):-all_distinct(X).
b([],[],[]).
b([A,B,C|X],[D,E,F|Y],[G,H,I|Z]):-a([A,B,C,D,E,F,G,H,I]),b(X,Y,Z).
c([A,B,C,D,E,F,G,H,I|X])-->[[A,B,C,D,E,F,G,H,I]],c(X).
c([])-->[].
l(X,Y):-length(X,Y).
m(X,Y):-maplist(X,Y).
n(L,M):-l(M,L).
o(48,_).
o(I,O):-O is I-48.
:-l(L,81),see(user),m(get,L),seen,maplist(o,L,M),phrase(c(M),R),l(R,9),m(n(9),R),append(R,V),V ins 1..9,m(a,R),transpose(R,X),m(a,X),R=[A,B,C,D,E,F,G,H,I],b(A,B,C),b(D,E,F),b(G,H,I),flatten(R,O),m(write,O).

Çıktı:

Giriş: 000000000000003085001020000000507000004000100090000000500000073002010000000040009 Çıkışlar: 987654321246173985351928746128537694634892157795461832519286473472319568863745219

Giriş: 030001000006000050500000983080006302000050000903800060714000009020000800000400030 Çıkışlar: 832591674496387251571264983185746392267953418943812765714638529329175846658429137

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.