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

'1.1
' This program displays title of contest forward and backward.
'
A\$ = "FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '95"
FOR I = 1 TO 4
PRINT A\$
FOR J = LEN(A\$) TO 1 STEP -1
PRINT MID\$(A\$, J, 1);
NEXT J
PRINT
NEXT I

'1.2
' This program will generate comments in different languages.
'
INPUT "Enter comment:"; C\$
PRINT "BASIC: ' "; C\$
PRINT "PASCAL: { "; C\$; " }"
PRINT "C: /* "; C\$; " */"
PRINT "C++: // "; C\$

'1.3
' This program either increments or decrements N by 1.
'
INPUT "Enter N:"; N
INPUT "Enter operator:"; OP\$
IF OP\$ = "++" THEN
PRINT N + 1
ELSE          'OPerator is "--"
PRINT N - 1
END IF

'1.4
' This program rounds to three decimal places by break point
'
INPUT "Enter break point:"; BP
INPUT "Enter number:"; NUM
ROUND = INT(NUM * 1000 + (10 - BP) / 10) / 1000
PRINT USING "#.###"; ROUND

'1.5
' This program will determine if a program is a REXX or a CLIST.
'
INPUT "Enter comment:"; C\$
IF INSTR(C\$, "REXX") > 0 THEN
PRINT "REXX"
ELSE
PRINT "CLIST"
END IF

'1.6
' This program displays the number of times variables appear.
'
INPUT "Enter number of variables:"; NUM
INPUT "Enter number initialized:"; INIT
INPUT "Enter number initialized to 0:"; INIT0
PRINT "BASIC ="; INIT - INIT0
PRINT "PASCAL ="; NUM + INIT
PRINT "C/C++ ="; NUM

'1.7
' This program displays the last qualifier of a data set name.
'
INPUT "Enter data set name"; DSN\$
FOR I = LEN(DSN\$) TO 1 STEP -1
CH\$ = MID\$(DSN\$, I, 1)
IF CH\$ = "." THEN
PRINT LAST\$: END
ELSE
LAST\$ = CH\$ + LAST\$
END IF
NEXT I

'1.8
' This program displays a set of real numbers in reverse order.
'
INPUT "Enter N:"; N
FOR I = 1 TO N
INPUT "Enter #:"; A\$(I)
NEXT I
PRINT
FOR I = N TO 1 STEP -1
PRINT A\$(I)
NEXT I

'1.9
' This program displays a large X made up of letter X's.
'
INPUT "Enter number of X's:"; NUM
CLS
FOR I = 1 TO NUM
LOCATE I, I: PRINT "X"
LOCATE I, NUM - I + 1: PRINT "X"
NEXT I

'1.10
' This program will display the savings in postage.
'
COST = 23.33333
INPUT "Enter # of printed sides:"; PS
INPUT "Enter # of single sided pages:"; SS
' Calculate # of pages and weight for 1st bill
PAGE1 = PS - 6: OZ1 = 1
OZ1 = OZ1 + INT((PAGE1 + 8) / 9)
' Calculate # of pages and weight for 2nd bill
PAGE2 = SS + INT((PS - SS + 1) / 2) - 6
OZ2 = 1
OZ2 = OZ2 + INT((PAGE2 + 8) / 9)
PRINT USING "###.## CENTS SAVED"; (OZ1 - OZ2) * COST

'2.1
' This program finds integral solutions of (X,Y) for AX + BY = C.
'
INPUT "Enter A, B, C:"; A, B, C
X = 1
DO
Y = (C - A * X) / B
IF ABS(Y - INT(Y)) < .001 THEN
PRINT "("; LTRIM\$(STR\$(X)); ","; LTRIM\$(STR\$(Y)); ")"
END
END IF
X = X + 1
LOOP UNTIL X > 10000

