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

'1.1
' This program will print an indented phrase on each line.
'
CLS : P\$ = "1989 COMPUTER CONTEST"
FOR I = 1 TO 22:  PRINT SPACE\$(I); P\$:  NEXT I

'1.2
' This program will translate gigabytes to megabytes.
'
INPUT "Enter number of gigabytes:"; G
PRINT G * 1024; "MEGABYTES"

'1.3
' This program displays a word in a backward-L format.
'
INPUT "Enter word:"; A\$
L = LEN(A\$)
FOR I = 1 TO L - 1
PRINT SPACE\$(L - 1); MID\$(A\$, I, 1)
NEXT I
PRINT A\$

'1.4
' This program prints a pattern of numbers in pyramid form.
'
INPUT "Enter N:"; N
FOR I = 1 TO N
PRINT SPACE\$(10 - I); : PRINT USING "#"; I;
IF I > 1 THEN PRINT SPACE\$(I * 2 - 3); : PRINT USING "#"; I;
PRINT
NEXT I

'1.5
' This program corrects dates with A.D. or B.C.
'
INPUT "Enter date: "; D
INPUT "Enter A.D. or B.C.: "; A\$
IF A\$ = "B.C." AND D > 4 THEN PRINT D - 4; "B.C.": END
IF A\$ = "B.C." THEN PRINT 5 - D; "A.D.": END
PRINT D + 4; "A.D"

'1.6
' This program will allow a user access with a password.
'
I = 0
WHILE PSW\$ <> "ITSME" AND I < 2
I = I + 1
WEND
IF PSW\$ = "ITSME" THEN
PRINT "YOU HAVE ACCESS"
ELSE
PRINT "YOU ARE TRESPASSING"
END IF

'1.7
' This program will display the best DBMS.
'
INPUT "Enter N: "; N:  MAX = 0
FOR I = 1 TO N
INPUT "Enter DBMS name: "; D\$
INPUT "Enter convenience, efficiency:"; C, E
IF C + E > MAX THEN MAX = C + E: NM\$ = D\$
NEXT I
PRINT NM\$; " IS BEST"

'1.8
' This program displays the unique elements of a list.
'
INPUT "Enter #:"; N:  NUM = 0
WHILE N <> -999
I = 1
WHILE I <= NUM AND N <> A(I)
I = I + 1
WEND
IF I > NUM THEN NUM = I: A(I) = N
INPUT "Enter #:"; N
WEND
FOR I = 1 TO NUM:  PRINT LTRIM\$(STR\$(A(I))); " "; : NEXT I
PRINT

'1.9
' This program determines how many feet deep of dollar coins
' over Texas is equivalent to a given probability.
'
INPUT "Enter probability:"; PROB
DOLVOL = 1.5 * 1.5 * 3 / 32: TEXASAREA = 262134
TEXASVOL = TEXASAREA * 5280 * 12 * 5280 * 12
INCHDEEP = (PROB / (TEXASVOL / DOLVOL))
PRINT INT(INCHDEEP / 12 + .5); "FEET DEEP"

'1.10
' This program will map a logical address to the physical.
'
B(0) = 219:  L(0) = 600
B(1) = 2300: L(1) = 14
B(2) = 90:   L(2) = 100
B(3) = 1327: L(3) = 580
B(4) = 1952: L(4) = 96
INPUT "Enter Seg#, Address: "; S, A
WHILE S <= 4
IF A > L(S) THEN
ELSE
PRINT B(S) + A
END IF
INPUT "Enter Seg#, Address: "; S, A
WEND

'2.1
' This program prints F(x) for a recursive function given x.
'
INPUT "Enter x:"; X
F(1) = 1:  F(2) = 1:  F(3) = 1
I = 3
WHILE I < X
F(I + 1) = (F(I) * F(I - 1) + 2) / F(I - 2)
I = I + 1
WEND
PRINT "F("; : PRINT USING "#"; X; : PRINT ")="; F(X)

