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$)
READ A$, PA
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 "ADDING TWO RANDOMLY GENERATED"
PRINT "ROMAN NUMERALS LESS THAN 20."
PRINT "YOU WILL TYPE YOUR ANSWER IN"
PRINT "ROMAN NUMERALS AND PRESS 'RETURN.'"
PRINT "(PRESS ANY KEY TO RETURN TO MENU.)"
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
LOCATE 15, 1: PRINT "WRONG ANSWER CORRECT ANSWER ARABIC"
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
LOCATE 23, 1: PRINT "PRESS ANY KEY TO RETURN TO MENU.";
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