Sudokuilua

[viesti Survo-keskustelupalstalla (2001-2013)]

Kirjoittaja: Seppo Mustonen
Sähköposti:    -
Päiväys: 3.4.2006 16:59

Sudoku on harvinaisen suuren suosion saavuttanut peli,
jossa täydennetään annettu ruudukko (tavallisesti 9x9)
numeroin (1,2,3,4,5,6,7,8,9) noudattaen annettuja ehtoja.
Tarkat tiedot pelin säännöistä, sen historiasta ja
levinneisyydestä löytyvät suomeksi esim. sivulta
http://fi.wikipedia.org/wiki/Sudoku 

Itse en ennen viime viikonvaihdetta ollut Sudokuja
ratkaissut, koska vältän addiktoitumista peleihin;
Survon (kehittämisen) parissa riittää pelaamista kylliksi.

Koska eräät tuttuni ja jopa survoilijat ilmoittavat Sudokuja
harrastaneensa, päätin rakentaa Survoon ohjelman, joka
tukee pelin ratkaisemista ja selvittää sen halutessa
kokonaan 9x9-, 16x16- ja 25x25-ruudukoilla.

Uuden SUDOKU-komennon saa liitettyä omaan Survoonsa
(SURVO MM, normaali versio) siirtämällä verkosta tiedoston
www.survo.fi/sudoku/_sudoku.exe 
SURVO MM:n ohjelmahakemistoon <Survo>\U\

Sudoku-tehtävä annetaan toimituskentässä esim. seuraavasti
kirjoittamalla tyhjiin ruutuihin nollan:
(esimerkkinä Helsingin Sanomien tämänpäiväinen tehtävä)

700000163
010980000
023600500
900830021
060204070
840091005
005009280
000075010
694000007

Tehtävä tulee tallettaa Survon matriisiksi esim. HS030406
lisäämällä toistuvalla INSERT-komennolla (lyh. I) välit tyyliin

I      _
7 0 0 000163
0 1 0 980000
0 2 3 600500
9 0 0 830021
0 6 0 204070
8 4 0 091005
0 0 5 009280
0 0 0 075010
6 9 4 000007

antamalla otsikon

MATRIX HS030406 ///
7 0 0 0 0 0 1 6 3
0 1 0 9 8 0 0 0 0
0 2 3 6 0 0 5 0 0
9 0 0 8 3 0 0 2 1
0 6 0 2 0 4 0 7 0
8 4 0 0 9 1 0 0 5
0 0 5 0 0 9 2 8 0
0 0 0 0 7 5 0 1 0
6 9 4 0 0 0 0 0 7

sekä tallettamalla komennolla

MAT SAVE HS030406

Tehtävän ratkaisee silloin komento

SUDOKU HS030406

joka antaa ratkaisutaulukon toimituskenttään

SUDOKU HS030406
Solution: time=0.000
MATRIX SUDOKU.M ///
7 8 9 5 4 2 1 6 3
5 1 6 9 8 3 7 4 2
4 2 3 6 1 7 5 9 8
9 5 7 8 3 6 4 2 1
3 6 1 2 5 4 8 7 9
8 4 2 7 9 1 6 3 5
1 7 5 3 6 9 2 8 4
2 3 8 4 7 5 9 1 6
6 9 4 1 2 8 3 5 7

ja samalla tallettaa sen matriisitiedostona SUDOKU.M.

Haluttaessa nähdä ratkaisun eri vaiheet annetaan täsmennys RESULTS=100,
jolloin jatkoksi ilmestyvät toimituskenttään ratkaisun kulkua kuvaavat taulukot:

      7  :    5  8 :       89|   45    : 2 45    : 2       |1        :     6   :  3      |
   45    :1        :     6   |        9:       8 : 23   7  |   4  7  :   4     : 2 4     |
   4     : 2       :  3      |     6   :1  4     :      7  |    5    :   4    9:   4   89|
------------------------------------------------------------------------------------------
        9:    5 7  :      7  |       8 :  3      :     67  |   4 6   : 2       :1        |
