maandag 27 februari 2012

Align Align... Align Align...

Eindelijk heb ik de laatste functie kunnen aanmaken: de functie align()

Het methode berust op het feit dat als er binnen een grote vak (=regio) één cijfer alleen maar mogelijk is binnen een bepaalde rij of kolom, dan is dit cijfer niet mogelijk voor de vakken van dezelfde rij of kolom buiten de regio.


Gebruik makend van deze laatste functie bekom ik:

>>> solve(grids)

solved grids:  50/50
time:  34.887 s

Daarna heb ik een verificatiefunctie check() aangemaakt. Deze geeft mij aan als er een of meerdere problemen zijn in de verschillende sudoku's en of alles juist is.

>>> check(solutions)

All completed

Double was a double agent...

Nadat ik eventjes de oplossingen die ik kreeg bij het toepassen van mijn functie double() bekeek, zag ik met veel teleurstelling dat iets niet klopte. Ik ben dus op de definitie van de doubletmethode terug gegaan en zag dat ik de variant slecht had begrepen: er moet immers geen andere vak bestaan die in dezelfde entiteit de ene of de andere waarde bevat van de twee vakken (zie post: It gets harsh!).

Ik heb dit aangepast en zelfs de functies triple() en quad() op basis daarvan aangemaakt. Het is dezelfde principe als bij de double() functie maar dan met drie/vier waarden en vakken.

Het resultaat was onthutsend:

>>> solve(grids)



solved grids:  49/50
time:  32.956 s

Tot nu toe gebruikte stappenplan.

Op het laatste moment heb ik opgemerkt dat ik mijn stappenplan ben vergeten op te schrijven. Ik dacht immers geen "exacte plan" te gebruiken maar gewoon functies één per één aan te maken die mij tot mijn doel zouden kunnen brengen. Kort zou ik mijn stappenplan kunnen formuleren als volgt:

1) Txt-bestand met de sudoku's omzetten tot een lijst van 9x9 matrices.
2) Lijst aanmaken van candidaten van de lege vakken, gekoppeld met hun positie in de matrices.
3) Sudokumethodes vinden en omzetten in bruikbare functies. (t.e.m. het einde)
4) Eens dat er oplossingen gevonden zijn, deze in een nieuw txt-document opschrijven
5) Een testfunctie aanmaken die uittest als de oplossingen wel kloppen.
6) Optellen van elke 3-cijfers nummer in de linkertop van elke sudokus. (extra, als alle sudoku's zijn opgelost)

zaterdag 4 februari 2012

It gets harsh! Time to work double!

Wat merkwaardig is met de sudokus is dat hoe meer methodes je zoekt om ze te oplossen, hoe moeilijker en ingewikkeld de methodes worden!
Maar gelukkig kwamen er overtuigende resultaten na enkele dagen hard werken. Ik ben namelijk op een van de belangrijkste methodes na de basismethodes gevallen: de doubletten!

Deze berust op het feit dat als twee vakken binnen een entiteit (zelfde rij, kolom of grote vak) elk alleen maar twee keer dezelfde mogelijkheden bevatten (d.i. a =/= b met a,b ∈ [1,9] ∩ ), alle andere vakken binnen deze entiteit deze twee mogelijkheden juist niet kunnen bevatten.

Er is ook een variant daarop waarbij als twee vakken binnen een entiteit de enige vakken zijn die twee bepaalde mogelijkheden bevatten, alle andere mogelijkheden binnen deze twee vakken kunnen worden uitgesloten.



Dit principe heb ik dus vervat in een functie met naam double(). Het is toch opmerkelijk dat het voltooiing van het tweede deel van de functie (de variant) veel meer tijd nodig heeft. Ik heb uiteindelijk ook gekozen om de niet volledig opgeloste sudokus op het scherm te laten verschijnen om ze later te kunnen analyseren.


>>> solve(grids)



solved grids:  47/50
time:  37.046 s