FLORIDA HIGH SCHOOLS COMPUTING COMPETITION '96 BASIC PROGRAM SOLUTIONS '1.1 ' This program displays a phrase of the form FHSCC '##. ' INPUT "Enter year:"; YEAR$ PRINT "FHSCC '"; MID$(YEAR$, 3, 2) '1.2 ' This program tallies number of frequent flier miles. ' INPUT "Enter X:"; X INPUT "Enter Y:"; Y PRINT X * (1300 + 1300 + 500) + (Y * 5) '1.3 ' This program displays middle letter(s) of a word. ' INPUT "Enter word:"; WORD$ L = LEN(WORD$): M = INT(L / 2) IF L MOD 2 = 0 THEN PRINT MID$(WORD$, M, 1); PRINT MID$(WORD$, M + 1, 1) '1.4 ' This program displays area and perimeter of a rectangle ' INPUT "Enter coordinate 1:"; X1, Y1 INPUT "Enter coordinate 2:"; X2, Y2 AREA = ABS((X1 - X2) * (Y1 - Y2)) PERIM = (ABS(X1 - X2) + ABS(Y1 - Y2)) * 2 PRINT "AREA ="; AREA PRINT "PERIMETER ="; PERIM '1.5 ' This program code-breaks an encrypted secret message. ' INPUT "Enter encryption:"; E$ FOR I = 1 TO LEN(E$) M$ = MID$(E$, I, 1) IF M$ = " " THEN PRINT M$; ELSE PRINT CHR$(ASC("Z") - ASC(M$) + ASC("A")); END IF NEXT I PRINT '1.6 ' This program display number of floors touched by elevator ' DO INPUT "Enter floor:"; FLOOR TOTAL = TOTAL + ABS(FLOOR - LASTFLOOR) IF FLOOR > MAX THEN MAX = FLOOR LASTFLOOR = FLOOR LOOP UNTIL (FLOOR = 0) ' 1 is added for the starting ground floor PRINT "TOTAL FLOORS TOUCHED ="; TOTAL + 1 PRINT "UNIQUE FLOORS TOUCHED ="; MAX + 1 '1.7 ' This program displays a person's ratios for buying a house. ' INPUT "Enter amount of loan:"; LOAN INPUT "Enter amount of debts:"; DEBTS INPUT "Enter amount of income:"; INCOME RATIO1 = (LOAN / INCOME) * 100 RATIO2 = ((LOAN + DEBTS) / INCOME) * 100 PRINT USING "RATIOS = ##.#% / ##.#%"; RATIO1; RATIO2 PRINT "DOES "; IF RATIO1 > 33 OR RATIO2 > 38 THEN PRINT "NOT "; PRINT "QUALIFY" '1.8 ' This program will convert numbers to English or Spanish. ' DATA ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN DATA UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE,DIEZ INPUT "Enter E or S:"; LANG$ INPUT "Enter number:"; NUM IF LANG$ = "S" THEN FOR I = 1 TO 10: READ N$: NEXT I FOR I = 1 TO NUM READ N$ NEXT I PRINT N$ '1.9 ' This program forms a cross from word(s). ' INPUT "Enter word(s):"; W$ L = LEN(W$): M = INT(L / 2) + 1 FOR I = 1 TO L IF I <> M THEN PRINT SPACE$(M - 1); MID$(W$, I, 1) ELSE PRINT W$ END IF NEXT I '1.10 ' This program simulates the PRICE IS RIGHT game. ' INPUT "Enter actual price:"; PRICE INPUT "Enter guesses A, B, C, D"; A(1), A(2), A(3), A(4) MIN = 32000 FOR I = 1 TO 4 IF A(I) <= PRICE THEN DIF = PRICE - A(I) IF DIF < MIN THEN MIN = DIF: INDEX = I END IF NEXT I IF INDEX > 0 THEN PRINT "PERSON "; MID$("ABCD", INDEX, 1) ELSE PRINT "EVERYONE IS OVER" END IF '2.1 ' This program will emulate random dart throws. ' DATA 0,2,4,5,10,20,50 FOR I = 1 TO 7: READ S$(I): NEXT I: PRINT " "; RANDOMIZE TIMER DO X = INT(RND(3) * 7) + 1: THROW = THROW + 1 PRINT S$(X); TOTAL = TOTAL + VAL(S$(X)) IF TOTAL < 100 THEN PRINT ","; LOOP UNTIL TOTAL >= 100 PRINT : PRINT THROW; "THROWS ACHIEVED SCORE OF"; TOTAL: PRINT '2.2 ' This program compresses information to save space. ' INPUT "Enter string:"; S$ FOR I = 1 TO LEN(S$) MD$ = MID$(S$, I, 1) IF MD$ <> "*" THEN IF AST > 0 THEN IF AST = 1 THEN PRINT "*"; ELSE PRINT USING "#"; AST; AST = 0 END IF PRINT MD$; ELSE AST = AST + 1 END IF NEXT I PRINT '2.3 ' This program finds 2 numbers to add to the set 1,3,8. ' A(1) = 1: A(2) = 3: A(3) = 8: N = 3: I = 0 FOR I = 0 TO 999 FOUND = -1 FOR J = 1 TO N NUM = A(J) * I + 1 IF SQR(NUM) - INT(SQR(NUM + .0001)) > .0001 THEN FOUND = 0 NEXT J IF FOUND THEN PRINT I: N = N + 1: A(N) = I: IF N = 5 THEN END END IF NEXT I '2.4 ' This program diplays the LCM of the first N integers. ' DIM A(31): DEFDBL P INPUT "Enter N:"; N FOR I = 2 TO N: A(I) = I: NEXT I ' Produce all the necessary prime factors FOR I = 2 TO N FOR J = I + 1 TO N IF A(J) MOD A(I) = 0 THEN A(J) = A(J) / A(I) NEXT J NEXT I ' PROD = 1 FOR I = 2 TO N: PROD = PROD * A(I): NEXT I PRINT PROD '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 displays the Nth prime in Fibonacci sequence. ' DIM F(99) F(1) = 1: F(2) = 1: F(3) = 2: PNUM = 1: I = 3 INPUT "Enter N:"; N WHILE PNUM < N I = I + 1 F(I) = F(I - 1) + F(I - 2): PRIME = -1 ' Check if Fibonacci # is prime (not divisible by 2 or odd #) IF F(I) MOD 2 = 0 THEN PRIME = 0 IF PRIME THEN FOR J = 3 TO SQR(F(I)) IF F(I) MOD J = 0 THEN PRIME = 0 NEXT J IF PRIME THEN PNUM = PNUM + 1 END IF WEND PRINT F(I) '2.7 ' This program sorts phone bills by zip code and phone #. ' DO N = N + 1 INPUT "Enter phone #, zip:"; P$(N), Z$(N) PZ$(N) = Z$(N) + P$(N) LOOP UNTIL (P$(N) = "0000") AND (Z$(N) = "00000") N = N - 1 FOR I = 1 TO N - 1 FOR J = I + 1 TO N IF PZ$(I) > PZ$(J) THEN SWAP PZ$(I), PZ$(J) SWAP P$(I), P$(J) SWAP Z$(I), Z$(J) END IF NEXT J NEXT I FOR I = 1 TO N: PRINT P$(I): NEXT I '2.8 ' This program will display number of runs of letters. ' INPUT "Enter letters:"; LET$ FOR I = 1 TO LEN(LET$) CH$ = MID$(LET$, I, 1) IF INSTR("ABCDEFGHIJKLM", CH$) > 0 THEN IF HALF2 THEN H2 = H2 + 1: HALF2 = 0 HALF1 = -1 ELSE IF HALF1 THEN H1 = H1 + 1: HALF1 = 0 HALF2 = -1 END IF NEXT I IF HALF1 THEN H1 = H1 + 1 IF HALF2 THEN H2 = H2 + 1 PRINT "RUNS IN 1ST HALF ="; H1 PRINT "RUNS IN 2ND HALF ="; H2 '2.9 ' This program reverses the order of letters in each word. ' INPUT "Enter string:"; S$: S$ = S$ + " " FOR I = 1 TO LEN(S$) MD$ = MID$(S$, I, 1) IF MD$ = " " THEN L = LEN(W$): PAL = -1 FOR J = 1 TO L / 2 IF MID$(W$, J, 1) <> MID$(W$, L - J + 1, 1) THEN PAL = 0 NEXT J IF PAL THEN PRINT STRING$(LEN(W$), "?"); ELSE FOR J = L TO 1 STEP -1: PRINT MID$(W$, J, 1); : NEXT J END IF PRINT " "; : W$ = "" ELSE W$ = W$ + MD$ END IF NEXT I PRINT '2.10 ' This program determines day of week for a given date. ' DIM MONNUM(12) DATA 1,4,4,0,2,5,0,3,6,1,4,6 FOR I = 1 TO 12: READ MONNUM(I): NEXT I INPUT "Enter month, day, year:"; MONTH, DAY, YEAR LAST2 = YEAR MOD 100 SUM = LAST2 + INT(LAST2 / 4) LEAPYEAR = (YEAR MOD 4 = 0) AND (YEAR MOD 100 > 0) LEAPYEAR = LEAPYEAR OR (YEAR MOD 400 = 0) IF (MONTH < 3) AND LEAPYEAR THEN IF MONTH = 2 THEN SUM = SUM + 3 'New Month Number ELSE SUM = SUM + MONNUM(MONTH) END IF SUM = SUM + DAY SELECT CASE YEAR CASE IS < 1800: SUM = SUM + 4 CASE IS < 1900: SUM = SUM + 2 CASE IS < 2000: CASE IS < 2100: SUM = SUM + 6 CASE IS < 2200: SUM = SUM + 4 END SELECT R = SUM MOD 7 DATA SATURDAY,SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY FOR I = 1 TO R + 1: READ D$: NEXT I PRINT D$ '3.1 ' This program displays the appearance of 3-dimensional book. ' INPUT "Enter title 1:"; T1$ INPUT "Enter title 2:"; T2$ IF LEN(T1$) > LEN(T2$) THEN MAX = LEN(T1$): DIF = INT((MAX - LEN(T2$)) / 2) T2$ = SPACE$(DIF) + T2$ + SPACE$(DIF + 1) ELSE MAX = LEN(T2$): DIF = INT((MAX - LEN(T1$)) / 2) T1$ = SPACE$(DIF) + T1$ + SPACE$(DIF + 1) END IF CLS PRINT " /---/!" PRINT " / / !" PRINT " / / !" PRINT " / / !" PRINT "!---! !" FOR ROW = 1 TO MAX PRINT "!"; PRINT MID$(T2$, ROW, 1); " "; PRINT MID$(T1$, ROW, 1); "!"; IF ROW < MAX - 3 THEN PRINT SPACE$(4); "!" ELSE PRINT SPACE$(MAX - ROW + 1); "/" END IF NEXT ROW PRINT "!---!/" '3.2 ' This program produces a prime factors tree. ' DIM P(100) INPUT "Enter number:"; NUM CLS : PRINT TAB(5); NUM LEFT = 5: RIGHT = LEFT + LEN(STR$(NUM)) 'Position of / and \ DO ' Find smallest prime that divides number IF NUM MOD 2 = 0 THEN PR = 2 ELSE PR = 1 DO PR = PR + 2 LOOP UNTIL (NUM MOD PR = 0) END IF DIVIDEND = NUM / PR IF DIVIDEND > 1 THEN PRINT TAB(LEFT); "/"; TAB(RIGHT); "\" LNUM$ = LTRIM$(STR$(PR)): RNUM$ = LTRIM$(STR$(DIVIDEND)) L = LEN(LNUM$): R = LEN(RNUM$) PRINT TAB(LEFT - L); LNUM$; TAB(RIGHT + 1); RNUM$ LEFT = RIGHT: RIGHT = RIGHT + R + 1 END IF NUM = DIVIDEND LOOP UNTIL NUM = 1 '3.3 ' This program simulates a "base four" calculator. ' INPUT "Enter base 4 expression:"; E$: E$ = E$ + "+" SYM$(1) = "+" FOR I = 1 TO LEN(E$) CH$ = MID$(E$, I, 1) IF CH$ = "+" OR CH$ = "-" THEN J = J + 1: NUM$(J) = N$: SYM$(J + 1) = CH$: N$ = "" ELSE N$ = N$ + CH$ END IF NEXT I ' Convert base 4 numbers to base 10 and perform arithmetic FOR I = 1 TO J L = LEN(NUM$(I)): B10 = 0 FOR J = 1 TO L DIG = VAL(MID$(NUM$(I), J, 1)) B10 = B10 + DIG * 4 ^ (L - J) NEXT J IF SYM$(I) = "-" THEN B10 = (-B10) TOTAL = TOTAL + B10 NEXT I ' Convert base 10 number to base 4 IF TOTAL < 0 THEN PRINT "-"; : TOTAL = (-TOTAL) J = INT(LOG(TOTAL) / LOG(4) + .001) FOR I = J TO 0 STEP -1 POW = 4 ^ I X = INT(TOTAL / POW): PRINT USING "#"; X; TOTAL = TOTAL - X * POW NEXT I PRINT '3.4 ' This program calculates contractor's pay = time * rate ' INPUT "Enter pay/hour:"; RATE INPUT "Enter start time:"; ST$ INPUT "Enter finish time:"; FI$ STHOUR = VAL(MID$(ST$, 1, 2)) FIHOUR = VAL(MID$(FI$, 1, 2)) STMIN = VAL(MID$(ST$, 4, 2)) FIMIN = VAL(MID$(FI$, 4, 2)) ' Adjust for 12AM and times from 1PM - 11PM IF STHOUR = 12 THEN IF MID$(ST$, 6, 2) = "AM" THEN STHOUR = STHOUR - 12 ELSE IF MID$(ST$, 6, 2) = "PM" THEN STHOUR = STHOUR + 12 END IF IF FIHOUR = 12 THEN IF MID$(FI$, 6, 2) = "AM" THEN FIHOUR = FIHOUR - 12 ELSE IF MID$(FI$, 6, 2) = "PM" THEN FIHOUR = FIHOUR + 12 END IF ' Adjust for a late starting time and early morning finish IF STHOUR > FIHOUR THEN FIHOUR = FIHOUR + 24 ' Compute difference in time (finish - start) TIME = (FIHOUR - STHOUR) + (FIMIN - STMIN) / 60 ' If more than half of time is outside normal hours (7AM - 5PM) ' then add a shift differential of 10% to rate. IF (7 - STHOUR) + (0 - STMIN) / 60 >= TIME / 2 THEN ' More than half of time is worked before 7AM RATE = RATE * 1.1 END IF IF (FIHOUR - 17) + (FIMIN) / 60 >= TIME / 2 THEN ' More than half of time is worked after 5PM RATE = RATE * 1.1 END IF PRINT USING "$###.##"; TIME * RATE '3.5 ' This program will display the button that leads to the others. ' FOR I = 1 TO 4 INPUT "Enter row:"; ROW$ FOR J = 1 TO 4 N(I, J) = VAL(MID$(ROW$, J * 3 - 2, 1)) D$(I, J) = MID$(ROW$, J * 3 - 1, 1) NEXT J NEXT I FOR I = 1 TO 4 FOR J = 1 TO 4 FOR K = 1 TO 4: FOR L = 1 TO 4: A(K, L) = 0: NEXT L, K R = I: C = J: A(R, C) = -1: PRESS = 1: GOOD = -1 DO SELECT CASE D$(R, C) CASE "D": R = R + N(R, C) CASE "U": R = R - N(R, C) CASE "L": C = C - N(R, C) CASE "R": C = C + N(R, C) END SELECT IF A(R, C) THEN GOOD = 0 ELSE A(R, C) = -1: PRESS = PRESS + 1 END IF LOOP UNTIL (NOT GOOD) OR (PRESS = 16) IF PRESS = 16 THEN PRINT USING "FIRST BUTTON = #"; N(I, J); : PRINT D$(I, J) PRINT "AT ROW = "; : PRINT USING "#"; I; PRINT USING ", COL = #"; J: END END IF NEXT J NEXT I '3.6 ' This program will generate odd size magic squares. ' INPUT "Enter order, first number, increment: "; N, FIRST, INC DIM A(N, N) X = 1: Y = (N + 1) / 2: A(X, Y) = FIRST FOR I = 2 TO N * N X = X - 1: Y = Y + 1 IF X = 0 THEN X = N IF Y > N THEN Y = 1 IF A(X, Y) = 0 THEN A(X, Y) = FIRST + INC * (I - 1) ELSE X = X + 2: Y = Y - 1 IF X > N THEN X = X - N IF Y = 0 THEN Y = N A(X, Y) = FIRST + INC * (I - 1) END IF NEXT I ' Display Magic Number and Square FOR I = 1 TO N: MAGICNUM = MAGICNUM + A(I, 1): NEXT I PRINT "MAGIC NUMBER ="; MAGICNUM FOR I = 1 TO N FOR J = 1 TO N PRINT USING "####"; A(I, J); NEXT J: PRINT NEXT I '3.7 ' This program will generate 6x6 magic squares. ' INPUT "Enter first number, increment: "; FIRSTN, INC ' Four 3x3 squares are made for the 6x6 matrix B() ' upper-left, bottom-right, upper-right, bottom-left DATA 0,0, 1,1, 0,1, 1,0 FOR SQ = 0 TO 3 FIRST = FIRSTN + SQ * 9 * INC GOSUB Generate3x3 READ R, C FOR I = 1 TO 3 FOR J = 1 TO 3 B(R * 3 + I, C * 3 + J) = A(I, J) NEXT J NEXT I NEXT SQ ' Transpose three cells SWAP B(1, 1), B(4, 1) SWAP B(2, 2), B(5, 2) SWAP B(3, 1), B(6, 1) ' Display 6x6 matrix FOR I = 1 TO 6: MAGICNUM = MAGICNUM + B(I, 1): NEXT I PRINT "MAGIC NUMBER ="; MAGICNUM FOR I = 1 TO 6 FOR J = 1 TO 6 PRINT USING "####"; B(I, J); NEXT J: PRINT NEXT I END Generate3x3: 'Generate a 3x3 magic square in A(1..3,1..3) FOR I = 1 TO 3: FOR J = 1 TO 3: A(I, J) = 0: NEXT J, I N = 3 X = 1: Y = (N + 1) / 2: A(X, Y) = FIRST FOR I = 2 TO N * N X = X - 1: Y = Y + 1 IF X = 0 THEN X = N IF Y > N THEN Y = 1 IF A(X, Y) = 0 THEN A(X, Y) = FIRST + INC * (I - 1) ELSE X = X + 2: Y = Y - 1 IF X > N THEN X = X - N IF Y = 0 THEN Y = N A(X, Y) = FIRST + INC * (I - 1) END IF NEXT I RETURN '3.8 ' This program will display a pie graph. ' DIM A(21, 21) INPUT "Enter 3 percentages: "; P(1), P(2), P(3) A$(1) = "A": A$(2) = "D": A$(3) = "N" CLS : PI = 3.14159 ' Draw circle FOR I = -PI / 2 TO 3 / 2 * PI STEP .1 X = COS(I) * 10: Y = SIN(I) * 10 LOCATE 11 + Y, 11 + X: PRINT "*": A(11 + Y, 11 + X) = 1 NEXT I ' Draw 3 line segments from center FOR S = 0 TO 2 SUM = SUM + P(S) I = -PI / 2 + 2 * PI * SUM / 100 FOR R = 0 TO 10 X = COS(I) * R: Y = SIN(I) * R LOCATE 11 + Y, 11 + X: PRINT "*": A(11 + Y, 11 + X) = 1 NEXT R NEXT S A$ = INPUT$(1): SUM = 0 ' Fill regions with letters FOR S = 1 TO 3 LSUM = SUM: SUM = SUM + P(S) FOR L = LSUM TO SUM I = -PI / 2 + 2 * PI * L / 100 FOR R = 1 TO 9 X = COS(I) * R: Y = SIN(I) * R IF A(11 + Y, 11 + X) = 0 THEN LOCATE 11 + Y, 11 + X: PRINT A$(S) END IF NEXT R NEXT L NEXT S '3.9 ' This program produces a precedence of jobs to run. ' INPUT "Enter number of dependencies:"; NUM FOR I = 1 TO NUM INPUT "Enter dependency:"; DEP$: DEP$ = DEP$ + " " A$(I) = MID$(DEP$, 1, 3) B$(I) = MID$(DEP$, 4, 3) ' Store unique jobs in string IF INSTR(U$, A$(I)) = 0 THEN U$ = U$ + A$(I) IF INSTR(U$, B$(I)) = 0 THEN U$ = U$ + B$(I) NEXT I ' Since there is a unique order for all the jobs, ' every job will have its successor somewhere in B(). ' 1) search all B() for the only job missing. ' 2) exclude all dependencies with this job in it. ' 3) search all B() for the next only job missing. ' 4) repeat steps 2 and 3 until the final dependency is left. L = LEN(U$): UNUM = L / 3: U2$ = U$: DEPLEFT = NUM: JOBS$ = "" WHILE DEPLEFT > 1 FOR I = 1 TO NUM: MARKED(I) = 0: NEXT I FOR I = 1 TO NUM P = INSTR(U2$, B$(I)) IF P > 0 THEN MARKED((P + 2) / 3) = -1 NEXT I NOJOB = -1: I = 0 WHILE NOJOB AND (I < UNUM) I = I + 1: ST = I * 3 - 2 JOB$ = MID$(U2$, ST, 3) VALIDJOB = (INSTR(JOBS$, JOB$) = 0) AND (JOB$ <> SPACE$(3)) IF VALIDJOB AND NOT MARKED(I) THEN JOBS$ = JOBS$ + JOB$ FOR K = 1 TO NUM IF A$(K) = JOB$ THEN A$(K) = "*": B$(K) = "*" DEPLEFT = DEPLEFT - 1 END IF NEXT K NEWU2$ = MID$(U2$, 1, ST - 1) + SPACE$(3) U2$ = NEWU2$ + MID$(U2$, ST + 3, L - ST - 2) NOJOB = 0 END IF WEND WEND ' Last dependency is concatenated FOR I = 1 TO NUM IF A$(I) <> "*" THEN JOBS$ = JOBS$ + A$(I) + B$(I) NEXT I PRINT "JOBS MUST BE RUN IN THIS ORDER: "; JOBS$ '3.10 ' This program finds a perfect square with digits 1-9. ' DEFINT B, Z: DEFLNG A, N: MIN = 9 FOR NUM = 10001 TO INT(SQR(987654321)) A = NUM * NUM DIGITS$ = LTRIM$(STR$(A)) GOOD = -1: L = 1 WHILE (L <= 9) AND GOOD IF INSTR(DIGITS$, CHR$(48 + L)) = 0 THEN GOOD = 0 L = L + 1 WEND IF GOOD THEN 'Found perfect square with unique digits GOSUB CheckDigits 'Count will contain number of swaps made IF COUNT < MIN THEN MIN = COUNT: NUMMIN = A: NUMMIN2 = NUM END IF NEXT NUM ' Display the perfect square needing least number of swaps DIGITS$ = LTRIM$(STR$(NUMMIN)) PRINT DIGITS$; " IS THE SQUARE OF"; NUMMIN2 PRINT "AND WAS FORMED BY EXCHANGING"; MIN; "PAIRS OF DIGITS" END CheckDigits: 'Determine number of swaps made and store in count FOR I = 1 TO 9: A(I) = VAL(MID$(DIGITS$, I, 1)): NEXT I COUNT = 0 FOR I = 1 TO 9 IF A(I) <> I THEN J = I + 1 WHILE J < 9 AND A(J) <> I J = J + 1 WEND SWAP A(I), A(J): COUNT = COUNT + 1 END IF NEXT I RETURN