'2.2
' This program will print the prime factors of a number.
'
INPUT "Enter #:"; NUM
WHILE NUM > 1
I = 2
WHILE (NUM MOD I) > 0
I = I + 1
WEND
PRINT I;
NUM = INT(NUM / I)
IF NUM > 1 THEN PRINT "X";
WEND

'2.3
' This program will display a word without its vowels.
'
INPUT "Enter word:"; WORD\$
VOW\$ = "AEIOU"
FOR I = 1 TO LEN(WORD\$)
CH\$ = MID\$(WORD\$, I, 1)
IF INSTR(VOW\$, CH\$) = 0 THEN PRINT CH\$;
NEXT I

'2.4
' This program produces the shortest possible identifiers.
'
FOR I = 1 TO 6
INPUT "Enter name: "; A\$(I)
NEXT I
FOR I = 1 TO 6
K = 1: S\$ = LEFT\$(A\$(I), 1)
FOR J = 1 TO 6
WHILE (I <> J) AND S\$ = MID\$(A\$(J), 1, K) AND (K < LEN(A\$(I)))
K = K + 1
S\$ = S\$ + MID\$(A\$(I), K, 1)
WEND
NEXT J
PRINT S\$
NEXT I

'2.5
' This program prints the # of distinguishable permutations.
'
DIM LETTER(26)
INPUT "Enter word:"; WORD\$:  L = LEN(WORD\$)
' Calculate L factorial (assuming all different letters)
NUM = 1
FOR I = 1 TO L:  NUM = NUM * I:  NEXT I
' Divide out of Num the factorials of the same letters
FOR I = 1 TO L
LETPOS = ASC(MID\$(WORD\$, I, 1)) - 64
LETTER(LETPOS) = LETTER(LETPOS) + 1
IF LETTER(LETPOS) > 1 THEN NUM = NUM / LETTER(LETPOS)
NEXT I
PRINT NUM

'2.6
' This program underlines parts of a sentence between 2 *'s.
'
INPUT "Enter sentence:"; SENT\$
CLS : PRINT SENT\$
UNDER = 0:  COL = 0
FOR I = 1 TO LEN(SENT\$)
CH\$ = MID\$(SENT\$, I, 1)
IF CH\$ = "*" THEN
UNDER = NOT UNDER
ELSE
COL = COL + 1
LOCATE 3, COL: PRINT CH\$
IF UNDER THEN LOCATE 4, COL: PRINT "-"
END IF
NEXT I
PRINT

'2.7
' This program will compute an expression containing + - * /.
'
INPUT "Enter expression:"; ST\$:  NUMST\$ = ""
' Parse first number in Num1 and second number in Num2
FOR I = 1 TO LEN(ST\$)
CH\$ = MID\$(ST\$, I, 1)
IF INSTR("+-*/", CH\$) > 0 THEN
SYMBOL\$ = CH\$:  NUM1 = VAL(NUMST\$):  NUMST\$ = ""
ELSE
NUMST\$ = NUMST\$ + CH\$
END IF
NEXT I
NUM2 = VAL(NUMST\$)
IF SYMBOL\$ = "+" THEN PRINT NUM1 + NUM2
IF SYMBOL\$ = "-" THEN PRINT NUM1 - NUM2
IF SYMBOL\$ = "*" THEN PRINT NUM1 * NUM2
IF SYMBOL\$ = "/" THEN PRINT NUM1 / NUM2

'2.8
' This program will display the saddle point of a matrix.
'
DIM MAT(5, 5)
INPUT "Enter # Rows, # Cols:"; ROWS, COLS
FOR I = 1 TO ROWS
FOR J = 1 TO COLS
PRINT USING "Enter Row#"; I;
PRINT USING " Col#"; J;
INPUT MAT(I, J)
NEXT J
NEXT I
' Find value smallest in row, largest in column
FOR I = 1 TO ROWS
FOR J = 1 TO COLS
SMALL = -1
FOR K = 1 TO COLS
IF (K <> J) AND (MAT(I, J) >= MAT(I, K)) THEN SMALL = 0
NEXT K
IF SMALL THEN
LARGE = -1
FOR K = 1 TO ROWS
IF (K <> I) AND (MAT(I, J) <= MAT(K, J)) THEN LARGE = 0
NEXT K
IF LARGE THEN
PRINT "SADDLE POINT ="; MAT(I, J); "AT ROW"; I;
PRINT "COL"; J
END IF
END IF
NEXT J
NEXT I

