Sudoku Web Lab

Sudoku Web Lab

Als je op het Web zoekt naar online Sudoku puzzels vind je vele websites die Sudoku’s aanbieden. Vaak is de moeilijkheidsgraad configureerbaar en is het aantal Sudoku’s dat online toegankelijk is groot of onbeperkt. Ik mis echter op vrijwel alle websites een stukje gebruikersvriendelijkheid en bepaalde interactieve functionaliteit die mijns inziens iedere Sudoku puzzelaar nodig heeft.

Wat betreft gebruikersvriendelijkheid valt op dat op alle online interactieve Sudoku websites twee muisklikken nodig zijn om een getal in een cel van een Sudoku puzzel te plaatsen. Meestal moet eerst het getal geselecteerd worden met een eerste muisklik. Daarna kan het getal geplaatst worden met een tweede muisklik. Dat kan beter door in iedere cel van de online Sudoku puzzel negen knopjes voor alle negen mogelijke cijfers op te nemen. Door op een knopje in een bepaalde cel te klikken kies je met één klik zowel de cel als het cijfer. Veel eenvoudiger is dat!

Een ander punt betreft de mogelijkheid om fouten te corrigeren met een “undo” knop. De praktijk leert dat als je een fout gemaakt hebt bij het invullen van een Sudoku, je meestal beter overnieuw kunt beginnen omdat je niet meer weet wanneer de fout gemaakt is, en welke cellen na het maken van de fout ingevuld, en dus onbetrouwbaar zijn. Een interactieve Sudoku implementatie met volledige undo-functionaliteit biedt hier uitkomst! De undo-knop maakt alle invullingen ongedaan in precies de omgekeerde volgorde als waarin ze geplaatst zijn. Als je weet waar het mis gegaan is kan je dus eenvoudig alle onbetrouwbare vullingen verwijderen, totdat ook de evident foute vulling weg is.

Een stukje gewenste functionaliteit dat zelden op interactieve Sudoku websites te vinden is, is een timer. Het is een leuke sport om een niet al te moeilijke Sudoku te proberen zo snel mogelijk op te lossen. Een timer die tot op de seconde nauwkeurig de tijd bijhoudt vanaf de eerste presentatie van de Sudoku totdat hij correct ingevuld is, is meerwaarde op een interactieve Sudoku website. Uiteraard moet de timer intelligent genoeg zijn om alleen te stoppen als de Sudoku correct ingevuld is. Als sprake is van een fout loopt de timer door, totdat de speler de fout gecorrigeerd heeft.

Moderne Web development frameworks zoals React en Angular maken het bouwen van een interactieve Sudoku puzzel relatief eenvoudig. Ik heb de presentatielaag van mijn Sudoku Web Lab in enkele dagen met React gebouwd. Een engine voor het geautomatiseerd oplossen van een willekeurige Sudoku had ik enkele jaren geleden al eens met Scala gebouwd. De engine voor het automatisch oplossen van een Sudoku heb ik relatief snel in JavaScript (ES6) kunnen bouwen door de Scala implementatie naar ES6 te converteren. De engine voor het oplossen van een Sudoku kan zo opgenomen worden in de SPA (Single Page App) die Sudoku Web Lab vormt.

De volgende functies in Sudoku Web Lab maken de applicatie met recht een “Lab”.

1) Het is mogelijk om machinaal Sudoku’s te genereren en die handmatig op te lossen. Het is echter ook mogelijk om handmatig een Sudoku in te voeren (die moeilijke van die prijsvraag die u zo graag wilt winnen) en deze machinaal op te lossen. Dit alles in één en dezelfde presentatie. In feite kan op ieder willekeurig moment omgeschakeld worden van handmatig oplossen naar machinaal oplossen, en omgekeerd.