'2.2
' This program verifies a part number by validating check digit
'
INPUT "Enter part number:"; PART\$
L = LEN(PART\$): PROD = 1
FOR I = 1 TO L - 1
DIGIT = VAL(MID\$(PART\$, I, 1))
SUM = SUM + DIGIT * ((I MOD 2) + 1)
NEXT I
' Subtract units digit of sum from 9 for check digit
CHKDIGIT = 9 - (SUM MOD 10)
IF CHKDIGIT = VAL(RIGHT\$(PART\$, 1)) THEN
PRINT "OKAY"
ELSE
PRINT "ERROR - CHECK DIGIT SHOULD BE"; CHKDIGIT
END IF

'2.3
' This program determines number of prizes given of \$13 million
'
PRIZE = 13000000
' Same algorithm is used as converting # to base 13 #
FOR I = 6 TO 0 STEP -1
POW(I) = INT(13 ^ I + .1)
A(I) = INT(PRIZE / POW(I))
PRIZE = PRIZE MOD POW(I)
NEXT I
FOR I = 0 TO 6
PRINT "\$"; LTRIM\$(STR\$(POW(I))); " ="; A(I)
NEXT I

'2.4
' This program will determine the cost of Directory Assistance.
'
INPUT "Enter number of DACs:"; N
FOR I = 1 TO N
INPUT "Enter DAC:"; DAC\$
IF DAC\$ = "00" THEN
COST = 3!
ELSEIF DAC\$ = "1411" THEN
LOCALDAC = LOCALDAC + 1: COST = 0
ELSE
AREA\$ = MID\$(DAC\$, 2, 3)
IF AREA\$ = "813" THEN
COST = .25
ELSEIF AREA\$ = "305" OR AREA\$ = "407" OR AREA\$ = "904" THEN
COST = .4
ELSE
COST = .65
END IF
END IF
TOT = TOT + COST
NEXT I
' Every local DAC after the third cost 25 cents
IF LOCALDAC > 3 THEN
TOT = TOT + (LOCALDAC - 3) * .25
END IF
PRINT USING "##.## DOLLARS"; TOT

'2.5
' This program will display the heading of even/odd pages.
'
DATA PROBLEMS,180,JUDGING CRITERIA,140
DATA BASIC SOLUTIONS,200,PASCAL SOLUTIONS,260
FOR I = 1 TO 4: READ P\$(I), PNUM(I): NEXT I
'
INPUT "Enter page number:"; PAGE
IF PAGE MOD 2 = 0 THEN
PRINT LTRIM\$(STR\$(PAGE));
PRINT "  FLORIDA HIGH SCHOOLS COMPUTING COMPETITION";
PRINT " 1985 - 1994"
ELSE
PRINT "FHSCC '";
I = 1: PAG = PAGE
WHILE PAG > PNUM(I)
PAG = PAG - PNUM(I): I = I + 1
WEND
CH = INT(PAG / (PNUM(I) / 10))
PRINT USING "## "; 85 + CH;
PRINT P\$(I); " ";
PRINT PAGE
END IF

'2.6
' This program will compute the total ESTIMATED PREPARATION TIME.
'
DATA 1040,A,B,C,D,E
DATA 3,8,  2,53, 4,41, 0,53
DATA 2,32, 0,26, 1,10, 0,27
DATA 0,33, 0,8,  0,17, 0,20
DATA 6,26, 1,10, 2,5,  0,35
DATA 0,51, 0,42, 1,1,  0,41
DATA 2,52, 1,7, 1,16,  0,35
FOR I = 1 TO 6: READ FORM\$(I): NEXT I
FOR I = 1 TO 6
FOR J = 1 TO 4
NEXT J
NEXT I
' Tally form times until invalid entry
I = 0
DO UNTIL I > 6
INPUT "Enter form:"; F\$
I = 1
WHILE (I < 7) AND (F\$ <> FORM\$(I)): I = I + 1: WEND
IF I < 7 THEN
FOR J = 1 TO 4
TOTHR = TOTHR + HR(I, J)
TOTMIN = TOTMIN + MIN(I, J)
NEXT J
END IF
LOOP
'
TOTHR = TOTHR + INT(TOTMIN / 60)
TOTMIN = TOTMIN MOD 60
PRINT TOTHR; "HR.,"; TOTMIN; "MIN."