1 3 5    :     6   :1        | 2       :    5    :   4     |  3    89:      7  :       89|
       8 :   4     : 2    7  |      7  :        9:1        |  3  6   :  3      :    5    |
------------------------------------------------------------------------------------------
1 3      :  3   7  :    5    |1 34     :1  4 6   :        9| 2       :       8 :   4 6   |
 23      :  3    8 : 2     8 |  34     :      7  :    5    |  34 6  9:1        :   4 6  9|
     6   :        9:   4     |1 3      :12       : 23    8 |  3      :  3 5    :      7  |
------------------------------------------------------------------------------------------
(1,6)=2

      7  :    5  8 :       89|   45    :   45    : 2       |1        :     6   :  3      |
   45    :1        :     6   |        9:       8 :  3   7  |   4  7  :   4     : 2 4     |
   4     : 2       :  3      |     6   :1  4     :      7  |    5    :   4    9:   4   89|
------------------------------------------------------------------------------------------
        9:    5 7  :      7  |       8 :  3      :     67  |   4 6   : 2       :1        |
1 3 5    :     6   :1        | 2       :    5    :   4     |  3    89:      7  :       89|
       8 :   4     : 2    7  |      7  :        9:1        |  3  6   :  3      :    5    |
------------------------------------------------------------------------------------------
1 3      :  3   7  :    5    |1 34     :1  4 6   :        9| 2       :       8 :   4 6   |
 23      :  3    8 : 2     8 |  34     :      7  :    5    |  34 6  9:1        :   4 6  9|
     6   :        9:   4     |1 3      :12       :  3    8 |  3      :  3 5    :      7  |
------------------------------------------------------------------------------------------
(2,3)=6

jne. (poistettu noin 40 välivaihetta)


(9,8)=5

      7  :       8 :        9|    5    :   4     : 2       |1        :     6   :  3      |
    5    :1        :     6   |        9:       8 :  3      |      7  :   4     : 2       |
   4     : 2       :  3      |     6   :1        :      7  |    5    :        9:       8 |
------------------------------------------------------------------------------------------
        9:    5    :      7  |       8 :  3      :     6   |   4     : 2       :1        |
  3      :     6   :1        | 2       :    5    :   4     |       8 :      7  :        9|
       8 :   4     : 2       |      7  :        9:1        |     6   :  3      :    5    |
------------------------------------------------------------------------------------------
1        :      7  :    5    |  3      :     6   :        9| 2       :       8 :   4     |
 2       :  3      :       8 |   4     :      7  :    5    |        9:1        :     6   |
     6   :        9:   4     |1        : 2       :       8 |  3      :    5    :      7  |
------------------------------------------------------------------------------------------

SUDOKU näyttää aluksi taulukon, jossa nollien paikalle on asetettu Sudokun sääntöjen
mukaan mahdolliset vaihtoehtoiset numerot ja ilmoittaa sitten, mitä on tehtävissä.
Turhien vaihtoehtojen eliminointi osoittaa, että ruutuun (1,6), joka oli alunperin tyhjä,
on jäänyt vain yksi vaihtoehto (2), joka siis valitaan lopullisesti ja päästään
poistamaan kakkoset rivistä 1, sarakkeesta 6 ja vastaavasta 3x3-lohkosta.

Koska kyseessä on yhden tähden tehtävä, se ratkeaa suoraan tällä perustekniikalla.
Vaikeammissa Sudokuissa tämä ei riitä vaan joudutaan käyttämään mutkikkaampia,
alkuperäisiin ehtoihin perustuvia loogisia sääntöjä.
Perehdyttäessä niihin ehkä paras tietolähde on Andrew Stuartin verkkosivu
http://www.scanraid.com/sudoku.htm 
Se mm. esittelee säännöt, joilla ilmeisesti mikä tahansa Sudoku-tehtävä ratkeaa
ilman arvailuja.