2) Sudoku Web Lab ondersteunt interactief de bekende oplosmethode van het elimineren van mogelijkheden per cel. Een cel waarin nog geen cijfer staat heeft in beginsel negen mogelijkheden voor vulling. Door de aanwezigheid van cijfers in andere cellen worden bepaalde mogelijkheden uitgesloten. Zodra er nog maar één mogelijkheid in een cel over is kan een vaste waarde ingevuld worden, aangezien er geen andere mogelijkheden meer zijn. Een administratie van mogelijkheden per cel wordt gevormd door de kleine knopjes waarmee de waarde van een cel gefixeerd kan worden. Het klikken op een knopje met de linkermuisknop fixeert de betreffende waarde voor die cel. Het klikken op een knopje met de rechtermuisknop verwijdert de mogelijkheid om deze waarde te fixeren voor deze cel. Het betreffende knopje wordt uitgegrijsd.

3) Sudoku Web Lab ondersteunt het gefaseerd machinaal oplossen van een Sudoku met de knop “Solve Step!”. Voor deze functionaliteit is een bepaalde stapgrootte gedefinieerd. De eerste stap in het oplossingsproces bestaat altijd uit het uitvoeren van alle mogelijke streep-acties. Dat wil zeggen dat mogelijkheden in cellen die uitgesloten worden door een enkele gefixeerde waarde in een andere cel allemaal geëlimineerd worden. Een volgende stap kan zijn het elimineren van mogelijkheden op basis van “naked twins” of meer geavanceerde technieken om tot uitsluiting van bepaalde mogelijkheden te komen. Alle streep-acties worden uitgevoerd als één stap. Bij de meer geavanceerde technieken worden de mogelijkheden voor toepassing verdeeld over individuele gevallen. Als er mogelijkheden zijn voor drie “naked Twins” dan worden deze in drie afzonderlijke stappen uitgevoerd. Het interessante van de mogelijkheid om gefaseerd op te lossen is dat de progressie in de oplossing op het speelveld te zien is aan de knopjes in de cellen. Zodra een mogelijkheid voor een bepaald cijfer in een bepaalde cel verdwijnt, wordt de betreffende knop uitgegrijsd.

4) Sudoku Web Lab ondersteunt op verschillende manieren het doen van bewerkingen in andere richtingen dan de gebruikelijke richting van het invullen van cellen waar nog geen vast cijfer in staat. Er is de reeds eerder genoemde “undo” knop, waarmee terug gegaan kan worden naar voorgaande situaties op het speelveld. Met de “Undo Move!” knop gaat het speelveld één stap terug. Een stap is daarbij het handmatig invoeren van een wijziging op het speelveld (het fixeren van een cijfer in een cel of het verwijderen van een mogelijkheid in een cel), of een machinale stap in de oplossingsprocedure, gedaan met de “Solve Step!” knop. Daarnaast is er de mogelijkheid om een gefixeerd getal in een cel te verwijderen, door met de rechtermuisknop op een cel met een gefixeerd getal te klikken. Dit heeft tot gevolg dat alle negen knopjes weer zichtbaar worden in die cel. Bovendien worden in alle cellen waarin geen cijfer gefixeerd is alle negen knopjes weer zichtbaar. Het is namelijk lastig om de gevolgen van de verwijdering van een cijfer uit een cel voor de mogelijkheden in de omringende cellen te bepalen. Een enkele klik op “Solve Step!” heeft echter tot gevolg dat alles wat onmogelijk is ten gevolge van gefixeerde waarden in cellen geëlimineerd wordt.

5) Het deleten van een gefixeerd getal in een cel is doorgaans niet de beste manier om een vergissing ongedaan te maken. Gebruik “Undo Move!” daarvoor. Feitelijk kan het deleten van een gefixeerd getal op zichzelf ongedaan gemaakt worden met “Undo Move!”. Het deleten van een gefixeerd getal is met name interessant om te experimenteren met gegenereerde Sudoku’s. De verwijdering van een gefixeerde waarde uit een onopgeloste puzzel zal doorgaans tot gevolg hebben dat de Sudoku dubbelzinnig wordt. Het machinaal oplossen van een dubbelzinnige Sudoku zal een speelveld te zien geven waaruit op te maken is waar de dubbelzinnigheden zitten. Vaak kan een ander getal ingevuld worden op de leeggekomen plaats, en ontstaat op die manier een andere Sudoku, met vaak andere eigenschappen (andere moeilijkheidsgraad e.d.). Het deleten van gefixeerde waarden maakt dus experimenteren met Sudoku’s mogelijk, en de gevolgen van deze experimenten zijn afleesbaar van het speelveld in de mogelijkheden die overblijven in de diverse cellen.