'2.7
' This program will calculate investments at GTE.
'
BEGPRICE = 32! * .85
RETURN401K = .14
'
INPUT "Enter salary:"; SALARY
INPUT "Enter 401K %:"; PERCENT: PERCENT = PERCENT / 100
MAXSHARES = INT(SALARY / 100)
PRINT "YOU CAN PURCHASE UP TO"; MAXSHARES; "SHARES"
INPUT "Enter number of shares:"; SHARES
INPUT "Enter end of year price:"; ENDPRICE
'
EMPCONT = SALARY * PERCENT
IF PERCENT >= .06 THEN
COMPCONT = (SALARY * .06) * .75
ELSE
COMPCONT = (SALARY * PERCENT) * .75
END IF
K401 = (EMPCONT + COMPCONT) * RETURN401K
STOCKGAIN = SHARES * (ENDPRICE - BEGPRICE)
TOTALGAIN = COMPCONT + K401 + STOCKGAIN
'
PRINT USING "COMPANY CONTRIBUTION: #####.##"; COMPCONT
PRINT USING "401K INTEREST RETURN: #####.##"; K401
PRINT USING "         STOCK GAINS: #####.##"; STOCKGAIN
PRINT USING "         TOTAL GAINS: #####.##"; TOTALGAIN

'2.8
' This program will produce loops of a spiral using letters.
'
INPUT "Enter number of spiral loops:"; NUM
INPUT "Enter first letter:"; LET\$
CLS
ROW = 12: COL = 40: INCR = 1
WHILE LOOPNUM < NUM
INCR = INCR + 2
' Go right
LOCATE ROW, COL: PRINT STRING\$(INCR, LET\$)
COL = COL + INCR - 1
' Go down
FOR I = 1 TO INCR - 1
LOCATE ROW + I, COL: PRINT LET\$
NEXT I
ROW = ROW + INCR - 1: INCR = INCR + 2
' Go left
COL = COL - INCR + 1
LOCATE ROW, COL: PRINT STRING\$(INCR, LET\$)
' Go up
FOR I = 1 TO INCR - 2
LOCATE ROW - I, COL: PRINT LET\$
NEXT I
ROW = ROW - INCR + 1
IF LET\$ = "Z" THEN LET\$ = "A" ELSE LET\$ = CHR\$(ASC(LET\$) + 1)
LOOPNUM = LOOPNUM + 1
WEND

'2.9
' This program shows all possible moves for a Queen in chess.
'
INPUT "Enter column and row:"; RC\$
COL = ASC(LEFT\$(RC\$, 1)) - ASC("A") + 1
ROW = 9 - VAL(RIGHT\$(RC\$, 1))
CLS
FOR I = 8 TO 1 STEP -1: PRINT USING "#"; I: NEXT I
PRINT "  A B C D E F G H"
' Horizontal moves
LOCATE ROW, 3: PRINT "* * * * * * * *"
' Vertical moves
FOR I = 1 TO 8: LOCATE I, COL * 2 + 1: PRINT "*": NEXT I
' Diagonal moves
FOR I = 1 TO 7
R(1) = ROW - I: C(1) = COL - I
R(2) = ROW + I: C(2) = COL + I
R(3) = ROW - I: C(3) = COL + I
R(4) = ROW + I: C(4) = COL - I
FOR J = 1 TO 4
IF R(J) > 0 AND R(J) < 9 AND C(J) > 0 AND C(J) < 9 THEN
LOCATE R(J), C(J) * 2 + 1: PRINT "*"
END IF
NEXT J
NEXT I
LOCATE ROW, COL * 2 + 1: PRINT "Q"