'2.9
' This program will sort a set of dates in increasing order.
'
DIM MO\$(12)
DATA JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST
DATA SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
FOR I = 1 TO 12:  READ MO\$(I):  NEXT I
INPUT "Enter # of dates:"; N
FOR I = 1 TO N
INPUT "Enter month:"; M\$(I)
INPUT "Enter day:  "; D(I)
INPUT "Enter year: "; Y(I)
PRINT
'  Combine year, month, day (in that order) for sorting
J = 1
WHILE (J < 13) AND (M\$(I) <> MO\$(J)):  J = J + 1:  WEND
SORT(I) = ((Y(I) * 100) + J) * 100 + D(I)
INDEX(I) = I
NEXT I
' Sort dates according to values in Sort() and swap index()
FOR I = 1 TO N - 1
FOR J = I + 1 TO N
IF SORT(INDEX(I)) > SORT(INDEX(J)) THEN
SWAP INDEX(I), INDEX(J)
END IF
NEXT J
NEXT I
FOR I = 1 TO N
PRINT M\$(INDEX(I)); D(INDEX(I)); Y(INDEX(I))
NEXT I

'2.10
' This program displays class grades and the averages.
'
DIM QIZ(5, 4)
DATA "D. WOOLY","M. SMITH","C. BROWN","R. GREEN","T. STONE"
FOR I = 1 TO 5:  READ NAM\$(I): NEXT I
DATA 100,92,90,90, 55,75,70,65, 94,70,62,70
DATA 90,74,80,85, 85,98,100,70
FOR I = 1 TO 5
FOR J = 1 TO 4
NEXT J
NEXT I
FOR SCR = 1 TO 2
CLS
IF SCR = 2 THEN
PRINT "           MS. HEINDEL'S MUSIC CLASS"
PRINT "                  SPRING 1989"
PRINT
END IF
PRINT "  NAME       Q1     Q2     Q3     Q4";
IF SCR = 2 THEN PRINT "    AVERAGE" ELSE PRINT
PRINT
'
FOR I = 1 TO 5
PRINT NAM\$(I); : SUM = 0
FOR J = 1 TO 4
PRINT SPACE\$(4); : PRINT USING "###"; QIZ(I, J);
SUM = SUM + QIZ(I, J)
NEXT J
IF SCR = 2 THEN PRINT USING "   ###.##"; SUM / 4 ELSE PRINT
NEXT I
PRINT
IF SCR = 1 THEN
PRINT "Enter 5 grades for quiz 4:";
INPUT QIZ(1, 4), QIZ(2, 4), QIZ(3, 4), QIZ(4, 4), QIZ(5, 4)
END IF
NEXT SCR
' Display Column averages and class average
PRINT "AVERAGE:"; : TOTAL = 0
FOR I = 1 TO 4
SUM = 0
FOR J = 1 TO 5:  SUM = SUM + QIZ(J, I): NEXT J
PRINT USING " ###.##"; SUM / 5;
TOTAL = TOTAL + SUM
NEXT I
PRINT : PRINT
PRINT USING "CLASS AVERAGE:###.##"; TOTAL / 20

