program LogiKwiz * ======== * De puzzel "Kolenhandel" augustus '93 * ------------------------------------ implicit integer (a-z) integer KlantVak(8),GroenteVak(8),GroenteKlant(8) integer VakKlant(8),VakGroente(8),KlantGroente(8) integer EersteLoop(100) * ... Overige data: integer lang(8),rij(8) logical kool(8),dame(8) logical ok * * ... Vak: data A , B , C , D , E , F , G , H / / 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 / * ... Klant: data lang / 5 , 3 , 5 , 4 , 6 , 4 , 5 , 5 / data Irene, Jos ,Karin,Lies,Monica,Nora,Paula,Sonja / / 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 / data dame /.True.,.False., 6 * .True. / * ... Groente: data Bloemkool,Raapstelen,RodeKool, Savooiekool / / 1 , 2 , 3 , 4 / data Snijbonen,Spitskool ,Tuinbonen,WitteKool / / 5 , 6 , 7 , 8 / data kool / .True.,.False.,.True.,.True., , .False.,.True.,.False.,.True. / * * ... Groente en Vakken: * ----------------- kount=0 do 10 v=1,40320 nop=permut(v,8,VakGroente) * ... Inverse: do 15 k=1,8 15 GroenteVak(VakGroente(k))=k * * 1. In het vak achter de bloemkool: vak=VakGroente(Bloemkool)-4 if(vak.le.0) goto 10 * Lag ook kool: ok=kool(GroenteVak(vak)) if(.not.ok) goto 10 * * 1. In vak E lag geen kool: ok=.not.kool(GroenteVak(E)) if(.not.ok) goto 10 * * 2. Het vak pal rechts naast dat met de tuinbonen: vak=VakGroente(Tuinbonen) ok=vak.ne.4 .and. vak.ne.8 if(.not.ok) goto 10 * * 4. De raapstelen waren te vinden in vak A : ok=GroenteVak(A).eq.Raapstelen if(.not.ok) goto 10 * * 5. Op de achterste rij lag zowel de witte kool * Als, meer naar rechts: ok=VakGroente(WitteKool).le.3 if(.not.ok) goto 10 * * 7. De letter van het vak van de spitskool: ok=mod(VakGroente(Spitskool),2).eq.1 if(.not.ok) goto 10 * * ... Klant en Vak: * ------------ do 20 k=1,40320 nop=permut(k,8,KlantVak) * ... Inverse: do 25 k=1,8 25 VakKlant(KlantVak(k))=k * * ... Klant en Groente: * ---------------- do 30 k=1,8 30 KlantGroente(GroenteVak(k))=KlantVak(k) do 35 k=1,8 30 GroenteKlant(KlantGroente(k))=k * * 1. Karin kocht de bloemkool: ok=Karin.eq.KlantGroente(Bloemkool) if(.not.ok) goto 20 * * 2. Paula kocht iets uit het vak pal rechts naast dat met de tuinbonen: ok=VakKlant(Paula).eq.VakGroente(Snijbonen)+1 if(.not.ok) goto 20 * * 3. De dame die de groente uit vak H koos: ok=dame(KlantVak(H)) if(.not.ok) goto 20 * * Heeft een kortere naam dan de klant voor vak D : ok=lang(KlantVak(H)).lt.lang(KlantVak(D)) if(.not.ok) goto 20 * * De klant voor vak D heet niet Monica: ok=KlantVak(D).ne.Monica if(.not.ok) goto 20 * * 5. Op de achterste rij lag de groente die Lies kocht: ok=VakKlant(Lies).lt.4 if(.not.ok) goto 20 * * Meer naar rechts dan de witte kool: ok=VakKlant(Lies).gt.VakGroente(WitteKool) if(.not.ok) goto 20 * * 6. Jos koos groente uit vak G : ok=VakKlant(Jos).eq.G if(.not.ok) goto 20 * * 8. De groente van Sonja en de snijbonen waren boven elkaar te zien: ok=VakKlant(Sonja).eq.VakGroente(Snijbonen)+4 .or. . VakKlant(Sonja).eq.VakGroente(Snijbonen)-4 if(.not.ok) goto 20 * * De snijbonen waren niet voor Irene: ok=GroenteKlant(Irene).ne.Snijbonen if(.not.ok) goto 20 * * 9. Nora kocht geen savooiekool: ok=GroenteKlant(Nora).ne.Savooiekool if(.not.ok) goto 20 * * ... De oplossing: * ------------ * write(*,*) * write(*,*) * 20 continue 10 continue * end function permut(l,n,r) * ====== * Permutations of array r(n) * -------------------------- * l = ordinal number (input) * n = number of entries in: (input) * r = row of permutations (output) * implicit integer (a-z) dimension r(n) * ... Init ... h=1 do 5 k=1,n 5 r(k)=k * ... Body ... teken=1 do 10 k=1,n p=n-k+1 q=p-mod((l-1)/h,p) if(q.eq.p) goto 10 s=r(p) r(p)=r(q) r(q)=s teken=-teken 10 h=h*p permut=teken return end