'2.10
' This program tabulates information during a pre-election.
'
DATA MALE,FEMALE,50 AND BELOW,OVER 50,WHITE,OTHERS
DATA ABOVE \$25000,\$25000 AND BELOW
DATA WHITE MALE OVER 50 AND ABOVE \$25000,OTHER
INPUT "Enter sex:"; SEX\$
WHILE SEX\$ <> "E"
INPUT "Enter age:"; AGE
INPUT "Enter race:"; RACE\$
INPUT "Enter income:"; INCOME
INPUT "Enter party:"; PARTY\$
IF PARTY\$ = "D" THEN COL = 1 ELSE COL = 2
IF SEX\$ = "M" THEN ROW = 1 ELSE ROW = 2
SUM(ROW, COL) = SUM(ROW, COL) + 1
IF AGE <= 50 THEN ROW = 3 ELSE ROW = 4
SUM(ROW, COL) = SUM(ROW, COL) + 1
IF RACE\$ = "W" THEN ROW = 5 ELSE ROW = 6
SUM(ROW, COL) = SUM(ROW, COL) + 1
IF INCOME > 25000 THEN ROW = 7 ELSE ROW = 8
SUM(ROW, COL) = SUM(ROW, COL) + 1
IF RACE\$ = "W" AND SEX\$ = "M" AND AGE > 50 AND ROW = 7 THEN
ROW = 9
ELSE
ROW = 10
END IF
SUM(ROW, COL) = SUM(ROW, COL) + 1
TOTAL = TOTAL + 1: PRINT
INPUT "Enter sex:"; SEX\$
WEND
'
PRINT TAB(33); "DEMOCRATIC  REPUBLICAN";
FOR ROW = 1 TO 10
IF ROW MOD 2 = 1 THEN PRINT
PRINT TAB(38);
PRINT USING "###.#"; SUM(ROW, 1) / TOTAL * 100;
PRINT USING "       ###.#"; SUM(ROW, 2) / TOTAL * 100
NEXT ROW

'3.1
' This program will determine how much IRS owes/pays.
'
DATA 22750, 55100, 115000, 250000, 9999999
FOR I = 1 TO 5: READ AMOUNT(I): NEXT I
DATA .15, .28, .31, .36, .396
FOR I = 1 TO 5: READ RATE(I): NEXT I
STDEDUCT = 3800: EXEMPTION = 2450
'
INPUT "Enter adjusted gross income:"; GROSS
INPUT "Enter itemized deductions:"; DEDUCTIONS
INPUT "Enter federal income tax withheld"; FEDTAX
IF DEDUCTIONS > STDEDUCT THEN
INCOME = GROSS - DEDUCTIONS
ELSE
INCOME = GROSS - STDEDUCT
END IF
TAXINC = INCOME - EXEMPTION
'
FOR I = 1 TO 5
IF TAXINC <= AMOUNT(I) THEN
FOR J = 1 TO I - 1
TAX = TAX + (AMOUNT(J) - AMOUNT(J - 1)) * RATE(J)
NEXT J
TAX = TAX + (TAXINC - AMOUNT(I - 1)) * RATE(I)
PRINT USING "######.## DOLLARS "; ABS(TAX - FEDTAX);
IF FEDTAX < TAX THEN
PRINT "YOU OWE"
ELSE
PRINT "WILL BE REFUNDED TO YOU"
END IF: END
END IF
NEXT I