'3.1
' This program will determine if a word is correctly spelled.
'
INPUT "Enter word:"; ST\$
L = LEN(ST\$):  CORRECT = -1
'-- Check for E before suffixes ING, IBLE, ABLE
IF L >= 4 THEN
PART\$ = MID\$(ST\$, L - 2, 3)
IF PART\$ = "ING" AND MID\$(ST\$, L - 3, 1) = "E" THEN CORRECT = 0
END IF
IF L >= 5 THEN
PART\$ = MID\$(ST\$, L - 3, 4)
IF PART\$ = "IBLE" AND MID\$(ST\$, L - 4, 1) = "E" THEN CORRECT = 0
IF PART\$ = "ABLE" AND MID\$(ST\$, L - 4, 1) = "E" THEN CORRECT = 0
END IF
'-- Check if IE after C.
PART\$ = ST\$:  I = INSTR(PART\$, "IE")
WHILE (I > 0) AND CORRECT
I = I - 1
IF I >= 1 THEN IF MID\$(PART\$, I, 1) = "C" THEN CORRECT = 0
PART\$ = MID\$(PART\$, I + 3, LEN(PART\$) - (I + 2))
I = INSTR(PART\$, "IE")
WEND
'-- Check if EI not after C.
PART\$ = ST\$:  I = INSTR(PART\$, "EI")
WHILE (I > 0) AND CORRECT
CORRECT = 0
IF I >= 2 THEN IF MID\$(PART\$, I - 1, 1) = "C" THEN CORRECT = -1
PART\$ = MID\$(PART\$, I + 3, LEN(PART\$) - (I + 2))
I = INSTR(PART\$, "EI")
WEND
'-- Check for 3 consecutive same letters
I = 1
WHILE (I <= L - 2) AND CORRECT
IF MID\$(ST\$, I, 1) = MID\$(ST\$, I + 1, 1) THEN
IF MID\$(ST\$, I, 1) = MID\$(ST\$, I + 2, 1) THEN
CORRECT = 0
END IF
END IF
I = I + 1
WEND
IF CORRECT THEN PRINT "CORRECT" ELSE PRINT "MISSPELLED"

'3.2
' This program finds the positive root of V for an equation.
'
DEF FNC (V) = -23511.9 * V * V + 988686.1 * V - 400943!
DEF FNB (V) = P(I) * V * 9062.599
DEF FNA (V) = P(I) * V * V * V * 14.14 - FNB(V) + FNC(V)
DATA 0.05, 0.7, 10.0, 70.0
FOR I = 1 TO 4: READ P(I): NEXT I
FOR I = 1 TO 5
IF I = 5 THEN PRINT : INPUT "Enter value for P:"; P(5)
FOR J = 0 TO 2
IF SGN(FNA(J)) <> SGN(FNA(J + 1)) AND FNA(J + 1) <> 0 THEN
LOW = J: HIGH = J + 1
IF FNA(LOW) > FNA(HIGH) THEN SWAP LOW, HIGH
WHILE ABS(LOW - HIGH) > .00005
MID = (LOW + HIGH) / 2
IF FNA(MID) < 0 THEN LOW = MID ELSE HIGH = MID
WEND
MID = SGN(MID) * INT(ABS(MID) * 10000 + .5) / 10000
PRINT USING "P = ##.##"; P(I);
PRINT USING "  V = #.####"; MID
END IF
NEXT J
NEXT I

'3.3
' This program will magnify an input positive integer.
'
DATA 123567,36,13457,13467,2346,12467,124567,136,1234567,12346
FOR I = 0 TO 9:  READ NUM\$(I):  NEXT I
INPUT "Enter number:"; N\$
INPUT "Enter magnification:"; MAGN
CLS
FOR I = 1 TO LEN(N\$)
N = VAL(MID\$(N\$, I, 1))
COL = (I - 1) * MAGN * 6 + 1
FOR J = 1 TO LEN(NUM\$(N))
PART = VAL(MID\$(NUM\$(N), J, 1))
GOSUB DisplayPart
NEXT J
NEXT I
END
'
DisplayPart:
SELECT CASE PART
CASE 1
LOCATE 1, COL
FOR K = 1 TO MAGN: PRINT "****"; : NEXT K: PRINT
CASE 2
FOR K = 1 TO MAGN * 2 + 1: LOCATE K, COL: PRINT "*": NEXT K
CASE 3
FOR K = 1 TO MAGN * 2 + 1
LOCATE K, COL + MAGN * 4 - 1: PRINT "*"
NEXT K
CASE 4
LOCATE MAGN * 2 + 1, COL
FOR K = 1 TO MAGN: PRINT "****"; : NEXT K: PRINT
CASE 5
FOR K = MAGN * 2 + 1 TO MAGN * 4 + 1
LOCATE K, COL: PRINT "*"
NEXT K
CASE 6
FOR K = MAGN * 2 + 1 TO MAGN * 4 + 1
LOCATE K, COL + MAGN * 4 - 1: PRINT "*"
NEXT K
CASE 7
LOCATE MAGN * 4 + 1, COL
FOR K = 1 TO MAGN: PRINT "****"; : NEXT K: PRINT
END SELECT
RETURN