Survon SUDOKU-ohjelma ei käytä näitä mutkikkaampia sääntöjä lainkaan.
Perusehtojen ohella se havaitsee vain seuraavat:
Jos esim. jossain sarakkeessa mahdollisten vaihtoehtojen joukossa
tietty numero esiintyy vain kerran, tulee valita tuo numero ja poistaa sama numero
vaihtoehtojen joukosta vastaavalta riviltä ja vastaavasta 3x3-lohkosta.
Samanlaista sääntöä sovelletaan ainutkertaisiin numeroihin riveillä ja 3x3-lohkoissa.

Mutkikkaammat säännöt, joita Survon SUDOKU ei siis käytä, koskevat mm. numeroparien
ja -kolmikoiden esiintymistä.

SUDOKU käyttää tilanteissa, joissa eivät em. perussäännöt enää pure, raakaa voimaa.
Etsitään avoimista ruuduista sellainen, jossa on vähiten vaihtoehtoja.
Valitaan (arvataan) niistä yksi ja jatketaan ratkaisua, kunnes joko päästään lopputulokseen
tai jodutaan vaikeuksiin eli syntyy tilanne, jossa jostain ruudusta vaihtoehdot
loppuvat kokonaan. Tässä jälkimmäisessä tilanteessa tulee palata takaisin
edelliseen arvaukseen ja arvata uudelleen. Tätä sanotaan backtrack-menettelyksi.
Se johtaa aina lopulta ratkaisuun eikä ole välttämättä edes kovin hidas, mutta
varmasti vastoin monen Sudoku-harrastajan pyhiä periaatteita.

SUDOKU mittaa myös varsinaiseen ratkaisuun (ilman syöttö- ja tulostusvaiheita)
kuluvan ajan sekunteina. Vaikeinkin 9x9-tehtävä ratkeaa koneellani 0.1 sekunnissa,
vaikka en ole optimoinut ohjelmaa ajankäytön suhteen.

Näytteenä hankalammasta tehtävästä on alla Hesarin aprillipäivän 5-tähtinen:

MATRIX HS010406 ///
0 0 1 3 0 0 7 0 2
0 0 6 2 0 0 0 1 0
0 2 0 0 0 0 0 0 4
2 0 0 6 0 1 3 0 9
0 0 0 0 0 0 0 0 0
4 0 3 8 0 9 0 0 7
1 0 0 0 0 0 0 8 0
0 5 0 0 0 6 4 0 0
9 0 4 0 0 8 5 0 0

MAT SAVE HS010406
SUDOKU HS010406 / RESULTS=100
Solution: n[quess]=1 max_depth=1 time=0.010
MATRIX SUDOKU.M ///
8 4 1 3 6 5 7 9 2
7 3 6 2 9 4 8 1 5
5 2 9 1 8 7 6 3 4
2 8 5 6 7 1 3 4 9
6 9 7 4 3 2 1 5 8
4 1 3 8 5 9 2 6 7
1 7 2 5 4 3 9 8 6
3 5 8 9 2 6 4 7 1
9 6 4 7 1 8 5 2 3

    5  8 :   4   89:1        |  3      :   456 89:   45    |      7  :    56  9: 2       |
  3 5 78 :  34  789:     6   | 2       :   45 789:   45 7  |       89:1        :  3 5  8 |
  3 5 78 : 2       :    5 789|1   5 7 9:1   56789:    5 7  |     6 89:  3 56  9:   4     |
------------------------------------------------------------------------------------------
 2       :      78 :    5 78 |     6   :   45 7  :1        |  3      :   45    :        9|
    5678 :1    6789:    5 789|   45 7  : 2345 7  : 2345 7  |12   6 8 : 2 456   :1   56 8 |
   4     :1    6   :  3      |       8 : 2  5    :        9|12   6   : 2  56   :      7  |
------------------------------------------------------------------------------------------
1        :  3  67  : 2    7  |   45 7 9: 2345 7 9: 2345 7  | 2   6  9:       8 :  3  6   |
  3   78 :    5    : 2    78 |1     7 9:123   7 9:     6   |   4     : 23   7 9:1 3      |
        9:  3  67  :   4     |1     7  :123   7  :       8 |    5    : 23  67  :1 3  6   |