'3.2
' This program will display a simplified phone bill.
'
L = 1: INPUT "Enter MIN:"; MIN(L)
WHILE MIN(L) > 0
INPUT "Enter time:"; TIM\$(L)
L = L + 1
INPUT "Enter MIN:"; MIN(L)
WEND
L = L - 1
'
' Display bill
PRINT "  BOB SMITH  (813) 555-1234": PRINT
PRINT "  TIME OF DAY  MIN.  CHARGE"
FOR I = 1 TO L
IF LEFT\$(TIM\$(I), 1) = "0" THEN
PRINT " "; MID\$(TIM\$(I), 2);
ELSE
PRINT TIM\$(I);
END IF
' Calculate charge
HH = VAL(LEFT\$(TIM\$(I), 2))
AM\$ = MID\$(TIM\$(I), 7, 2)
DAY\$ = RIGHT\$(TIM\$(I), 3)
BOOL1 = (HH > 7 AND HH < 12 AND AM\$ = "AM")
BOOL2 = (HH = 12 AND AM\$ = "PM") OR (HH < 5 AND AM\$ = "PM")
MIDDAY = BOOL1 OR BOOL2
IF HH > 4 AND HH < 11 AND AM\$ = "PM" AND DAY\$ <> "SAT" THEN
RATE1 = .21: RATE2 = .16
ELSEIF MIDDAY AND DAY\$ <> "SAT" AND DAY\$ <> "SUN" THEN
RATE1 = .28: RATE2 = .21
ELSE
RATE1 = .14: RATE2 = .11
END IF
CHARGE(I) = RATE1 + RATE2 * (MIN(I) - 1)
PRINT USING "  ###"; MIN(I);
PRINT USING "   ###.##"; CHARGE(I)
TOT = TOT + CHARGE(I)
NEXT I
IF TOT > 20 THEN DISC = TOT * .2
PRINT
PRINT "TOTAL CHARGES"; TAB(22);
PRINT USING "###.##"; TOT
PRINT "DISCOUNT"; TAB(22);
PRINT USING "###.##"; DISC
PRINT "CHARGES - DISCOUNT"; TAB(22);
PRINT USING "###.##"; TOT - DISC

'3.3
' This program simulates a baseball game.
'
DEFINT A-W
RANDOMIZE TIMER
CLS : PRINT
PRINT SPACE\$(8);
FOR I = 1 TO 9: PRINT I; : NEXT I: PRINT " SCORE"
PRINT SPACE\$(8); : FOR I = 1 TO 33: PRINT "-"; : NEXT I: PRINT
PRINT "TEAM A !"; SPACE\$(27); "!"
PRINT "TEAM B !"; SPACE\$(27); "!"
FOR IN = 1 TO 9
FOR T = 1 TO 2
S = 0: B = 0: W = 0: R = 0: O = 0
WHILE O < 3
X = RND(3)
IF X < .4 THEN S = S + 1: STOT = STOT + 1
IF X >= .4 THEN B = B + 1: BTOT = BTOT + 1
IF S = 3 THEN O = O + 1: OTOT = OTOT + 1: S = 0: W = 0
IF B = 4 THEN W = W + 1: WTOT = WTOT + 1: B = 0: S = 0
IF W = 4 THEN R = R + 1: R(T) = R(T) + 1: W = 3
WEND
LOCATE 3 + T, 6 + IN * 3: PRINT R;
NEXT T
NEXT IN
LOCATE 4, 39: PRINT USING "##"; R(1)
LOCATE 5, 39: PRINT USING "##"; R(2)
PRINT
PRINT "TOTAL # OF STRIKES:"; STOT
PRINT "TOTAL # OF BALLS:"; BTOT
PRINT "TOTAL # OF WALKS:"; WTOT
PRINT "TOTAL # OF STRIKE OUTS:"; OTOT