6) De progressie in de oplossing van de Sudoku wordt weergegeven in het kadertje “Board Status” met allerlei informatie over de status van het speelveld en van de gedane stap in het proces van oplossen. De samenvatting van de status van het speelbord staat bovenaan en is “Unsolved”, “Solved”, “Ambiguous” of “Contradictory”. Bij het handmatig oplossen wordt een eventuele status “Contradictory” pas getoond als het speelbord geheel ingevuld is, zodat deze status niet gebruikt kan worden als een machinale controle of een ingevulde waarde correct is. Bij het machinaal oplossen wordt een status “Ambiguous” of “Contradictory” getoond zodra hij gedetecteerd is. De overige informatie in het kadertje “Board Status” geeft nadere details over de stap of stappen die gedaan zijn in het oplossingsproces. De termen “Stripes”, “Naked Twins”, “Subgroup Exclusion”, “Generalized Permutation Exclusion” (met 3, 4, 5 or 6 elementen) zijn min of meer standaard in Sudoku terminologie. Uitleg van deze termen valt buiten de scope van deze introductie van Sudoku Web Lab. Op het Web is uitleg van deze termen ruim voorhanden.

7) De machinale generatie van Sudoku’s biedt zes verschillende moeilijkheidsgraden. In vergelijking met Sudoku’s in commercieel verkrijgbare puzzelboekjes is Level 1 al vrij pittig. Het komt zeker niet overeen met wat doorgaans geklassificeerd wordt als “1 ster”. Een beschrijving van de verschillende moeilijkheidsgraden:
* Level 1: oplosbaar met slechts “stripes”.
* Level 2: oplosbaar als Level 1 met daarbij één of meerdere “naked twin exclusions”.
* Level 3: oplosbaar als Level 2 met daarbij één of meerdere “subgroup exlusions”.
* Level 4: oplosbaar als Level 3 met daarbij één of meerdere “generalized permutation exclusions” met 3 elementen.
* Level 5: oplosbaar als Level 4 met daarbij één of meerdere “generalized permutation exclusions” met 4 elementen.
* Level 6: oplosbaar als Level 5 met daarbij één of meerdere “generalized permutation exclusions” met meer dan 4 elementen en/of backtracking.
De moeilijkheid van Level 1 is dat weliswaar slechts “stripes” noodzakelijk zijn om tot een oplossing te komen, maar soms is er maar 1 cel op het speelbord waarvan de inhoud te bepalen is met “stripes”. Bij handmatig oplossen is het vaak eenvoudiger om een meer geavanceerde techniek zoals “subgroup exclusion” te gebruiken dan te zoeken naar die ene cel die met “stripes” gevuld kan worden. De gehanteerde klassificatie van moeilijkheidsgraden is dus vrij grof en de ervaren Sudoku puzzelaar zou in bepaalde gevallen een Level 1 gegenereerde Sudoku lastiger kunnen vinden dan een Level 2 gegenereerde Sudoku.

Sudoku Web Lab is getest en werkt goed in moderne versies van de browsers Chrome, IE en Firefox. Oudere versies van browsers zullen mogelijk de applicatie niet goed weergeven. Firefox werkt functioneel goed, maar visueel zijn er kleine onvolkomenheden te zien in de weergave van het speelbord. Hier wordt aan gewerkt. Voor een goede weergave van Sudoku Web Lab is een monitor met Full HD resolutie nodig. Het speelbord bevat veel kleine details (729 buttons) die een royale resolutie vereisen. Gebruik eventueel ctrl/+ of ctrl/- om de afmeting van het speelveld optimaal op de beschikbare monitor weer te geven.