```          FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '87
BASIC PROGRAM SOLUTIONS

'1.1
' This program will print out the sign of a given number.
'
INPUT "Enter number:"; N
IF N > 0 THEN PRINT "POSITIVE"
IF N < 0 THEN PRINT "NEGATIVE"
IF N = 0 THEN PRINT "ZERO"

'1.2
' This program will sum the numbers n, n+1, ... n+20.
'
INPUT "Enter n:"; N
FOR I = 0 TO 20
SUM = SUM + N + I
NEXT I
PRINT "SUM ="; SUM

'1.3
' This program will print PROBLEM THREE diagonally.
'
CLS
A\$ = "PROBLEM THREE"
L = LEN(A\$)
ROW = (24 - L) \ 2: COL = (80 - L) \ 2
FOR I = 1 TO L
LOCATE ROW + I, COL + I: PRINT MID\$(A\$, I, 1)
NEXT I

'1.4
' This program displays the numbers on the sides of a die.
'
INPUT "Enter number on top:"; T
INPUT "Enter number on front:"; F
INPUT "Enter number on right:"; R
PRINT "TOP="; T
PRINT "FRONT="; F
PRINT "RIGHT="; R
PRINT "BOTTOM="; 7 - T
PRINT "BACK="; 7 - F
PRINT "LEFT="; 7 - R

'1.5
' This program will fill the screen with random characters.
'
CLS
FOR I = 1 TO 24
FOR J = 1 TO 80
X = INT(RND(3) * 96) + 33
PRINT CHR\$(X);
NEXT J
NEXT I
WHILE A\$ = "": A\$ = INKEY\$: WEND
CLS

'1.6
' This program will display a rectangular array of periods.
'
INPUT "Enter coordinates:"; UR, UC, LR, LC
CLS
FOR I = UR TO LR
FOR J = UC TO LC
LOCATE I, J: PRINT ".";
NEXT J
NEXT I

'1.7
' This program will generate 10 random numbers given a seed.
'
INPUT "Enter seed:"; SEED
FOR I = 1 TO 10
RAND = (SEED * 421 + 1)
RAND = RAND - INT(RAND / 100) * 100
SEED = RAND
PRINT RAND
NEXT I

'1.8
' This program will determine the mass of a fish tank.
'
INPUT "Enter K, L, W, H:"; K, L, W, H
MASS = L * 12 * 2.54 * W * 12 * 2.54 * H * 12 * 2.54
MASS = MASS / 1000 + K
PRINT USING "#####.## KILOGRAMS"; MASS;

'1.9
' This program will display 21 rows of letters.
'
CLS
FOR I = 1 TO 21
IF I MOD 2 = 1 THEN
PRINT STRING\$(31, 64 + I)
ELSE
FOR J = 1 TO 10
PRINT CHR\$(64 + I); SPACE\$(2);
NEXT J
PRINT CHR\$(64 + I)
END IF
NEXT I

'1.10
' This program will display the time needed to read a book.
'
DATA THE HISTORY OF THE COMPUTER,400
DATA THE RED DOG RUNS,200
DATA EATING APPLE PIE,150
DATA THE ART OF WINNING,250
INPUT "Enter book title:"; B\$
INPUT "Enter rate (minutes/page):"; SP
I = 0
WHILE (I < 4) AND (A\$ <> B\$)
I = I + 1
WEND
M = PA * SP
H = INT(M / 60): M = M - H * 60
PRINT H; "HOURS "; M; "MINUTES"

'2.1
' This program will rotate a string N times to the left.
'
INPUT "Enter string: "; S\$
INPUT "Enter N:"; N
L = LEN(S\$)
N = N MOD L
PRINT RIGHT\$(S\$, L - N); LEFT\$(S\$, N)

'2.2
' This program will determine the number of diskettes bought.
'
FOR V = 1 TO 98
FOR M = 1 TO 99 - V STEP 5
W = 100 - V - M
IF W >= 0 AND V * 225 + M * 297 + W * 120 = 23607 THEN
PRINT V; "VERS "; M; "MAXS "; W; "WABS": END
END IF
NEXT M
NEXT V

'2.3
' This program will display a subset of random numbers.
'
DIM A(15)
RANDOMIZE TIMER
INPUT "Enter list item:"; ITEM
WHILE ITEM <> -1
A(J) = ITEM
INPUT "Enter list item:"; ITEM
J = J + 1
WEND
WHILE A\$ <> CHR\$(27)
FOR I = 0 TO 4
SWAP A(I), A(INT(RND * (J - I) + I))
PRINT A(I)
NEXT I
PRINT "PRESS ANY KEY": A\$ = ""
WHILE A\$ = "": A\$ = INKEY\$: WEND
WEND

'2.4
' This program will display all partitioned sum of number.
'
INPUT "Enter a number less than 20:"; N
FOR I = N TO 1 STEP -1
IF N MOD I = 0 THEN
X = INT(N / I)
PRINT SPACE\$(N - X);
I\$ = MID\$(STR\$(I), 2)
PRINT I\$;
IF I < N THEN
FOR J = 1 TO X - 1
PRINT "+"; I\$;
NEXT J
END IF
PRINT
END IF
NEXT I

'2.5
' This program will calculate the fractional value.
'
INPUT "Enter word: "; A\$
FOR I = 1 TO 3
A(I) = ASC(MID\$(A\$, I, 1)) - 64
NEXT I
N = A(1) * A(2) + A(2) * A(3) + A(1) * A(3)
D = A(1) * A(2) * A(3)
FOR I = D TO 1 STEP -1
IF N MOD I = 0 AND D MOD I = 0 THEN
PRINT LTRIM\$(STR\$(N / I)); "/"; LTRIM\$(STR\$(D / I)): END
END IF
NEXT I

'2.6
' This program will find a subset of integers.
'
I = 1
INPUT "Enter set item:"; ITEM(I)
WHILE ITEM(I) > 0
I = I + 1
INPUT "Enter set item:"; ITEM(I)
WEND
LASTI = I - 1
INPUT "Enter N:"; N
INPUT "Enter S:"; S
' Sort list
FOR I = 1 TO LASTI - 1
FOR J = I + 1 TO LASTI
IF ITEM(I) > ITEM(J) THEN SWAP ITEM(I), ITEM(J)
NEXT J
NEXT I
SUM = 0
FOR I = 1 TO N: SUM = SUM + ITEM(I): NEXT I
IF SUM > S THEN PRINT "NO": END
PRINT " YES"
FOR I = 1 TO N: PRINT ITEM(I); : NEXT I

'2.7
' This program will determine if patterns are legal/illegal.
'
DATA 1,4,3,4,4,5
DATA 5,2,5,2,5,5
FOR I = 0 TO 5: READ A(I): NEXT I
FOR I = 0 TO 5: READ B(I): NEXT I
INPUT "Enter pattern:"; P\$
STATE = 0
'
' Run the state machine
'
LP = LEN(P\$)
FOR I = 1 TO LP       'Check whole string even if error found
C\$ = MID\$(P\$, I, 1)
IF C\$ <> "A" AND C\$ <> "B" THEN STATE = 5  'illegal pattern
IF C\$ = "A" THEN STATE = A(STATE) ELSE STATE = B(STATE)
NEXT I
IF STATE = 4 THEN PRINT "LEGAL PATTERN": END
PRINT "ILLEGAL PATTERN"

'2.8
' This program will find integers having F factors.
'
INPUT "Enter M, N, F:"; M, N, F
FOR I = M TO N
S = 0: X = INT(SQR(I) + .000001)
FOR J = 1 TO X
IF I MOD J = 0 THEN S = S + 2
NEXT J
IF X * X = I THEN S = S - 1
IF S = F THEN PRINT I
NEXT I

'2.9
' This program will alphabetize 5 words according to rules.
'
DIM A\$(12), B\$(12), C\$(12)
FOR I = 1 TO 5
INPUT "Enter word: "; A\$(I): L = LEN(A\$(I))
FOR J = 1 TO L
B\$(J) = MID\$(A\$(I), J, 1)
NEXT J
' Alphabetize letters within word to make word2 (C\$)
FOR J = 1 TO L - 1
FOR K = J + 1 TO L
IF B\$(J) > B\$(K) THEN SWAP B\$(J), B\$(K)
NEXT K
C\$(I) = C\$(I) + B\$(J)
NEXT J
C\$(I) = C\$(I) + B\$(L)
NEXT I
' Alphabetize words according to word2 (C\$)
FOR I = 1 TO 4
FOR J = I + 1 TO 5
IF C\$(I) > C\$(J) THEN SWAP C\$(I), C\$(J): SWAP A\$(I), A\$(J)
NEXT J
NEXT I
FOR I = 1 TO 5: PRINT A\$(I): NEXT I

'2.10
' This program will produce a super-duper input routine
' with 4 types of input.
'
INPUT "Enter ROW, COL:"; ROW, COL
INPUT "Enter MAX:"; MAX
INPUT "Enter TYPE:"; TYP
CLS : CH\$ = " ": INITCOL = COL
DO UNTIL CH\$ = CHR\$(13)
LOCATE ROW, COL: CH\$ = ""
WHILE CH\$ = "": CH\$ = INKEY\$: WEND
'
IF CH\$ = CHR\$(8) THEN   ' Backspace pressed
IF LEN(ENTRY\$) > 0 THEN
ENTRY\$ = LEFT\$(ENTRY\$, LEN(ENTRY\$) - 1)
COL = COL - 1: LOCATE ROW, COL: PRINT " ";
END IF
ELSE
VALIDCH = LEN(ENTRY\$) < MAX
IF VALIDCH THEN
SELECT CASE TYP
CASE 1
IF CH\$ <> " " AND (CH\$ < "A" OR CH\$ > "Z") THEN VALIDCH = 0
CASE 2
IF CH\$ <> "." AND (CH\$ < "0" OR CH\$ > "9") THEN VALIDCH = 0
CASE 3
IF COL - INITCOL = 2 OR COL - INITCOL = 5 THEN
IF CH\$ <> "-" THEN VALIDCH = 0
ELSE
IF CH\$ < "0" OR CH\$ > "9" THEN VALIDCH = 0
END IF
END SELECT
END IF
IF VALIDCH THEN
PRINT CH\$;
ENTRY\$ = ENTRY\$ + CH\$
COL = COL + 1
END IF
END IF
LOOP
LOCATE ROW + 2, INITCOL: PRINT ENTRY\$

'3.1
' This program will determine if 2 words are closely spelled.
'
INPUT "Enter word 1: "; W1\$
INPUT "Enter word 2: "; W2\$
L1 = LEN(W1\$): L2 = LEN(W2\$)
IF ABS(L1 - L2) > 1 THEN PRINT "NOT CLOSE": END
' Find first position where words differ
IF L1 < L2 THEN MIN = L1 ELSE MIN = L2
J = 1
WHILE (J <= MIN) AND MID\$(W1\$, J, 1) = MID\$(W2\$, J, 1)
J = J + 1
WEND
IF J > MIN THEN PRINT "CLOSE": END  'Equal or differ by ins/del
IF L1 = L2 THEN
' Check for transposition or one symbol change
IF J <> L1 THEN
IF MID\$(W1\$, J + 1, 1) = MID\$(W2\$, J, 1) THEN
IF MID\$(W2\$, J + 1, 1) = MID\$(W1\$, J, 1) THEN
J = J + 1   'Skip over possible transposition
END IF
END IF
END IF
IF MID\$(W1\$, J + 1) = MID\$(W2\$, J + 1) THEN PRINT "CLOSE": END
PRINT "NOT CLOSE": END
ELSE
' Check for insertion or deletion
IF L1 > L2 THEN
IF MID\$(W2\$, J) = MID\$(W1\$, J + 1) THEN PRINT "CLOSE": END
PRINT "NOT CLOSE"
ELSE
IF MID\$(W1\$, J) = MID\$(W2\$, J + 1) THEN PRINT "CLOSE": END
PRINT "NOT CLOSE"
END IF
END IF

'3.2
' This program will evaluate an NxN determinant for N=2,3,4.
'
INPUT "Enter dimension N:"; N
FOR I = 1 TO N
FOR J = 1 TO N
PRINT USING "Enter row #"; I;
PRINT USING ", col #:"; J; : INPUT A(I, J)
NEXT J
NEXT I
' -- 2x2
IF N = 2 THEN
PRINT A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)
ELSE
' -- 3x3
IF N = 3 THEN
K = 4: GOSUB Det3x3
PRINT T
ELSE
' -- 4x4
FOR K = 1 TO 4
A = A(4, K) * (-1) ^ K
'
Det3x3:
FOR I = 1 TO 3
FOR J = 1 TO 4
IF J <> K THEN
S = S + 1: B(I, S) = A(I, J)
B(I, S + 3) = A(I, J)
END IF
NEXT J: S = 0
NEXT I
FOR I = 1 TO 3
T = T + B(1, I) * B(2, I + 1) * B(3, I + 2)
T = T - B(1, I + 2) * B(2, I + 1) * B(3, I)
NEXT I
IF N = 3 THEN RETURN
'
B = B + T * A: T = 0
NEXT K: PRINT B
END IF
END IF

'3.3
' This program will display the number of word occurrences.
'
DIM WORD\$(50), WORDTOT(50)
INPUT "Enter text: "; LINES\$
START = 1:  NUMOFWORDS = 0
WHILE START <= LEN(LINES\$)
ENDOFWORD = 0:  NEXTWORD\$ = ""
WHILE (START <= LEN(LINES\$)) AND (NOT ENDOFWORD)
CH\$ = MID\$(LINES\$, START, 1)
IF (CH\$ < "A" OR CH\$ > "Z") AND (CH\$ <> "'") THEN
ENDOFWORD = -1
ELSE
NEXTWORD\$ = NEXTWORD\$ + CH\$
END IF
START = START + 1
WEND
IF NEXTWORD\$ > "" THEN NEWWORD = -1 ELSE NEWWORD = 0
WORDIND = 0
WHILE (WORDIND < NUMOFWORDS) AND NEWWORD
WORDIND = WORDIND + 1
IF NEXTWORD\$ = WORD\$(WORDIND) THEN NEWWORD = 0
WEND
IF NOT NEWWORD THEN
WORDTOT(WORDIND) = WORDTOT(WORDIND) + 1
ELSE
'   Add new word to list
NUMOFWORDS = NUMOFWORDS + 1
WORD\$(NUMOFWORDS) = NEXTWORD\$
WORDTOT(NUMOFWORDS) = 1
END IF
WEND
FOR I = 1 TO NUMOFWORDS
PRINT WORDTOT(I); WORD\$(I)
NEXT I

'3.4
' This program will encrypt a string such that when this
' code is entered, the string will be reproduced.
'
DIM ASCI(30)
INPUT "Enter text: "; ST\$
NUMOFCH = 0: I = 1
WHILE (I <= LEN(ST\$))
CH\$ = MID\$(ST\$, I, 1):  NUMOFCH = NUMOFCH + 1
IF CH\$ = "\" THEN
I = I + 1: NEXTCH\$ = MID\$(ST\$, I, 1)
IF NEXTCH\$ = "\" THEN
ASCI(NUMOFCH) = ASC(NEXTCH\$)
ELSE
ASCST\$ = MID\$(ST\$, I, 3)
ASCI(NUMOFCH) = VAL(ASCST\$)
I = I + 2
END IF
ELSE
ASCI(NUMOFCH) = ASC(CH\$)   'Regular character
END IF
I = I + 1
WEND
'  Encrypt code
FOR I = 1 TO NUMOFCH
CODENUM = 255 - ASCI(I)
IF (CODENUM >= 32) AND (CODENUM <= 92) THEN
PRINT CHR\$(CODENUM);
IF CODENUM = ASC("\") THEN PRINT "\";
ELSE
PRINT "\";
PRINT MID\$(STR\$(1000 + CODENUM), 3, 3);
END IF
NEXT I

'3.5
' This program will unscrabmle the numbers 5132, 4735, and
' 8014153 so that the first times the second equals the
' third wit a missing digit.
'
DIM D(24), E(24)
DATA 5,1,3,2
DATA 4,7,3,5
DATA 8,0,1,4,1,5,3
FOR I = 1 TO 4: READ A(I): NEXT I
FOR I = 1 TO 4: READ B(I): NEXT I
FOR I = 1 TO 7: READ B\$(I): NEXT I
FOR A = 1 TO 4
FOR B = 1 TO 4
FOR C = 1 TO 4: D = 10 - A - B - C
D = 4 + 3 + 2 + 1 - A - B - C
IF A <> B AND B <> C AND A <> C THEN
S = S + 1
D(S) = A(A) * 1000 + A(B) * 100 + A(C) * 10 + A(D)
E(S) = B(A) * 1000 + B(B) * 100 + B(C) * 10 + B(D)
END IF
NEXT C
NEXT B
NEXT A
FOR I = 1 TO 24
FOR J = 1 TO 24
X# = D(I) * E(J)
A\$ = LTRIM\$(STR\$(X#))
IF LEN(A\$) = 8 THEN
FOR K = 1 TO 8
A\$(K) = MID\$(A\$, K, 1)
NEXT K
B = 1: MATCH = -1
WHILE (B <= 7) AND MATCH
MATCH = 0: A = 1
WHILE (A <= 8) AND NOT MATCH
IF B\$(B) = A\$(A) THEN A\$(A) = "": MATCH = -1
A = A + 1
WEND
B = B + 1
WEND
IF MATCH THEN PRINT D(I); E(J); " "; A\$
END IF
NEXT J
NEXT I

'3.6
' This program will display the front colors on the Rubik's
' Pocket Cube after a move of T or F is performed.
'
DIM A\$(24)
DATA W,Y,O,G,R,B
FOR I = 1 TO 6: READ A\$
FOR J = 1 TO 4
S = S + 1: A\$(S) = A\$
NEXT J
NEXT I
INPUT "Enter T, F, or Q: "; A\$
DO UNTIL A\$ = "Q"
IF A\$ = "T" THEN
'   Rotate Top
X\$ = A\$(1): A\$(1) = A\$(3): A\$(3) = A\$(4)
A\$(4) = A\$(2): A\$(2) = X\$
X\$ = A\$(5): A\$(5) = A\$(9): A\$(9) = A\$(13)
A\$(13) = A\$(17): A\$(17) = X\$
X\$ = A\$(6): A\$(6) = A\$(10): A\$(10) = A\$(14)
A\$(14) = A\$(18): A\$(18) = X\$
ELSE
'   Rotate Front
X\$ = A\$(5): A\$(5) = A\$(7): A\$(7) = A\$(8)
A\$(8) = A\$(6): A\$(6) = X\$
X\$ = A\$(3): A\$(3) = A\$(20): A\$(20) = A\$(22)
A\$(22) = A\$(9): A\$(9) = X\$
X\$ = A\$(4): A\$(4) = A\$(18): A\$(18) = A\$(21)
A\$(21) = A\$(11): A\$(11) = X\$
END IF
' Display front side
PRINT A\$(5); "  "; A\$(6)
PRINT A\$(7); "  "; A\$(8)
INPUT "Enter T, F, or Q: "; A\$
LOOP

'3.7
' This program will simulate a drill of adding Roman Numerals.
'
CLS
INPUT "Enter name: "; NME\$
INPUT "Enter date: "; DAYTE\$
'
DATA M,1000,D,500,C,100,L,50,X,10,V,5,I,1
FOR I = 1 TO 7: READ B\$(I), B(I): NEXT I
'
DO UNTIL A\$ = "3"
CLS
PRINT "1. INSTRUCTION PAGE"
PRINT "2. PRACTICE 3 PROBLEMS"
PRINT "3. QUIT"
A\$ = INPUT\$(1)
SELECT CASE A\$
CASE "1"
CLS
PRINT "YOU WILL BE GIVEN 3 PROBLEMS TO"
PRINT "WORK. A PROBLEM WILL CONSIST OF"
PRINT "ROMAN NUMERALS LESS THAN 20."
PRINT "ROMAN NUMERALS AND PRESS 'RETURN.'"
AN\$ = INPUT\$(1)
'
' Practice 3 problems
'
CASE "2"
RIGHT = 0: WRONG = 0
FOR PROB = 1 TO 3
CLS
RANDOMIZE TIMER
X(1) = INT(RND * 19) + 1:  X(2) = INT(RND * 19) + 1
X(3) = X(1) + X(2):  HELP = X(3)
FOR K = 1 TO 3: X\$(K) = "": NEXT K
FOR K = 1 TO 3
FOR I = 1 TO 7
X = X(K) / B(I)
IF (ABS(X - 9 / 5) > .01) OR (I MOD 2 = 1) THEN
X = INT(X)
SELECT CASE X
CASE 9
X\$(K) = X\$(K) + B\$(I) + B\$(I - 2)
CASE 4
X\$(K) = X\$(K) + B\$(I) + B\$(I - 1)
CASE IS > 0
FOR J = 1 TO X: X\$(K) = X\$(K) + B\$(I): NEXT J
END SELECT
X(K) = X(K) - B(I) * X
END IF
NEXT I
NEXT K
'
' Display problem
'
LOCATE 10, 15: PRINT X\$(1): X = LEN(X\$(1))
Y = LEN(X\$(2)): COL = 15 + (X - Y) - 2
LOCATE 11, COL: PRINT "+ "; X\$(2)
LOCATE 12, COL: PRINT STRING\$(2 + Y, "-"): MISS = -1
WHILE MISS <> 0
LOCATE 13, COL: INPUT N\$
'
' Evaluate
'
IF N\$ = X\$(3) THEN
RIGHT = RIGHT + 1: MISS = 0
ELSE
IF MISS > 0 THEN
MISS = 0: BEEP: WRONG = WRONG + 1: WR\$(WRONG) = N\$
RI\$(WRONG) = X\$(3): RI(WRONG) = HELP
ELSE
MISS = 1: BEEP: LOCATE 16, COL: PRINT HELP
LOCATE 13, COL: PRINT SPACE\$(15)
END IF
END IF
WEND
NEXT PROB
'
' Progress Report
'
CLS : PRINT SPACE\$(11); "PROGRESS REPORT"
PRINT "DATE: "; DAYTE\$
PRINT "NAME: "; NME\$
PRINT "NUMBER CORRECT:"; RIGHT
PRINT "NUMBER OF EXERCISES: 3"
PRINT "PERCENT CORRECT:"; INT(RIGHT / 3 * 100 + .5); "%"
PRINT
IF WRONG > 0 THEN
FOR I = 1 TO WRONG
LOCATE 16 + I, 1: PRINT WR\$(I)
LOCATE 16 + I, 16: PRINT RI\$(I)
LOCATE 16 + I, 32: PRINT RI(I)
NEXT I
END IF
AN\$ = INPUT\$(1)
END SELECT
LOOP

'3.8
' This program will determine the area shared w/2 rectangles.
'
DIM AB(20, 20), XY(20, 20)
FOR I = 1 TO 4
INPUT "Enter X,Y: "; X(I), Y(I)
X(I) = ABS(X(I)): Y(I) = ABS(Y(I))
NEXT I
FOR I = 1 TO 4
INPUT "Enter A,B: "; A(I), B(I)
A(I) = ABS(A(I)): B(I) = ABS(B(I))
NEXT I
'
' Store a 1 in each occupied square of AB
'
FOR I = A(1) TO A(2)
FOR J = B(4) TO B(1)
AB(I, J) = 1
NEXT J
NEXT I
'
' Determine area in common (Heighth-1 x Width-1)
'
FOR I = X(1) TO X(2)
FOR J = Y(4) TO Y(1)
IF AB(I, J) = 1 THEN WDTH = WDTH + 1    'Both interior
NEXT J
IF WDTH > 0 THEN HEIGHT = HEIGHT + 1: WDTH2 = WDTH: WDTH = 0
NEXT I
PRINT (HEIGHT - 1) * (WDTH2 - 1)

'3.9
' This program will divide 2 big numbers with at most 30 digits.
'
DIM A(30), B(30), C(30), D(30)
INPUT "Enter first number: "; A\$: LENA = LEN(A\$)
INPUT "Enter second number:"; B\$: LENB = LEN(B\$)
L = LENB
'
'  Store digits in arrays
'
FOR I = LENB TO 1 STEP -1
B(LENB - I + 1) = VAL(MID\$(B\$, I, 1))
NEXT I
FOR I = LENB TO 1 STEP -1
A(LENB - I + 1) = VAL(MID\$(A\$, I, 1))
NEXT I: K = LENB
'
' Shift digits of A until portion of A is greater than B
'
ShiftDigits:
IF L <> LENB THEN
NextShift:
K = K + 1: IF LENA < K THEN GOTO DisplayRemainder
FOR I = L TO 1 STEP -1
A(I + 1) = A(I)
NEXT I
A(1) = VAL(MID\$(A\$, K, 1))
L = L + 1
IF L < LENB THEN PRINT "0"; : GOTO NextShift
END IF
IF L <= LENB THEN
FOR I = LENB TO 1 STEP -1
IF A(I) > B(I) THEN GOTO DivideAbyB
IF A(I) <> B(I) THEN GOTO NextShift
NEXT I
' All A(I) = B(I) at this point
END IF
'
' Divide A by B by subtracting B * J from A
'
DivideAbyB:
SUBDONE = 0
DO
J = J + 1
FOR I = 1 TO LENB
C(I) = B(I) * J + C
C = INT(C(I) / 10)
C(I) = C(I) - C * 10
NEXT I: C(I) = C: C = 0
FOR I = 1 TO L
D(I) = A(I) - C(I) - D
D = -(D(I) < 0): IF D THEN D(I) = D(I) + 10
NEXT I
IF L - LENB = 0 OR D(L) = 0 THEN
I = LENB + 1
DO
I = I - 1
IF D(I) < B(I) THEN SUBDONE = -1
LOOP UNTIL I = 1 OR D(I) > B(I) OR SUBDONE
END IF
LOOP UNTIL SUBDONE
'
' Display J as # of subtractions done
'
PRINT USING "#"; J; : L = 0: J = 0
FOR I = LENB TO 1 STEP -1
IF D(I) > 0 OR T > 0 THEN
T = 1: L = L + 1: A(I) = D(I)
END IF
NEXT I: T = 0: GOTO ShiftDigits
'
'  Display remainder
'
DisplayRemainder:
PRINT " Remainder ";
FOR I = L TO 1 STEP -1
PRINT USING "#"; A(I);
NEXT I
IF L = 0 THEN PRINT "0"

'3.10
' This program will generate random mazes with 3 x 5 paths.
'
CLS : RANDOMIZE TIMER: L = 8: W = 5
NUMOFLINES = (L - 1) * (W - 1)  '# of lines to draw
LI = INT(32 / L)
WI = INT(15 / W)
LN = L: WN = W
DIM A(LN + 1, WN + 1)   'Points forbidden to start from
DIM PINT(33, 33)        'Existing points
'
' Draw perimeter
'
FOR I = 1 TO 33: PRINT "*"; : PINT(I - 1, 0) = 1: NEXT I
FOR I = 1 TO 14
LOCATE I + 1, 1: PRINT "*": PINT(0, I) = 1
LOCATE I + 1, 33: PRINT "*": PINT(L, I) = 1
NEXT I
FOR I = 1 TO 33: PRINT "*"; : PINT(I - 1, W) = 1: NEXT I
'
A(0, 0) = 1: A(LN, 0) = 1: A(LN, WN) = 1: A(0, WN) = 1
DO
DO
' Get point that exists but is not forbidden
X = INT(RND * 2 * LN) - INT(LN / 2)
Y = INT(RND * 2 * WN) - INT(WN / 2)
IF X < 0 THEN X = 0
IF X > LN THEN X = LN
IF Y < 0 THEN Y = 0
IF Y > WN THEN Y = WN
LOOP UNTIL (PINT(X, Y) = 1 AND A(X, Y) = 0)
DO
D = INT(RND * 4)                  'Random direction
SEGMENTDRAWN = 0: NUMOFTRIES = 0
DO
NUMOFTRIES = NUMOFTRIES + 1
D = D + 1: IF D > 4 THEN D = D - 4
SELECT CASE D
'
' Up
'
CASE 1
IF Y > 0 THEN
IF PINT(X, Y - 1) = 0 THEN
FOR J = 0 TO WI - 1
LOCATE Y * WI - J, X * LI + 1: PRINT "*"
NEXT J
A = X: B = Y - 1: SEGMENTDRAWN = -1
END IF
END IF
'
' Right
'
CASE 2
IF X < LN THEN
IF PINT(X + 1, Y) = 0 THEN
FOR J = 0 TO LI - 1
LOCATE Y * WI + 1, X * LI + 2 + J: PRINT "*"
NEXT J
A = X + 1: B = Y: SEGMENTDRAWN = -1
END IF
END IF
'
' Down
'
CASE 3
IF Y < WN THEN
IF PINT(X, Y + 1) = 0 THEN
FOR J = 0 TO WI - 1
LOCATE Y * WI + 2 + J, X * LI + 1: PRINT "*"
NEXT J
A = X: B = Y + 1: SEGMENTDRAWN = -1
END IF
END IF
'
' Left
'
CASE 4
IF X > 0 THEN
IF PINT(X - 1, Y) = 0 THEN
FOR J = 0 TO LI - 1
LOCATE Y * WI + 1, X * LI - J: PRINT "*"
NEXT J
A = X - 1: B = Y: SEGMENTDRAWN = -1
END IF
END IF
END SELECT
LOOP UNTIL SEGMENTDRAWN OR (NUMOFTRIES = 4)
'
IF SEGMENTDRAWN THEN
PINT(A, B) = 1: LINESDRAWN = LINESDRAWN + 1
X = A: Y = B
ELSE
A(X, Y) = 1
END IF
LOOP UNTIL (LINESDRAWN = NUMOFLINES) OR NOT SEGMENTDRAWN
LOOP UNTIL (LINESDRAWN = NUMOFLINES)
'
' Open doors
'
X = INT(RND * WN) + 1: Y = INT(RND * WN) + 1
FOR J = 0 TO WI - 2
LOCATE X * WI - J, 1: PRINT " "
LOCATE Y * WI - J, 33: PRINT " "
NEXT J
LOCATE 23

```