Kerstdecoratie

Omdat ze moeten werken met de kerstdagen, wil een aantal interne verpleegsters een beetje kerstsfeer op hun kamers. Daar deze echter niet zo groot zijn, kiezen ze voor iets kleiners dan een kerstboom. Wat koopt elke zuster voor welke prijs en op welke afdeling werkt ze?

Verpleegsters: Carolien, Elisabeth, Loes, Marieke, Nel, Ursula
Afdelingen: Dermatologie, Cardiologie, Neurologie, Chirurgie, Interne, Urologie
Decoraties: WitsparTak, Skimmia, Kerststukje, Pernettia, Dwerghulst, SitkaTak
Prijzen: f 7.95 , f 15.90 , f 17.90 , f 13.90 , f 6.95 , f 8.95

Aanwijzingen:
1. De verpleegster van neurologie heeft een langere naam dan degene die het goedkoopste uit was, maar een kortere dan zowel degene die half zoveel uitgaf als zij, als degene die de Pernettia Mucronata plant kocht.
2. De chirurgie-zuster betaalde meer dan de collega's met de 1 letter langere en 1 letter kortere naam, maar was goedkoper uit dan de verpleegster die de met mooie, rode bloemknopjes getooide Skimmia Foremannii plant uitzocht voor op haar tafel.
3. Elisabeth is niet de zuster die op interne geneeskunde werkt, die voor haar plant half zoveel betaalde als Marieke voor haar decoratie.
4. Het kerststukje was f 2,= duurder dan de aankoop van de medewerkster van cardiologie, die een naam heeft van een oneven aantal letters.
5. De naam van de verpleegster die op dermatologie werkt, is 2 letters langer dan die van de zuster die de andere tak kocht. Tussen hun uitgaven zat f 1,= verschil.
6. De koopster van de Ilex-Blue Angel plant, ook wel dwerghulst genoemd, heeft een 3 letters kortere naam dan de zuster van urologie, die niet de mooie witspartak met zijn smalle hangende kegels en volle naaldtakken kocht.
7. Ursula is niet degene die f 7,95 uitgaf.

Veel mensen vinden het leuk om een dergelijke puzzel gewoon, met de hand, op te lossen. Omdat ik wel eens een boekje gelezen heb over het oplossen van logische problemen met de computer, het gebied van de Artificiele Intelligentie, vroeg ik me af of het inderdaad mogelijk is huis-tuin-en-keuken puzzels als hierboven "automatisch" op te lossen. Het is toch bekend dat voor dit doel zelfs speciale talen zijn ontwikkeld, zoals PROLOG. Na ampele beschouwing is echter duidelijk dat het helemaal niet nodig is om naar geavanceerde middelen te grijpen. Omdat alle logische problemen feitelijk equivalent zijn met problemen uit de theorie van de natuurlijke getallen (ja toch), kan de hele puzzel zelfs afdoende worden gecodeerd in FORTRAN of BASIC. Het enige wat men daarbij in acht moet nemen is wat programmeer discipline. Met name het verzinnen van een sprekende naamgeving voor de getal variabelen is geen overbodige luxe. Daarna maakt het eigenlijk niet meer uit welke taal men verkiest. Ik neem FORTRAN.

Verondersteld wordt dat men de Kunst een Computer te Programmeren enigzins in de vingers heeft. Dat staat niet los van een beetje wiskunde kunnen toepassen. Heeft men in tabelvorm ("array") gegeven een funktie f , dan is het zinvol te weten dat f een inverse funktie g kan hebben, en ook hoe die dan kan worden berekend. Voor een array met dimensie N gaat dat als volgt:

           do 10 k=1,N
     10    g(f(k))=k
Een soortgelijk probleem doet zich voor als funkties (arrays) f en g zijn gegeven, en men heeft (onbewust) de samengestelde funktie hiervan nodig, noem deze h. De berekening hiervan is:
           do 10 k=1,N
     10    h(k)=f(g(k))
In het programma, dat onder deze knop integraal is opgenomen, kan men het inverteren en samenstellen van tabellen herhaaldelijk zien gebeuren.

Een ander stukje onmisbare techniek is het omgaan met permutaties. Gesuggereerd wordt nogal eens dat men hiervoor het gemakkelijkst recursief te werk kan gaan. Dat mag dan wel zo zijn, maar het is heel goed mogelijk om permutaties op een welgedefinieerde wijze te genereren, zonder enig beroep op recursie te doen. Dit wordt gedemonstreerd door onze routine "permut". De eenvoudigste logische puzzels hebben bijvoorbeeld 4 variabelen. Dit komt overeen met 24 permutaties. Deze worden door "permut" gegenereerd in de volgende vaste volgorde:

   1 2 3 4   1 2 4 3   1 3 2 4   1 3 4 2   1 4 2 3   1 4 3 2
   2 1 3 4   2 1 4 3   2 3 1 4   2 3 4 1   2 4 1 3   2 4 3 1
   3 1 2 4   3 1 4 2   3 2 1 4   3 2 4 1   3 4 1 2   3 4 2 1
   4 1 2 3   4 1 3 2   4 2 1 3   4 2 3 1   4 3 1 2   4 3 2 1
Van links naar rechts lopen de cijfers in de permutatie zo langzaam mogelijk op. Doordat de volgorde waarin de permutaties gegenereerd worden op deze manier vast ligt, zijn we in staat om, in de loop van het programma, permutaties die verder kansloos zijn over te slaan. Dit is een meermalen voorkomende sequentie, van de vorm:
           la=la+fac(6-i)-1
Wanneer 6 het totale aantal plaatsen in de permutatie-rij is, dan verandert de grootheid die overeenkomt met plaats i in de rij namelijk pas weer na (6-i)! -1 andere permutaties. Die worden op deze manier overgeslagen.

Verder wordt in het "LogiKwiz" programma, bijna logisch zou ik zeggen, nogal omstandig gebruik gemaakt van logische variabelen. Dat is echter minder een noodzaak dan een eigenaardige, niettemin overzichtelijke methode van deze programmeur.

De globale struktuur van het computer programma bestaat uit drie in elkaar geschoven loops. De buitenste loop gaat over Afdelingen, de middelste over Prijzen, de binnenste over Decoraties. De loops komen overeen met invulvakken Naam-Afdeling, Naam-Prijs, Naam-Decoratie welke standaard in het puzzelboek worden meegeleverd. De overige invulvakken Afdeling-Decoratie, Afdeling-Prijs, Decoratie-Prijs vindt men in het programma terug als samengestelde funkties.

Tot zover een en ander ter toelichting. Verder zou het computer programma min of meer voor zichzelf moeten spreken.