'3.4
' This program will produce all possible subsets of letters.
'
DEFINT A-Z: DIM SUB\$(1024)
INPUT "Enter letters:"; L\$
L = LEN(L\$)
FOR I = 1 TO L: A\$(I) = MID\$(L\$, I, 1): NEXT I
'
' Sort letters in A\$()
FOR I = 1 TO L - 1
FOR J = I + 1 TO L
IF A\$(I) > A\$(J) THEN SWAP A\$(I), A\$(J)
NEXT J
NEXT I
'
' Generate binary numbers to produce all subsets.
FOR N = 0 TO 2 ^ L - 1
NUM = N
FOR J = L - 1 TO 0 STEP -1
BIT = INT(NUM / 2 ^ J)
IF BIT THEN
SUB\$(N) = SUB\$(N) + A\$(L - J): NUM = NUM - 2 ^ J
END IF
NEXT J
NEXT N
'
' Bubble Sort subsets
FOR I = 0 TO 2 ^ L - 2
FOR J = I + 1 TO 2 ^ L - 1
IF SUB\$(I) > SUB\$(J) THEN SWAP SUB\$(I), SUB\$(J)
NEXT J
NEXT I
'
' Display subsets
FOR I = 0 TO 2 ^ L - 1
SUBLEN = LEN(SUB\$(I)) + 3
IF COL + SUBLEN > 50 THEN PRINT : COL = 0
PRINT "{"; SUB\$(I); "} ";
COL = COL + SUBLEN
NEXT I
PRINT : PRINT "TOTAL SUBSETS ="; 2 ^ L

'3.5
' This program will sum big integers from 1 to N.
' Gauss's formula: SUM = N * (N+1) / 2.
'
DIM A(80), B(80), PROD(80), D(80)
INPUT "Enter N:"; N\$
'
' Store digits of N\$ in A() and B()
LENA = LEN(N\$): LENB = LENA
FOR I = 1 TO LENA
A(I) = VAL(MID\$(N\$, LENA - I + 1, 1))
B(I) = A(I)
NEXT I
'
' Add 1 to number in B()
B(1) = B(1) + 1: I = 1
WHILE B(I) = 10
B(I) = 0: I = I + 1: B(I) = B(I) + 1
WEND
IF I > LENB THEN LENB = I
'
' Multiply A() by B()
FOR I = 1 TO LENA
CARRY = 0
FOR J = 1 TO LENB
S = I + J - 1
PROD(S) = PROD(S) + A(I) * B(J) + CARRY
CARRY = INT(PROD(S) / 10)
PROD(S) = PROD(S) - CARRY * 10
NEXT J
IF CARRY > 0 THEN PROD(S + 1) = CARRY
NEXT I
IF CARRY > 0 THEN S = S + 1
'
' Divide product PROD() by 2
IF PROD(S) = 1 THEN S = S - 1: CARRY = 10
FOR I = S TO 1 STEP -1
D(I) = INT((PROD(I) + CARRY) / 2)
CARRY = (PROD(I) MOD 2) * 10
NEXT I
'
FOR I = S TO 1 STEP -1
PRINT USING "#"; D(I);
NEXT I: PRINT

'3.6
' This program will assign values to variables in BASIC code.
'
DO
L = L + 1
INPUT "Enter line:"; A\$(L)
LOOP UNTIL A\$(L) = "END"
L = L - 1
'
FOR I = 1 TO L
' Determine if first variable is new or old
V\$ = LEFT\$(A\$(I), 1)
POSV = INSTR(ALLV\$, V\$)
IF POSV = 0 THEN
ALLV\$ = ALLV\$ + V\$
POSV = LEN(ALLV\$)
END IF
'
' Assign value for first number
CH\$ = MID\$(A\$(I), 3, 1)
IF CH\$ >= "0" AND CH\$ <= "9" THEN
NUM1 = VAL(CH\$)
ELSE
POSV2 = INSTR(ALLV\$, CH\$)
NUM1 = B(POSV2)
END IF
'
IF LEN(A\$(I)) = 3 THEN
' Assign first number to current variable
B(POSV) = NUM1
ELSE
' Assign value for second number
CH\$ = RIGHT\$(A\$(I), 1)
IF CH\$ >= "0" AND CH\$ <= "9" THEN
NUM2 = VAL(CH\$)
ELSE
POSV3 = INSTR(ALLV\$, CH\$)
NUM2 = B(POSV3)
END IF
' Perform operation with 1st and 2nd num and place in var
OP\$ = MID\$(A\$(I), 4, 1)
SELECT CASE OP\$
CASE "+": B(POSV) = NUM1 + NUM2
CASE "-": B(POSV) = NUM1 - NUM2
CASE "*": B(POSV) = NUM1 * NUM2
CASE "/": B(POSV) = NUM1 / NUM2
END SELECT
END IF
NEXT I
' Display the variables in order of appearance with values
FOR I = 1 TO LEN(ALLV\$)
PRINT MID\$(ALLV\$, I, 1); "=";
PRINT LTRIM\$(STR\$(B(I)))
NEXT I

