Implementa un Risolutore di Sudoku senza indovinelli


27

Implementa il risolutore Sudoku più corto.

Sudoku Puzzle:

 | 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

Risposta:

 | 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

Regole:

  1. Supponiamo che tutti i labirinti siano risolvibili solo con la logica.
  2. Tutti gli input avranno una lunghezza di 81 caratteri. I caratteri mancanti saranno 0.
  3. Invia la soluzione come una singola stringa.
  4. La "griglia" può essere memorizzata internamente come desideri.
  5. La soluzione deve utilizzare una soluzione non indovinante. (vedi Risolutore di Sudoku )

Esempio I / O:

>sudoku.py "030001000006000050500000983080006302000050000903800060714000009020000800000400030"
832591674496387251571264983185746392267953418943812765714638529329175846658429137

Dovresti davvero aggiungere un limite di tempo.
JPvdMerwe,

1
@JPvdMerwe: buon punto, ma sarebbe difficile standardizzare un limite di tempo.
Snmcdonald,

1
@gnibbler: potrebbe essere stato fatto prima (ma non su codegolf.se). Penso che sarà comunque divertente risolvere e aggiungere un po 'di valore alla comunità, soprattutto se uno lo fa onestamente.
Snmcdonald,

2
Mi piace questo. Sono stato titubante nel provare una vera soluzione di golf e ho pensato di scrivere un solutore di Sudoku (sembra un esercizio divertente). Penso sia qualcosa che la gente come me, che non ha mai giocato a golf prima, potrebbe usare come punto di partenza. E una volta che ne ho trovato uno, potrei quindi giocare a golf.
Andy,

4
I problemi "risolvibili solo con la logica" sono molto vaghi. Vuoi dire, forse, usando solo i passaggi di base di a) Scrivere un valore in una cella per il quale non è un valore nella sua riga, colonna e blocco b) Identificare un numero che può andare solo in un posto nella sua riga, colonna o bloccare e scriverlo lì?
xnor

Risposte:


4

RUBY ( 449 436 caratteri)

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*''

Esempio:

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

spiegazione rapida:
Board bè un array di 81 array che contengono tutti i valori possibili per ogni cella. L'array della riga tre contiene [offset, start_index] per ciascun gruppo (caselle, righe, colonne). Vengono eseguite tre attività durante l'iterazione attraverso i gruppi.

  1. Il valore di qualsiasi cella di dimensione 1 viene rimosso dal resto del gruppo.
  2. Se una coppia di celle contiene gli stessi 2 valori, questi valori vengono rimossi dal resto del gruppo.
  3. Il conteggio di ciascun valore è memorizzato in d- se esiste solo 1 istanza di un valore, impostiamo la cella contenente su quel valore e contrassegniamo la cella fissata inf

Ripeti fino a quando tutte le celle sono state riparate.


Puoi omettere le parentesi quadre I=*(0..8), salverà 2 caratteri.
Dogbert,

Ottengo sudokusolver.rb:8: unterminated string meets end of filese lo inizio con ruby1.8 sudokusolver.rb 030.... Che cosa sto facendo di sbagliato?
utente sconosciuto

Sembra che ci sia un extra sull'ultima riga. Non sono sicuro di come ci sia arrivato ...
AShelly,

2

Prolog - 493 personaggi

:-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).

Produzione:

Immissione: 000000000000003085001020000000507000004000100090000000500000073002010000000040009 uscite: 987654321246173985351928746128537694634892157795461832519286473472319568863745219

Immissione: 030001000006000050500000983080006302000050000903800060714000009020000800000400030 uscite: 832591674496387251571264983185746392267953418943812765714638529329175846658429137

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.