| DEFINE PROCEDURE ''DIVIDE'' [A,B]: | |
| BLOCK 0: BEGIN | |
| IF A < B, THEN: | |
| QUIT BLOCK 0; | |
| CELL(0) <= 1; | |
| OUTPUT <= 1; | |
| LOOP AT MOST A TIMES: | |
| BLOCK 2: BEGIN | |
| IF OUTPUT * B = A, THEN: | |
| QUIT BLOCK 0; | |
| OUTPUT <= OUTPUT + 1; | |
| IF OUTPUT * B > A, THEN: | |
| BLOCK 3: BEGIN | |
| OUTPUT <= CELL(0); | |
| QUIT BLOCK 0; | |
| BLOCK 3: END; | |
| CELL(0) <= OUTPUT; | |
| BLOCK 2: END; | |
| BLOCK 0: END. | |
| DEFINE PROCEDURE ''MINUS'' [A,B]: | |
| BLOCK 0: BEGIN | |
| IF A < B, THEN: | |
| QUIT BLOCK 0; | |
| LOOP AT MOST A TIMES: | |
| BLOCK 1: BEGIN | |
| IF OUTPUT + B = A, THEN: | |
| QUIT BLOCK 0; | |
| OUTPUT <= OUTPUT + 1; | |
| BLOCK 1: END; | |
| BLOCK 0: END. | |
| DEFINE PROCEDURE ''MODULUS'' [A,B]: | |
| BLOCK 0: BEGIN | |
| CELL(0) <= DIVIDE[A,B]; | |
| OUTPUT <= MINUS[A,CELL(0) * B]; | |
| BLOCK 0: END. | |
| DEFINE PROCEDURE ''TOGGLE'' [DOOR]: | |
| BLOCK 0: BEGIN | |
| IF DOOR = 1, THEN: | |
| QUIT BLOCK 0; | |
| OUTPUT <= 1; | |
| BLOCK 0: END. | |
| DEFINE PROCEDURE ''NUMBERS'' [DOOR, COUNT]: | |
| BLOCK 0: BEGIN | |
| CELL(0) <= 1; /*each number*/ | |
| OUTPUT <= 0; /*current door state*/ | |
| LOOP COUNT TIMES: | |
| BLOCK 1: BEGIN | |
| IF MODULUS[DOOR, CELL(0)] = 0, THEN: | |
| OUTPUT <= TOGGLE[OUTPUT]; | |
| CELL(0) <= CELL(0) + 1; | |
| BLOCK 1: END; | |
| BLOCK 0: END. | |
| DEFINE PROCEDURE ''DOORS'' [COUNT]: | |
| BLOCK 0: BEGIN | |
| CELL(0) <= 1; /*each door*/ | |
| LOOP COUNT TIMES: | |
| BLOCK 1: BEGIN | |
| CELL(1) <= NUMBERS[CELL(0), COUNT]; /*iterate over the states of this door to get its final state*/ | |
| IF CELL(1) = 1, THEN: /*door state = open*/ | |
| PRINT[CELL(0), ' ']; | |
| CELL(0) <= CELL(0) + 1; | |
| BLOCK 1: END; | |
| BLOCK 0: END. | |
| DOORS[100]; |