program LogiKwiz * ======== * Oplossing van de puzzel "Kerstdecoratie" * ---------------------------------------- * Carolien Dermatologie WitsparTak f 7 95 * Elisabeth Cardiologie Skimmia f 15 90 * Loes Neurologie Kerststukje f 17 90 * Marieke Chirurgie Pernettia f 13 90 * Nel Interne Dwerghulst f 6 95 * Ursula Urologie SitkaTak f 8 95 * * Methode waarbij kansloze permutaties worden overgeslagen. * Dit resulteert in een bijna menselijk aantal vergeefse * pogingen, namelijk: kount = 196 . * implicit integer (a-z) * ... Oplossingen: integer NaamAfd(6),NaamStuk(6),NaamPrijs(6) integer AfdNaam(6),AfdStuk(6),AfdPrijs(6) integer StukNaam(6),StukAfd(6),StukPrijs(6) integer PrijsNaam(6),PrijsAfd(6),PrijsStuk(6) * ... Overige data: integer lengte(6),bedrag(6) logical ok,ok1,ok2,tak(6) character naam(6)*15,afd(6)*15,stuk(6)*15,prijs(6)*8 * * ... Uitsluitend voor het afdrukken: data naam / 'Carolien','Elisabeth','Loes', , 'Marieke','Nel','Ursula' / data stuk / 'Dwerghulst','Kerststukje','Pernettia', , 'SitkaTak','Skimmia','WitsparTak' / data afd / 'Cardiologie','Chirurgie','Dermatologie', , 'Interne','Neurologie','Urologie' / data prijs / 'f 6 95','f 7 95','f 8 95', , 'f 13 90','f 15 90','f 17 90'/ * * ... Representatie als getallen: data Carolien, Elisabeth, Loes, Marieke, Nel, Ursula / / 1 , 2 , 3, 4 , 5 , 6 / data lengte / 8 , 9 , 4 , 7 , 3 , 6 / data Dwerghulst, Kerststukje, Pernettia, SitkaTak, , Skimmia, WitsparTak / / 1 , 2 , 3, 4 , 5 , 6 / data tak / .False.,.False.,.False.,.True.,.False.,.True./ data Cardiologie, Chirurgie, Dermatologie, Interne, , Neurologie, Urologie / / 1 , 2 , 3, 4 , 5 , 6 / data f695, f795, f895, f1390, f1590, f1790 / / 1 , 2 , 3, 4 , 5 , 6 / data bedrag / 695, 795, 895, 1390, 1590, 1790 / data kount / 0 / fac6=fac(6) * * ... Namen en Afdelingen: * ------------------- la=0 do 10 a=1,fac6 la=la+1 if(la.gt.fac6) stop 'la' call permut(la,6,NaamAfd) do 11 k=1,6 11 AfdNaam(NaamAfd(k))=k * * 4. de medewerkster van cardiologie, * die een naam heeft van een oneven aantal letters: * ok=mod(lengte(NaamAfd(Cardiologie)),2).eq.1 if(.not.ok) la=la+fac(6-Cardiologie)-1 if(.not.ok) goto 10 * * 2. De chirurgie-zuster (betaalde meer dan de) collega's * met de 1 letter langere en 1 letter kortere naam: * collega1=0 collega2=0 memo=NaamAfd(Chirurgie) do 15 k=1,6 * ... Geen collega van zichzelf: if(k.eq.memo) goto 15 verschil=lengte(k)-lengte(memo) if(verschil.eq.+1) collega1=k if(verschil.eq.-1) collega2=k 15 continue ok=collega1.ne.0 .and. collega2.ne.0 if(.not.ok) la=la+fac(6-Chirurgie)-1 if(.not.ok) goto 10 * * 5. De naam van de verpleegster die op dermatologie werkt, * is 2 letters langer dan die van de zuster ... : * zuster=0 do 12 k=1,6 if(k.eq.NaamAfd(Dermatologie)) goto 12 ok=lengte(NaamAfd(Dermatologie)).eq.(lengte(k)+2) zuster=k 12 continue if(.not.ok) la=la+fac(6-Dermatologie)-1 if(.not.ok) goto 10 * * 3. Elisabeth is niet de zuster die op interne geneeskunde werkt: * ok=NaamAfd(Interne).ne.Elisabeth if(.not.ok) la=la+fac(6-Interne)-1 if(.not.ok) goto 10 * * ... Namen en Prijzen: * ---------------- lp=0 do 20 p=1,fac6 lp=lp+1 if(lp.gt.fac6) goto 10 call permut(lp,6,NaamPrijs) do 21 k=1,6 21 PrijsNaam(NaamPrijs(k))=k do 22 k=1,6 22 PrijsAfd(AfdNaam(k))=PrijsNaam(k) do 23 k=1,6 23 AfdPrijs(PrijsAfd(k))=k * * 7. Ursula is niet degene die f7,95 uitgaf: * ok=NaamPrijs(f795).ne.Ursula if(.not.ok) lp=lp+fac(6-f795)-1 if(.not.ok) goto 20 * * 1. De verpleegster van neurologie heeft een langere naam * dan degene die het goedkoopste uit was: * ok=lengte(NaamAfd(Neurologie)).gt. . lengte(NaamPrijs(f695)) if(.not.ok) lp=lp+fac(6-f695)-1 if(.not.ok) goto 20 * * 1. maar een kortere dan zowel degene die half zoveel uitgaf * als zij: * helft=PrijsAfd(Neurologie)-3 ok=helft.gt.0 if(.not.ok) lp=lp+fac(6-PrijsAfd(Neurologie))-1 if(.not.ok) goto 20 * ok=lengte(NaamAfd(Neurologie)).lt. . lengte(NaamPrijs(helft)) if(.not.ok) lp=lp+fac(6-PrijsAfd(Neurologie))-1 if(.not.ok) goto 20 * * 2. De chirurgie-zuster betaalde meer dan de collega's * met de 1 letter langere en 1 letter kortere naam: * ok1=PrijsAfd(Chirurgie).gt.PrijsNaam(collega1) ok2=PrijsAfd(Chirurgie).gt.PrijsNaam(collega2) ok=ok1.and.ok2 if(.not.ok) goto 20 * * 3. de zuster die op interne geneeskunde werkt, die voor haar * plant half zoveel betaalde als Marieke voor haar decoratie: * ok=PrijsAfd(Interne).eq.PrijsNaam(Marieke)-3 if(.not.ok) goto 20 * * ... Namen en Decoraties: * ------------------- ls=0 do 30 s=1,fac6 ls=ls+1 if(ls.gt.fac6) goto 20 call permut(ls,6,NaamStuk) do 31 k=1,6 31 StukNaam(NaamStuk(k))=k do 32 k=1,6 32 StukAfd(AfdNaam(k))=StukNaam(k) do 33 k=1,6 33 AfdStuk(StukAfd(k))=k do 34 k=1,6 34 StukPrijs(PrijsNaam(k))=StukNaam(k) do 35 k=1,6 35 PrijsStuk(StukPrijs(k))=k * * 6. De koopster van de Ilex-Blue Angel plant, ook wel dwerghulst * genoemd, heeft een drie letters kortere naam dan de zuster * van urologie: * ok=lengte(NaamStuk(Dwerghulst)).eq.lengte(NaamAfd(Urologie))-3 if(.not.ok) ls=ls+fac(6-Dwerghulst)-1 if(.not.ok) goto 30 * * 4. Het kerststukje was f2,= duurder dan de aankoop van * de medewerkster van cardiologie: * ok=bedrag(PrijsStuk(Kerststukje)).eq. . bedrag(PrijsAfd(Cardiologie))+200 if(.not.ok) ls=ls+fac(6-Kerststukje)-1 if(.not.ok) goto 30 * * 1.(De verpleegster van neurologie heeft een langere naam * dan zowel degene die half zoveel uitgaf als zij) * als degene die de Pernettia Mucronata plant kocht: * ok=NaamPrijs(helft).ne.NaamStuk(Pernettia) if(.not.ok) ls=ls+fac(6-Pernettia)-1 if(.not.ok) goto 30 * ok=lengte(NaamAfd(Neurologie)).lt. . lengte(NaamStuk(Pernettia)) if(.not.ok) ls=ls+fac(6-Pernettia)-1 if(.not.ok) goto 30 * * 2. maar was goedkoper uit dan de verpleegster die de met mooie * rode bloempknopjes getooide Skimmia Foremannii plant uitzocht * voor op haar tafel: * ok=PrijsAfd(Chirurgie).lt.PrijsStuk(Skimmia) if(.not.ok) ls=ls+fac(6-Skimmia)-1 if(.not.ok) goto 30 * * 5. De naam van de verpleegster die op dermatologie werkt, is 2 * letters langer dan die van de zuster die de andere tak kocht: * ok=tak(StukAfd(Dermatologie)) if(.not.ok) ls=ls+fac(6-StukAfd(Dermatologie))-1 if(.not.ok) goto 30 * ok=tak(StukNaam(zuster)) if(.not.ok) ls=ls+fac(6-StukNaam(zuster))-1 if(.not.ok) goto 30 * * 5. Tussen hun uitgaven zat f1,= verschil: * verschil=bedrag(PrijsNaam(zuster))- - bedrag(PrijsAfd(Dermatologie)) ok=verschil.eq.100 .or. verschil.eq.-100 if(.not.ok) ls=ls+fac(6-StukAfd(Dermatologie))-1 if(.not.ok) goto 30 * * 6. die niet de mooie witspartak (met zijn smalle hangende kegels * en volle naaldtakken) kocht: * ok=StukAfd(Urologie).ne.WitsparTak if(.not.ok) ls=ls+fac(6-WitsparTak)-1 if(.not.ok) goto 30 * write(*,*) do 50 k=1,6 write(*,*) naam(k), ) afd(AfdNaam(k)), ) stuk(StukNaam(k)), ) prijs(PrijsNaam(k)) 50 continue write(*,*) write(*,*) kount write(*,*) stop 'OK' * 30 kount=kount+1 20 kount=kount+1 10 kount=kount+1 end