'3.4
' This program produces a calendar for a given month/year.
' January 1, 1901 is a Tuesday.
'
DIM MO\$(12), DAYSINMO(12)
DATA JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY
DATA AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
DATA 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
FOR I = 1 TO 12: READ MO\$(I): NEXT I
FOR I = 1 TO 12: READ DAYSINMO(I): NEXT I
INPUT "Enter month, year:"; MONTH, YEAR
MD = 2 + INT((26 - (LEN(MO\$(MONTH)) + 5)) / 2)
CLS : PRINT SPACE\$(MD); MO\$(MONTH); YEAR
PRINT "   S   M   T   W   T   F   S"
PRINT "  --------------------------"
' Calculate # of days from 1/1/1901 to last day of prior month
DAYS = (YEAR - 1901) * 365 + INT((YEAR - 1901) / 4)
FOR I = 1 TO MONTH - 1
DAYS = DAYS + DAYSINMO(I)
NEXT I
IF (MONTH > 2) AND (YEAR MOD 4 = 0) THEN DAYS = DAYS + 1
' Determine first day of month
DAY = (DAYS + 1) MOD 7  'Day =0 (Mon), =1 (Tue) ... =6 (Sun)
COL = (DAY + 1) MOD 7   ' Day = 0,1,2,3,4,5,6 Sun,Mon...Sat
IF (MONTH = 2) AND (YEAR MOD 4 = 0) THEN LEAP = 1 ELSE LEAP = 0
' Display month calendar
IF COL > 0 THEN PRINT SPACE\$(COL * 4);
FOR I = 1 TO DAYSINMO(MONTH) + LEAP
PRINT USING "####"; I;
COL = (COL + 1) MOD 7
IF COL = 0 THEN PRINT
NEXT I

'3.5
' This program positions 5 queens on the board so none attack.
'
PRINT "ROWS = 1 2 3 4 5"
PRINT "----------------"
PRINT "COLUMNS"
COL = 1:  ROW = 1: DIMEN = 5
WHILE (COL > 1) OR (ROW < DIMEN + 1)
WHILE (ROW <= DIMEN) AND (COL <= DIMEN)
GOSUB IsQueenSafe
IF SAFETY THEN
CONFIG(COL) = ROW:  COL = COL + 1:  ROW = 1
ELSE
ROW = ROW + 1
END IF
WEND
IF (ROW = DIMEN + 1) THEN COL = COL - 1: ROW = CONFIG(COL) + 1
IF (COL = DIMEN + 1) THEN
'   Display solution and retreat column
PRINT SPACE\$(6);
FOR I = 1 TO DIMEN: PRINT USING "##"; CONFIG(I); : NEXT I
PRINT
COL = COL - 1: ROW = CONFIG(COL) + 1
END IF
WEND
END
' -------- Function Safety returns True if no queen can attack
IsQueenSafe:
SAFETY = -1
FOR I = 1 TO COL - 1
IF (CONFIG(I) + I) = (ROW + COL) THEN SAFETY = 0
IF (CONFIG(I) - I) = (ROW - COL) THEN SAFETY = 0
IF (CONFIG(I) = ROW) THEN SAFETY = 0
NEXT I
RETURN