------------------------------------------------------------------------------------------
(5,1)=6 (unique on this column)

-- 5 vaihetta poistettu --

    5  8 :   4   89:1        |  3      :   456 89:   45    |      7  :     6  9: 2       |
  3   78 :  34  789:     6   | 2       :   4  789:   4  7  |       89:1        :    5    |
    5 78 : 2       :    5 789|1   5 7 9:1   56789:    5 7  |     6 89:  3      :   4     |
------------------------------------------------------------------------------------------
 2       :      78 :    5 78 |     6   :   45 7  :1        |  3      :   45    :        9|
     6   :      7 9:    5 7 9|   45 7  : 2345 7  : 2345 7  |1        : 2 45    :       8 |
   4     :1        :  3      |       8 : 2  5    :        9| 2   6   : 2  56   :      7  |
------------------------------------------------------------------------------------------
1        :  3  67  : 2    7  |   45 7 9: 2345 7 9: 2345 7  | 2   6  9:       8 :  3  6   |
  3   78 :    5    : 2    78 |1     7 9:123   7 9:     6   |   4     : 2    7 9:1 3      |
        9:  3  67  :   4     |1     7  :123   7  :       8 |    5    : 2   67  :1 3  6   |
------------------------------------------------------------------------------------------
guess (1,1)=8 depth=1

       8 :   4    9:1        |  3      :   456  9:   45    |      7  :     6  9: 2       |
  3   7  :  34  7 9:     6   | 2       :   4  789:   4  7  |       89:1        :    5    |
    5 7  : 2       :    5 7 9|1   5 7 9:1   56789:    5 7  |     6 89:  3      :   4     |
------------------------------------------------------------------------------------------
 2       :      78 :    5 78 |     6   :   45 7  :1        |  3      :   45    :        9|
     6   :      7 9:    5 7 9|   45 7  : 2345 7  : 2345 7  |1        : 2 45    :       8 |
   4     :1        :  3      |       8 : 2  5    :        9| 2   6   : 2  56   :      7  |
------------------------------------------------------------------------------------------
1        :  3  67  : 2    7  |   45 7 9: 2345 7 9: 2345 7  | 2   6  9:       8 :  3  6   |
  3   7  :    5    : 2    78 |1     7 9:123   7 9:     6   |   4     : 2    7 9:1 3      |
        9:  3  67  :   4     |1     7  :123   7  :       8 |    5    : 2   67  :1 3  6   |
------------------------------------------------------------------------------------------
(8,3)=8 (unique on this row)

--- 45 vaihetta poistettu ---

       8 :   4     :1        |  3      :     6   :    5    |      7  :        9: 2       |
      7  :  3      :     6   | 2       :        9:   4     |       8 :1        :    5    |
    5    : 2       :        9|1        :       8 :      7  |     6   :  3      :   4     |
------------------------------------------------------------------------------------------
 2       :       8 :    5    |     6   :      7  :1        |  3      :   4     :        9|
     6   :        9:      7  |   4     :  3      : 2       |1        :    5    :       8 |
   4     :1        :  3      |       8 :    5    :        9| 2       :     6   :      7  |
------------------------------------------------------------------------------------------
1        :      7  : 2       |    5    :   4     :  3      |        9:       8 :     6   |
  3      :    5    :       8 |        9: 2       :     6   |   4     :      7  :1        |
        9:     6   :   4     |      7  :1        :       8 |    5    : 2       :  3      |
------------------------------------------------------------------------------------------

Tässä jouduttiin siis arvaamaan kerran ja osuttiin heti oikeaan!

................................................................
Sivulla
http://sudoku.sourceforge.net/ 
(kohta Brain of Britain) mainitaan seuraava tehtävä vaikeimmaksi koskaan havaituista.