'3.7
' This program finds three 3-digit primes having digits 1-9.
'
' Generate primes into A()
DEFINT B-Z: DEFLNG A: DIM A(200)
FOR I = 101 TO 997 STEP 2
J = 3: PRIME = -1
WHILE (J <= SQR(I)) AND PRIME
IF I MOD J = 0 THEN PRIME = 0
J = J + 2
WEND
IF PRIME THEN  'Ensure that Digits are unique and not 0
H = INT(I / 100)
T = INT((I - H * 100) / 10)
ONE = I - H * 100 - T * 10
IF T > 0 AND H <> T AND T <> ONE AND H <> ONE THEN
P = P + 1: A(P) = I
END IF
END IF
NEXT I
' Add the different combinations of 3 primes
FOR I = 1 TO P - 2
FOR J = I + 1 TO P - 1
FOR K = J + 1 TO P
SUM = A(I) + A(J) + A(K)
' Check if SUM has 4 digits in ascending order
IF SUM >= 1234 THEN
DIGITS\$ = LTRIM\$(STR\$(SUM)): GOOD = -1: L = 1
DO
IF MID\$(DIGITS\$, L, 1) >= MID\$(DIGITS\$, L + 1, 1) THEN
GOOD = 0
END IF
L = L + 1
LOOP UNTIL (L = 4) OR NOT GOOD
' Check all 3-digit primes for digits 1 through 9
IF GOOD THEN
ADIGITS = (A(I) * 1000 + A(J)) * 1000 + A(K)
DIGITS\$ = LTRIM\$(STR\$((ADIGITS))): L = 1
WHILE (L <= 9) AND GOOD
IF INSTR(DIGITS\$, CHR\$(48 + L)) = 0 THEN GOOD = 0
L = L + 1
WEND
IF GOOD THEN
PRINT A(I); "+"; A(J); "+"; A(K); "="; SUM
PNUM = PNUM + 1: IF PNUM = 7 THEN END
END IF
END IF
END IF
NEXT K
NEXT J
NEXT I

'3.8
' This program will display time MM:SS in block letters.
'
DATA ****     *  ****  ****  *  *  ****  *     ****  ****  ****
DATA *  *     *     *     *  *  *  *     *        *  *  *  *  *
DATA *  *     *  ****  ****  ****  ****  ****     *  ****  ****
DATA *  *     *  *        *     *     *  *  *     *  *  *     *
DATA ****     *  ****  ****     *  ****  ****     *  ****     *
DATA 6,10,6,10, 1,7,18,24
FOR I = 1 TO 5
FOR J = 0 TO 9: A\$(I, J) = MID\$(B\$, J * 6 + 1, 4): NEXT J
NEXT I
FOR I = 1 TO 4: READ MAX(I): NEXT I  'Maximum units for MM:SS
FOR I = 1 TO 4: READ COL(I): NEXT I  'Columns to start blocks
'
INPUT "Enter MM:SS:"; MMSS\$
FOR I = 1 TO 4
DIG(I) = VAL(MID\$(MMSS\$, I - (I > 2), 1))
NEXT I
'
CLS
LOCATE 2, 14: PRINT "*": LOCATE 4, 14: PRINT "*"
DO UNTIL CH\$ <> ""
FOR I = 1 TO 4
FOR J = 1 TO 5
LOCATE J, COL(I): PRINT A\$(J, DIG(I))
NEXT J
NEXT I
DIG(4) = DIG(4) + 1
FOR J = 4 TO 1 STEP -1
IF DIG(J) = MAX(J) THEN
DIG(J - 1) = DIG(J - 1) + 1: DIG(J) = 0
END IF
NEXT J
FOR I = 1 TO 3000: NEXT I  'Approximately 1 second
CH\$ = INKEY\$
LOOP

