How to resolve the algorithm Zebra puzzle step by step in the BBC BASIC programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Zebra puzzle step by step in the BBC BASIC programming language

Table of Contents

Problem Statement

The Zebra puzzle, a.k.a. Einstein's Riddle, is a logic puzzle which is to be solved programmatically.

It has several variants, one of them this: The question is, who owns the zebra? For clarity, each of the five houses is painted a different color, and their inhabitants are of different nationalities, own different pets, drink different beverages and smoke different brands of cigarettes. Additionally, list the solution for all the houses. Optionally, show the solution is unique.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Zebra puzzle step by step in the BBC BASIC programming language

Source code in the bbc programming language

      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


  

You may also check:How to resolve the algorithm Spiral matrix step by step in the PARI/GP programming language
You may also check:How to resolve the algorithm Count in octal step by step in the MATLAB / Octave programming language
You may also check:How to resolve the algorithm Honaker primes step by step in the Arturo programming language
You may also check:How to resolve the algorithm ABC problem step by step in the Haskell programming language
You may also check:How to resolve the algorithm String matching step by step in the Component Pascal programming language