program LogiKwiz * ======== * De puzzel "HAVO-tweelingen" * --------------------------- * Op de Nassau-havo zitten vijf tweelingen die elk bestaan uit * broer en zus. In ieder van de vijf klassen zit een van de meisjes. * * Aan u de vraag uit te zoeken in welke klas ieder meisje zit, * hoe haar tweelingbroer heet en hoe hun beider achternaam luidt. * * Oplossing: * * MEISJE KLAS(MEISJE) TWEELINGBROER ACHTERNAAM (JAAR) * Alice 1 Johan Winters +1 +1 * Diana 3 Dennis Houtman +1 +1 * Gonny 5 Pieter Maasdijk -1 -1 * Petra 4 Inne Zanders -1 +1 * Wendy 2 Mark Driessen +1 +1 * implicit integer (a-z) * ... Oplossingen: integer NaamZus(5),NaamBroer(5) integer ZusBroer(5),ZusNaam(5) integer KlasZus(5),KlasBroer(5) integer BroerZus(5),BroerNaam(5) * ... Overige data: character zus(5)*15,broer(5)*15,naam(5)*15 logical ok,ok1,ok2,ok3 integer jaar(5) * * ... Uitsluitend voor het afdrukken: data zus / 'Alice','Diana','Gonny','Petra','Wendy' / data naam / 'Driessen','Houtman','Maasdijk','Winters','Zanders' / data broer / 'Dennis','Inne','Johan','Mark','Pieter' / * * ... Representatie als getallen: data Alice,Diana,Gonny,Petra,Wendy / / 1 , 2 , 3, 4 , 5 / data Driessen,Houtman,Maasdijk,Winters,Zanders / / 1 , 2 , 3, 4 , 5 / data Dennis,Inne,Johan,Mark,Pieter / / 1 , 2 , 3, 4 , 5 / fac5=fac(5) * * ... Meisjes en Namen: * ---------------- do 10 nn=1,fac5 call permut(nn,5,NaamZus) do 11 k=1,5 11 ZusNaam(NaamZus(k))=k * * 4. Gonny noch Diana heet Winters,Driessen of Zanders. * zij=NaamZus(Gonny) ok=zij.ne.Winters.and.zij.ne.Driessen.and.zij.ne.Zanders if(.not.ok) goto 10 * zij=NaamZus(Diana) ok=zij.ne.Winters.and.zij.ne.Driessen.and.zij.ne.Zanders if(.not.ok) goto 10 * * ... en Broers: * --------- do 20 bb=1,fac5 call permut(bb,5,ZusBroer) do 21 k=1,5 21 BroerZus(ZusBroer(k))=k do 22 k=1,5 22 BroerNaam(NaamZus(k))=BroerZus(k) do 23 k=1,5 23 NaamBroer(BroerNaam(k))=k * * 1. Alice is niet de tweelingzus van Mark of Dennis * ok=Alice.ne.ZusBroer(Mark) if(.not.ok) goto 20 ok=Alice.ne.ZusBroer(Dennis) if(.not.ok) goto 20 * * en Diana is niet de zus van Pieter. * ok=Diana.ne.ZusBroer(Pieter) if(.not.ok) goto 20 * * 5. De achternaam van Dennis is niet Driessen of Maasdijk. * hij=NaamBroer(Dennis) ok=hij.ne.Driessen.and.hij.ne.Maasdijk if(.not.ok) goto 20 * * ... en Klassen: * ---------- do 30 kk=1,fac5 call permut(kk,5,KlasZus) * * 2. Alice en Wendy zitten in een lagere klas dan de andere meisjes * memo=KlasZus(Alice) ok1=memo.lt.KlasZus(Diana) ok2=memo.lt.KlasZus(Gonny) ok3=memo.lt.KlasZus(Petra) ok=ok1.and.ok2.and.ok3 if(.not.ok) goto 30 * memo=KlasZus(Wendy) ok1=memo.lt.KlasZus(Diana) ok2=memo.lt.KlasZus(Gonny) ok3=memo.lt.KlasZus(Petra) ok=ok1.and.ok2.and.ok3 if(.not.ok) goto 30 * * Geen meisje zit bij haar tweelingbroer in de klas, want van iedere * tweeling is of broer of zus een jaar achtergeraakt. * do 40 maal=1,32 rest=maal-1 do 41 k=1,5 jaar(k)=mod(rest,2)*2-1 41 rest=rest/2 * do 42 k=1,5 42 KlasBroer(BroerZus(k))=KlasZus(k)+jaar(k) ok=.true. do 43 k=1,5 43 ok=ok.and.KlasBroer(k).ge.1.and.KlasBroer(k).le.5 if(.not.ok) goto 40 * * 2.(Alice en Wendy zitten in een lagere klas dan de andere meisjes.) * De klasnummers van hun beider broers zijn samen gelijk aan het * klasnummer van de zus van Pieter * samen=KlasBroer(BroerZus(Alice))+KlasBroer(BroerZus(Wendy)) ok=samen.eq.KlasZus(ZusBroer(Pieter)) if(.not.ok) goto 40 * * en ook aan de som van de klasnummers van de zussen van Dennis en Mark. * som=KlasZus(ZusBroer(Dennis))+KlasZus(ZusBroer(Mark)) ok=samen.eq.som if(.not.ok) goto 40 * * 4.(Gonny noch Diana heet Winters,Driessen of Zanders.) * Hun broers zitten in dezelfde klas als de zus van Inne. * ok=KlasBroer(BroerZus(Gonny)).eq.KlasZus(ZusBroer(Inne)) if(.not.ok) goto 40 ok=KlasBroer(BroerZus(Diana)).eq.KlasZus(ZusBroer(Inne)) if(.not.ok) goto 40 * * 3. de jongen Winters en het meisje Driessen zitten in dezelfde klas. * ok=KlasBroer(BroerNaam(Winters)).eq.KlasZus(ZusNaam(Driessen)) if(.not.ok) goto 40 * write(*,*) do 50 k=1,5 write(*,*) zus(k), ) KlasZus(k),' ', ) broer(BroerZus(k)), ) naam(NaamZus(k)), ) jaar(k) 50 continue write(*,*) * 40 continue 30 continue 20 continue 10 continue end