102 lines
4.2 KiB
Plaintext
102 lines
4.2 KiB
Plaintext
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
|