MATRIX HARDEST ///
0 2 0 0 0 0 0 0 0
0 0 0 6 0 0 0 0 3
0 7 4 0 8 0 0 0 0
0 0 0 0 0 3 0 0 2
0 8 0 0 4 0 0 1 0
6 0 0 5 0 0 0 0 0
0 0 0 0 1 0 7 8 0
5 0 0 0 0 9 0 0 0
0 0 0 0 0 0 0 4 0

MAT SAVE HARDEST
SUDOKU HARDEST
Solution: n[quess]=148 max_depth=10 time=0.100
MATRIX SUDOKU.M ///
(Katkaisen tulostuksen tähän, jotta asianharrastajat voivat yrittää omin keinoin.)
Yllä max_depth=10 tarkoittaa, että pahimmillaan oli 10 sisäkkäistä arvausta
valittuna!

Hankala on myös seuraava 16*16-ruudukko, jonka selvittämiseen SUDOKU tarvitsee
koneellani peräti 20 sekuntia ja josta em. verkkosivuilla todetaan, ettei sitä
ole tarkoitettukaan "käsin ratkaistavaksi" vaan ratkaisuohjelmien testaamiseen:

MATRIX A16 ///
 0 10  0  0 16  0  0 14  0  0  0  0 15 13  0  0
 0 11  6  0  2  0  1  0  0  4  0  0  0  9  0  0
 0  0  0  0  0  0  0  0  0  0  0 12  0  0  0  7
13  0  0  0  0 10  0  0  0  0 15  0  5  3  8  0
 0  0  0  8  6  0  0 11  4  3  0 14  0  0  0  0
 0 15  0  0  0  0  8  2 13  0  0  0 14  1  4  0
 0  0 16  7  0  5  0  0  0  1  0  0  0  2  0 13
 0 14  0  0 12  0  0  0 16  9 10  0  0  0  0  0
 0  0  0  0  0 13  7  3  0  0  0  4  0  0 11  0
 5  0 12  0  0  0 15  0  0  0  8  0 10 14  0  0
 0  2  9 14  0  0  0 10  3 16  0  0  0  0 12  0
 0  0  0  0 14  0  4  5  1  0  0  6 16  0  0  0
 0 16 13  9  0  8  0  0  0  0 14  0  0  0  0  6
12  0  0  0 10  0  0  0  0  0  0  0  0  0  0  0
 0  0  4  0  0  0  9  0  0 11  0  7  0 15  3  0
 0  0  1  3  0  0  0  0  5  0  0  2  0  0  7  0

MAT SAVE A16
SUDOKU A16
Solution: n[quess]=20014 max_depth=34 time=20.229
MATRIX SUDOKU.M ///
 2 10  8 12 16  9  6 14  7  5 11  3 15 13  1  4
15 11  6  5  2  3  1  7  8  4 13 16 12  9 14 10
 4  9  3 16 13 15  5  8 10 14  1 12  2 11  6  7
13  7 14  1 11 10 12  4  2  6 15  9  5  3  8 16
 9 13  5  8  6  1 10 11  4  3  2 14  7 12 16 15
 6 15 10 11  3 16  8  2 13 12  7  5 14  1  4  9
 3 12 16  7  4  5 14  9 15  1  6 11  8  2 10 13
 1 14  2  4 12  7 13 15 16  9 10  8  3  6  5 11
16  1 15 10  9 13  7  3 14  2 12  4  6  8 11  5
 5  4 12  6  1  2 15 16 11  7  8 13 10 14  9  3
 7  2  9 14  8  6 11 10  3 16  5 15 13  4 12  1
 8  3 11 13 14 12  4  5  1 10  9  6 16  7 15  2
11 16 13  9  7  8  3  1 12 15 14 10  4  5  2  6
12  5  7 15 10  4  2  6  9  8  3  1 11 16 13 14
10  8  4  2  5 14  9 13  6 11 16  7  1 15  3 12
14  6  1  3 15 11 16 12  5 13  4  2  9 10  7  8

..............................................................