'3.6
' This program prints the product of 2 large integers in Base.
'
DEFINT A-Z
DIM A(31), B(31), PROD(61)
INPUT "Enter base:"; BAS
INPUT "Enter first integer: "; ASTR\$
INPUT "Enter second integer:"; BSTR\$
' -- Determine if signs are positive or negative
SIGN = 1
IF MID\$(ASTR\$, 1, 1) = "-" THEN
ASTR\$ = MID\$(ASTR\$, 2, LEN(ASTR\$) - 1): SIGN = -1
END IF
IF MID\$(BSTR\$, 1, 1) = "-" THEN
BSTR\$ = MID\$(BSTR\$, 2, LEN(BSTR\$) - 1): SIGN = SIGN * -1
END IF
IF SIGN < 0 THEN PRINT "-";
' -- Store sgring digits into numerical arrays
LENA = LEN(ASTR\$):  LENB = LEN(BSTR\$)
FOR I = LENA TO 1 STEP -1
A(LENA - I + 1) = VAL(MID\$(ASTR\$, I, 1))
NEXT I
FOR I = LENB TO 1 STEP -1
B(LENB - I + 1) = VAL(MID\$(BSTR\$, I, 1))
NEXT I
' -- Multiply 2 numbers as a person would, with carries
FOR I = 1 TO LENB
CARRY = 0
FOR J = 1 TO LENA
S = I + J - 1
PROD(S) = PROD(S) + B(I) * A(J) + CARRY
CARRY = INT(PROD(S) / BAS)
PROD(S) = PROD(S) - CARRY * BAS
NEXT J
IF CARRY > 0 THEN PROD(S + 1) = CARRY
NEXT I
' -- Display product
IF CARRY > 0 THEN PRINT USING "#"; PROD(S + 1);
FOR I = S TO 1 STEP -1:  PRINT USING "#"; PROD(I); : NEXT I

'3.7
' This program computes most efficient change without a coin.
'
INPUT "Enter cost, amount:"; COST, AMOUNT
INPUT "Enter missing coin:"; COIN\$
CHANGE = INT((AMOUNT - COST) * 100 + .1)
C\$(1) = "QUARTER": C\$(2) = "DIME": C\$(3) = "NICKEL": C\$(4) =
"PENNY"
A(1) = 25: A(2) = 10: A(3) = 5: A(4) = 1
X = CHANGE
ST = 1: EN = 4: GOSUB MakeChange   'Calculate denominations
C = 1
WHILE (C < 4) AND COIN\$ <> C\$(C): C = C + 1: WEND
SELECT CASE C
CASE 1
'     ***  NO quarters  ***
'     Determine most efficient way without quarters (C=1)
X = CHANGE
ST = 2: EN = 4: GOSUB MakeChange   'Calculate denominations
CASE 2
'     ***  NO dimes     ***
'     Add 2 nickels for every dime
B(3) = B(3) + B(2) * 2
CASE 3
'   ***  NO nickels   ***
'   IF a nickel then IF at least 1 quarter then
'                       Make 3 dimes and 1 less quarter
'                    Else make 5 more pennies with the 1 nickel
IF B(3) = 1 THEN
IF B(1) > 0 THEN
B(2) = B(2) + 3: B(1) = B(1) - 1
ELSE
B(4) = B(4) + 5
END IF
END IF
END SELECT
'
' Display results
'
FOR I = 4 TO 1 STEP -1
IF I <> C THEN
PRINT USING "# "; B(I);
IF I = 4 AND B(I) <> 1 THEN
PRINT "PENNIES"
ELSE
PRINT C\$(I); : IF B(I) <> 1 THEN PRINT "S" ELSE PRINT
END IF
END IF
NEXT I
PRINT "TOTAL CHANGE RETURNED ="; CHANGE; "CENT";
IF CHANGE <> 1 THEN PRINT "S" ELSE PRINT
END
'
' Determine most efficient change given coins
'
MakeChange:
FOR I = ST TO EN
B(I) = INT(X / A(I))
X = X - B(I) * A(I)
NEXT I
RETURN

