REM The names (only used for printing the results): DIM Drink$(4), Nation$(4), Colr$(4), Smoke$(4), Animal$(4) Drink$() = "Beer", "Coffee", "Milk", "Tea", "Water" Nation$() = "Denmark", "England", "Germany", "Norway", "Sweden" Colr$() = "Blue", "Green", "Red", "White", "Yellow" Smoke$() = "Blend", "BlueMaster", "Dunhill", "PallMall", "Prince" Animal$() = "Birds", "Cats", "Dog", "Horse", "Zebra" REM Some single-character tags: a$ = "A" : b$ = "B" : c$ = "C" : d$ = "D" : e$ = "E" REM BBC BASIC Doesn't have enumerations! Beer$=a$ : Coffee$=b$ : Milk$=c$ : Tea$=d$ : Water$=e$ Denmark$=a$ : England$=b$ : Germany$=c$ : Norway$=d$ : Sweden$=e$ Blue$=a$ : Green$=b$ : Red$=c$ : White$=d$ : Yellow$=e$ Blend$=a$ : BlueMaster$=b$ : Dunhill$=c$ : PallMall$=d$ : Prince$=e$ Birds$=a$ : Cats$=b$ : Dog$=c$ : Horse$=d$ : Zebra$=e$ REM Create the 120 permutations of 5 objects: DIM perm$(120), x$(4) : x$() = a$, b$, c$, d$, e$ REPEAT p% += 1 perm$(p%) = x$(0)+x$(1)+x$(2)+x$(3)+x$(4) UNTIL NOT FNperm(x$()) REM Express the statements as conditional expressions: ex2$ = "INSTR(Nation$,England$) = INSTR(Colr$,Red$)" ex3$ = "INSTR(Nation$,Sweden$) = INSTR(Animal$,Dog$)" ex4$ = "INSTR(Nation$,Denmark$) = INSTR(Drink$,Tea$)" ex5$ = "INSTR(Colr$,Green$+White$) <> 0" ex6$ = "INSTR(Drink$,Coffee$) = INSTR(Colr$,Green$)" ex7$ = "INSTR(Smoke$,PallMall$) = INSTR(Animal$,Birds$)" ex8$ = "INSTR(Smoke$,Dunhill$) = INSTR(Colr$,Yellow$)" ex9$ = "MID$(Drink$,3,1) = Milk$" ex10$ = "LEFT$(Nation$,1) = Norway$" ex11$ = "ABS(INSTR(Smoke$,Blend$)-INSTR(Animal$,Cats$)) = 1" ex12$ = "ABS(INSTR(Smoke$,Dunhill$)-INSTR(Animal$,Horse$)) = 1" ex13$ = "INSTR(Smoke$,BlueMaster$) = INSTR(Drink$,Beer$)" ex14$ = "INSTR(Nation$,Germany$) = INSTR(Smoke$,Prince$)" ex15$ = "ABS(INSTR(Nation$,Norway$)-INSTR(Colr$,Blue$)) = 1" ex16$ = "ABS(INSTR(Smoke$,Blend$)-INSTR(Drink$,Water$)) = 1" REM Solve: solutions% = 0 TIME = 0 FOR nation% = 1 TO 120 Nation$ = perm$(nation%) IF EVAL(ex10$) THEN FOR colr% = 1 TO 120 Colr$ = perm$(colr%) IF EVAL(ex5$) IF EVAL(ex2$) IF EVAL(ex15$) THEN FOR drink% = 1 TO 120 Drink$ = perm$(drink%) IF EVAL(ex9$) IF EVAL(ex4$) IF EVAL(ex6$) THEN FOR smoke% = 1 TO 120 Smoke$ = perm$(smoke%) IF EVAL(ex14$) IF EVAL(ex13$) IF EVAL(ex16$) IF EVAL(ex8$) THEN FOR animal% = 1 TO 120 Animal$ = perm$(animal%) IF EVAL(ex3$) IF EVAL(ex7$) IF EVAL(ex11$) IF EVAL(ex12$) THEN PRINT "House Drink Nation Colour Smoke Animal" FOR house% = 1 TO 5 PRINT ; house% ,; PRINT Drink$(ASCMID$(Drink$,house%)-65),; PRINT Nation$(ASCMID$(Nation$,house%)-65),; PRINT Colr$(ASCMID$(Colr$,house%)-65),; PRINT Smoke$(ASCMID$(Smoke$,house%)-65),; PRINT Animal$(ASCMID$(Animal$,house%)-65) NEXT solutions% += 1 ENDIF NEXT animal% ENDIF NEXT smoke% ENDIF NEXT drink% ENDIF NEXT colr% ENDIF NEXT nation% PRINT '"Number of solutions = "; solutions% PRINT "Solved in " ; TIME/100 " seconds" END DEF FNperm(x$()) LOCAL i%, j% FOR i% = DIM(x$(),1)-1 TO 0 STEP -1 IF x$(i%) < x$(i%+1) EXIT FOR NEXT IF i% < 0 THEN = FALSE j% = DIM(x$(),1) WHILE x$(j%) <= x$(i%) j% -= 1 : ENDWHILE SWAP x$(i%), x$(j%) i% += 1 j% = DIM(x$(),1) WHILE i% < j% SWAP x$(i%), x$(j%) i% += 1 j% -= 1 ENDWHILE = TRUE