SUDOKU-komento on käytettävissä myös omaehtoisen ratkaisemisen tukena
antamalla täsmennys GUESS=0.
Tällöin SUDOKU lopettaa toimintansa heti, kun se joutuisi
tekemään arvauksen. Täsmennyksellä RESULTS=100 syntyvästä
pelipöytäkirjasta näkee, missä ollaan, ja siitä vain
ratkaisemaan omin avuin eteenpäin! SUDOKU siis hoitaa
pelin "tylsät" perusvaiheet ratkaisijan puolesta.

Esim. HS010406-esimerkissä käy näin:

SUDOKU HS010406  / GUESS=0 RESULTS=100
Partial Solution: time=0.000
MATRIX SUDOKU.M ///
0 0 1 3 0 0 7 0 2
0 0 6 2 0 0 0 1 5
0 2 0 0 0 0 0 3 4
2 0 0 6 0 1 3 0 9
6 0 0 0 0 0 1 0 8
4 1 3 8 0 9 0 0 7
1 0 0 0 0 0 0 8 0
0 5 0 0 0 6 4 0 0
9 0 4 0 0 8 5 0 0

--- välivaiheet poistettu ---

    5  8 :   4   89:1        |  3      :   456 89:   45    |      7  :     6  9: 2       |
  3   78 :  34  789:     6   | 2       :   4  789:   4  7  |       89:1        :    5    |
    5 78 : 2       :    5 789|1   5 7 9:1   56789:    5 7  |     6 89:  3      :   4     |
------------------------------------------------------------------------------------------
 2       :      78 :    5 78 |     6   :   45 7  :1        |  3      :   45    :        9|
     6   :      7 9:    5 7 9|   45 7  : 2345 7  : 2345 7  |1        : 2 45    :       8 |
   4     :1        :  3      |       8 : 2  5    :        9| 2   6   : 2  56   :      7  |
------------------------------------------------------------------------------------------
1        :  3  67  : 2    7  |   45 7 9: 2345 7 9: 2345 7  | 2   6  9:       8 :  3  6   |
  3   78 :    5    : 2    78 |1     7 9:123   7 9:     6   |   4     : 2    7 9:1 3      |
        9:  3  67  :   4     |1     7  :123   7  :       8 |    5    : 2   67  :1 3  6   |
------------------------------------------------------------------------------------------
...............................................
Tässähän aikaisemmin SUDOKU valitsi ruutuun (1,1) numeron 8 ja onnistui.
Jos nyt tähänastinen ratkaisu SUDOKU.M kopiodaan matriisiksi A ja
valitaan tuo toinen vaihtoehto (1,1)=5 esim. komennoilla
MAT A=SUDOKU.M     / *A~Partial_Sudoku_solution_of_HS010406 9*9
MAT A(1,1)=5
niin jatkettaessa
SUDOKU A / GUESS=1
tulee ilmoitus "Mission Impossible!". Tehtävällä ei siis ole tässä muodossa ratkaisua.
Näin tapahtuu aina, jos tehtävä on mahdoton.
Kun taulukko on alunperin virheellinen, tulee heti virheilmoitus, joka on esim. muotoa
Error: (3,4)=(3,8)=7
eli numero 7 esiintyy ainakin kahdessa eri paikassa rivillä 3.
..............................................
Toinen tapa rajoittaa ratkaisun etenemistä on antaa STEPS-täsmennys.
Esim. STEPS=10 tuottaa vain ratkaisun 10 ensimmäistä askelta.

                           * * *

Survon editoriaalinen käyttöliittymä suosii Sudoku-tehtävien ratkaisijaa.
On helppo myös toimia käsin kopioimalla ja supistamalla pelitaulukkoa
toimituskentässä.
SUDOKU tuo tähän oman lisänsä, josta ratkaisija saattaa ottaa hyödykseen sen
verran kuin haluaa.
Ainakin alkeellisimmat vaiheet kannattanee jättää SUDOKUn tehtäväksi.

Seppo

Vastaukset:

Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.