'3.8
' This program displays the coordinates of binary rectangles.
'
DEFINT A-Z
DIM A(6, 7)
' Convert 6 numbers to binary representation
FOR I = 1 TO 6
INPUT "Enter number:"; NUM
DEN = 128
FOR J = 6 TO 0 STEP -1
DEN = DEN / 2
A(I, 7 - J) = INT(NUM / DEN)
NUM = NUM - A(I, 7 - J) * DEN
NEXT J
NEXT I
PRINT
' Display the 6 row X 7 col grid of 0s and 1s
FOR I = 1 TO 6
FOR J = 1 TO 7
PRINT USING "#"; A(I, J);
NEXT J: PRINT
NEXT I
PRINT
' Find largest solid rectangles of 1s
FOR ROWLEN = 6 TO 2 STEP -1
FOR COLLEN = 7 TO 2 STEP -1
FOR ROWST = 1 TO 7 - ROWLEN
FOR COLST = 1 TO 8 - COLLEN
RECT = -1
FOR I = ROWST TO ROWST + ROWLEN - 1
J = COLST
WHILE (J <= COLST + COLLEN - 1) AND RECT
IF A(I, J) = 0 THEN RECT = 0
J = J + 1
WEND
NEXT I
IF RECT THEN
PRINT USING "(#"; ROWST; : PRINT ",";
PRINT USING "#"; COLST; :  PRINT ")";
PRINT USING "(#"; ROWST + ROWLEN - 1; : PRINT ",";
PRINT USING "#"; COLST + COLLEN - 1; :  PRINT ")"
FOR I = ROWST TO ROWST + ROWLEN - 1
FOR J = COLST TO COLST + COLLEN - 1
A(I, J) = 0
NEXT J
NEXT I
END IF
NEXT COLST
NEXT ROWST
NEXT COLLEN
NEXT ROWLEN

'3.9
' This program determines the 5 word combination for BINGO.
'
DIM LETVAL(26)
DATA 9, 14, 1, 16, 20, 5, 10, 2, 21, 17, 6, 25
DATA 12, 3, 22, 18, 24, 7, 13, 26, 15, 11, 19, 4, 23, 8
FOR I = 1 TO 26:  READ LETVAL(I):  NEXT I
DATA BIBLE,IDYLL,NOISE,GULLY,OBESE
DATA OBESE,TITHE,INLET,IGLOO,TOWER
FOR COL = 1 TO 2
FOR ROW = 1 TO 5
READ HIGHWORD\$(ROW, COL): SUM = 0
FOR I = 1 TO 5
WORD\$ = HIGHWORD\$(ROW, COL)
LETTER\$ = MID\$(WORD\$, I, 1)
SUM = SUM + LETVAL(ASC(LETTER\$) - 64)
NEXT I
HIGHEST(ROW, COL) = SUM
NEXT ROW
NEXT COL
'
WHILE WORD\$ <> "QUIT"
GOSUB DisplayValues   'DisplayValues
INPUT "Enter word:"; WORD\$
WHILE LEN(WORD\$) = 5
SUM = 0
FOR I = 1 TO 5
LETTER\$ = MID\$(WORD\$, I, 1)
LETTERS\$(I) = LETTER\$
SUM = SUM + LETVAL(ASC(LETTER\$) - 64)
NEXT I
GOSUB UseWord
INPUT "Enter word:"; WORD\$
WEND
WEND
END
'
'-- Procedure UseWord
UseWord:
FOR COL = 1 TO 2
FOR ROW = 1 TO 5
IF LETTERS\$(COL) = MID\$("BINGO", ROW, 1) THEN
IF SUM > HIGHEST(ROW, COL) THEN
HIGHEST(ROW, COL) = SUM:  HIGHWORD\$(ROW, COL) = WORD\$
END IF
END IF
NEXT ROW
NEXT COL
RETURN

