VERNIEUWD (maart 2025):
• puzzles.txt heeft nieuwe opmaak, en bevat meer voorbeeldpuzzels
• gewijzigde webpagina (deze)
• gewijzigd script, met snellere uitkomst
Een logiquiz is een puzzel waarbij je logisch moet redeneren om tot een oplossing te komen. Op basis van gegeven aanwijzingen dienen verbanden te worden gelegd tussen verschillende elementen.
De elementen kunnen een lijst met personen, voorwerpen, plaatsen, tijden of andere categorieën zijn. Met de set aanwijzingen kunnen bepaalde combinaties bevestigd of uitgesloten worden. Vaak wordt een tabel (of matrix) gebruikt om informatie te ordenen en te elimineren wat niet mogelijk is. Door logisch nadenken en uitsluiten kom je uiteindelijk tot de juiste combinaties. En daarmee tot een (de) unieke oplosing. Dit is een voorbeeld.
De moeilijkheidsgraad wordt bepaald door de afmetingen van het grid, en de soort aanwijzingen (bevestigingen, ontkenningen, relatieve (on)waarheden).
Om de puzzel geautomatiseerd te laten oplossen zijn verschillende strategiën mogelijk.
Wanneer de aanwijzingen leiden een (de) oplossing, geldt het tegenovergestelde ook: de oplossing moet voldoen aan alle aanwijzingen. Dit lijkt een dooddoener, maar het is de basis van computerstrategiën, zoals die van de Brute force strategie, waarbij alle mogelijke combinaties uitgeprobeerd worden, totdat (bij toeval) de juiste wordt gevonden.
Hoeveel combinaties mogelijk zijn, is te bereken met het begrip permutatie. Hieronder wordt getoond dat drie gekleurde ballen op 6 verschillened manieren over drie posities kunnen worden verdeeld:
De puzzel kan worden uitgebreid met een extra eigenschap, bijvoorbeeld 'vorm':
de twee eigenschappen samen levert 6x6 = 36 combinaties op.
In het script is sprake van actoren, eigenschappen en waarden. Voor het digitaal oplossen dienen deze drie elementen (actor, eigenschap, waarde) aan elkaar te gekoppeld te kunnen worden.
Met de 'Brute force' methode zullen alle 36 combinaties worden onderzocht.
Maar omdat aanwijzingen de kenmerken afhankelijk van elkaar maken, is dit niet erg effficient.
Bijvoorbeeld, als een aanwijzing vertelt dat Hendrik 'groen' heeft, dan zijn van alle 36 mogelijke oplossingen er na het toepassen van de aanwijzing nog twaalf over:
((0, 2, 1), (0, 1, 2)) ((2, 0, 1), (0, 1, 2))
((0, 2, 1), (0, 2, 1)) ((2, 0, 1), (0, 2, 1))
((0, 2, 1), (1, 0, 2)) ((2, 0, 1), (1, 0, 2))
((0, 2, 1), (1, 2, 0)) ((2, 0, 1), (1, 2, 0))
((0, 2, 1), (2, 0, 1)) ((2, 0, 1), (2, 0, 1))
((0, 2, 1), (2, 1, 0)) ((2, 0, 1), (2, 1, 0))
dit bespaart enorm veel rekenkracht (!).
In dit script wordt deze tactiek gebruikt.
Voor het vastleggen van de aanwijzingen van de puzzel, kan gebruik worden gemaakt van deze formuleringen:
aanwijzing | formulering | |
biologie is het favoriete vak van arie | actors.arie == vak.biologie | |
jacobus behaalde de hoogst mogelijke score | actors.jacobus == cijfer.10 | |
voor engels werd geen zeven behaald | cijfer.engels != cijfer.7 | |
de favoriete docente van jacobus geeft frans | (actors.jacobus == docent.degroot or actors.jacobus == docent.jansen) and actors.jacobus == vak.frans | |
dhr. Visser geeft Engels | docent.visser == vak.engels | |
Wilhelmina behaalde een betere score dan Dirk | cijfer?wilhelmina > cijfer?dirk | |
het vak Frans wordt gegeven door mw. deGroot, en Economie door mw. Jansen, of omgekeerd | vak.frans == docent.degroot and vak.economie == docent.jansen or vak.frans == docent.jansen and vak.economie == docent.degroot | |
Met geringe kennis van python operatoren kan vrijwel iedere aanwijzing aangepakt worden: | ||
het cijfer dat dhr. Mulder gaf aan zijn leerling, kwam overeen met het aantal letters waaruit zijn vak bestaat | len(vak?mulder) == cijfer?mulder | |
voor economie en engels werden de minste cijfers gescoord | cijfer?economie in [5, 7] and cijfer?engels in [5, 7] |
aanwijzing | formulering | |
1. | in december komt iemand, die geen tycho heet, over vuurwerk vertellen. In mei spreekt een 45-jarige over vrijheid. | onderwerp.vuurwerk == maand.december and actors.tycho != onderwerp.vuurwerk and onderwerp.vrijheid == maand.mei and leeftijd?mei == 45 |
2. | Jeanet vertelt over nepwapens | actors.jeanet == onderwerp.nepwapens |
3. | Degene die in februari over alcohol spreekt is 2 jaar jonger dan Peter | onderwerp.alcohol == maand.februari leeftijd?peter - leeftijd?alcohol == 2 |
4. | Tycho is 42 jaar oud. Cor is ouder dan Nina | leeftijd?tycho == 42 leeftijd?cor > leeftijd?nina |
5. | Wie in juni spreekt, heeft het niet over EHBO | onderwerp.ehbo != maand.juni |
Met dit programma is het ook eenvoudig om zelf een logiquiz te ontwerpen:
de code is hier te vinden