'3.9
' This program will calculate the area of a polygon room.
'
INPUT "Enter number of sides:"; SIDES
FOR I = 1 TO SIDES
INPUT "Enter movement:"; MOV\$
DIR\$(I) = MID\$(MOV\$, 1, 1)
L = LEN(MOV\$)
MOV\$ = MID\$(MOV\$, 2, L - 1)
DIST(I) = VAL(MOV\$)
' Subtract Down and Left directions
IF DIR\$(I) = "D" OR DIR\$(I) = "L" THEN DIST(I) = -DIST(I)
NEXT I
' Multiply length by width to obtain rectangle area,
' then add or subtract area from overall area.
I = 1: SUM = 0: AREA = 0
WHILE (I <= SIDES)
SUM = SUM + DIST(I)
AREA = AREA + (SUM * DIST(I + 1))
I = I + 2
WEND
PRINT "AREA ="; ABS(AREA); "SQUARE FEET"

'3.10
' This program displays versions of libraries on a graph.
'
INPUT "Enter version #:"; Vers
INPUT "Enter first week in test:"; FirstWk
INPUT "Enter first week to display, # of weeks:"; FWKDisp, WkNum
CLS
LWKDisp = FWKDisp + WkNum - 1
' Display week #s at top (units first, then tens)
PRINT SPACE\$(9);
FOR I = FWKDisp TO LWKDisp
PRINT USING "#"; INT(I / 10);
NEXT I
PRINT : PRINT SPACE\$(9);
FOR I = FWKDisp TO LWKDisp
PRINT USING "#"; I MOD 10;
NEXT I
PRINT : PRINT
LastWk = FirstWk + 17
' Compute # of versions to backup from Vers input
Backup = INT((LastWk - FWKDisp) / 6)
Vers = Vers - Backup
FirstWk = FirstWk - 6 * Backup: LastWk = LastWk - 6 * Backup
DO UNTIL FirstWk > LWKDisp
' Display Version and indent
PRINT "R1V"; RIGHT\$(STR\$(100 + Vers), 2); "L01 ";
IF FWKDisp <= FirstWk THEN
Min = FirstWk
PRINT SPACE\$(FirstWk - FWKDisp);
ELSE
Min = FWKDisp
END IF
IF LWKDisp >= LastWk THEN Max = LastWk ELSE Max = LWKDisp
' Display TestArea of 1 if Vers even, 2 if odd; P = Production
TestArea = (Vers MOD 2) + 1
FOR I = Min TO Max
IF I < FirstWk + 12 THEN
PRINT USING "#"; TestArea;
ELSE
PRINT "P";
END IF
NEXT I
PRINT
' Display Pre-Production Version
FirstPreWk = FirstWk + 5: LastPreWk = FirstWk + 10
IF (LastPreWk >= FWKDisp) AND (FirstPreWk <= LWKDisp) THEN
PRINT "R1V"; RIGHT\$(STR\$(100 + Vers - 1), 2); "L88 ";
IF FirstPreWk > FWKDisp THEN
Min = FirstPreWk
PRINT SPACE\$(FirstPreWk - FWKDisp);
ELSE
Min = FWKDisp
END IF
IF LWKDisp >= LastPreWk THEN
Max = LastPreWk
ELSE
Max = LWKDisp
END IF
PRINT STRING\$(Max - Min + 1, "*")
END IF
FirstWk = FirstWk + 6: LastWk = LastWk + 6
Vers = Vers + 1
LOOP

```