'
'-- Procedure DisplayValues
DisplayValues:
PRINT : MAX = 0
FOR I = 1 TO 2:  MAXSUM(I) = 0:  NEXT I
ST = 1:  EN = 2
FOR ROW = 1 TO 5
FOR COL = ST TO EN
PRINT HIGHWORD\$(ROW, COL);
PRINT USING " ###"; HIGHEST(ROW, COL);
PRINT SPACE\$(3);
MAXSUM(COL) = MAXSUM(COL) + HIGHEST(ROW, COL)
NEXT COL
PRINT
NEXT ROW
' Determine maximum column and display ***
FOR COL = ST TO EN
PRINT SPACE\$(3 + COL * 3); : PRINT USING "###"; MAXSUM(COL);
IF MAXSUM(COL) > MAX THEN MAX = MAXSUM(COL): MAXCOL = COL
NEXT COL
PRINT
IF MAXCOL = 1 THEN
PRINT SPACE\$(6); "***"
ELSE
PRINT SPACE\$(18); "***"
END IF
PRINT
RETURN

'3.10
' This program displays the number of distinguishable
' permutations for a cube w/sides input as color symbols.
'
DIM UNIQUE\$(24, 6)
DATA TOP,FRONT,BOTTOM,BACK,RIGHT,LEFT
FOR I = 1 TO 6: READ SIDE\$(I): NEXT I
' Assign colors to original 4 cubes
FOR I = 1 TO 6
PRINT "Enter "; SIDE\$(I); " side:"; : INPUT CUBE\$(I)
NEXT I
NUM = 0
' Rotate cubes and check if it is unique
FOR ROT = 0 TO 23
GOSUB Permute
IF ROT = 0 THEN
VALID = -1
ELSE
J = 1: VALID = -1
WHILE (J <= NUM) AND VALID
VALID = 0
FOR K = 1 TO 6
IF C\$(K) <> UNIQUE\$(J, K) THEN VALID = -1
NEXT K
J = J + 1
WEND
END IF
IF VALID THEN
NUM = NUM + 1
FOR I = 1 TO 6: UNIQUE\$(NUM, I) = C\$(I): NEXT I
END IF
NEXT ROT
PRINT "NUMBER OF DISTINGUISHABLE CUBES ="; NUM
END
'-- PROCEDURE THAT PERMUTES (SWAPS THE COLORS ON THE SQUARES)
Permute:
IF ROT MOD 4 > 0 THEN
TEMP\$ = C\$(2): C\$(2) = C\$(5): C\$(5) = C\$(4)
C\$(4) = C\$(6): C\$(6) = TEMP\$
ELSE
SQUARE = INT(ROT / 4) + 1
C\$(1) = CUBE\$(SQUARE)
SELECT CASE SQUARE
CASE 1
FOR I = 2 TO 6: C\$(I) = CUBE\$(I): NEXT I
CASE 2
C\$(2) = CUBE\$(3): C\$(3) = CUBE\$(4)
C\$(4) = CUBE\$(1): C\$(5) = CUBE\$(5): C\$(6) = CUBE\$(6)
CASE 3
C\$(2) = CUBE\$(4): C\$(3) = CUBE\$(1)
C\$(4) = CUBE\$(2): C\$(5) = CUBE\$(5): C\$(6) = CUBE\$(6)
CASE 4
C\$(2) = CUBE\$(1): C\$(3) = CUBE\$(2)
C\$(4) = CUBE\$(3): C\$(5) = CUBE\$(5): C\$(6) = CUBE\$(6)
CASE 5
C\$(2) = CUBE\$(2): C\$(3) = CUBE\$(6)
C\$(4) = CUBE\$(4): C\$(5) = CUBE\$(3): C\$(6) = CUBE\$(1)
CASE 6
C\$(2) = CUBE\$(2): C\$(3) = CUBE\$(5)
C\$(4) = CUBE\$(4): C\$(5) = CUBE\$(1): C\$(6) = CUBE\$(3)
END SELECT
END IF
RETURN

```