Some days ago, I came across a post on the BASIC programming language Facebook group about a challenge announced on the Liberty BASIC community forum. The objective is to create a program for solving the following mathematical puzzle:
There was a box of apples and pears. Some are big, some are small; some are yellow, rest are green. There are no small pears and no small green apples. Some numbers are given: 25 Apples, 17 pears 32 big fruits 28 yellow ones. There are two more green apples then green pears. Find the number of big yellow apples.
The problem can be represented with a linear system with 5 equations involving 5 variables, which can be solved by means of well-known mathematical algorithms (I might have implemented some when I was a student). However, in this case I decided to have some fun implementing a brute force algorithm in Tiny BASIC. The program listing is reported below:
1 REM ********************
2 REM * APPLES AND PEARS *
3 REM ********************
4 REM BRUTE FORCE TINYBASIC IMPLEMENTATION
5 REM BY MARCO'S RETROBITS
6 REM RETROBITS.ALTERVISTA.ORG
7 REM PLEASE TAKE A SEAT, THIS COULD BE SLOW
8 REM ********************
10 REM THERE WAS A BOX OF APPLES AND PEARS
11 REM SOME ARE BIG, SOME ARE SMALL;
12 REM SOME ARE YELLOW, REST ARE GREEN
13 REM THERE ARE NO SMALL PEARS
14 REM AND NO SMALL GREEN APPLES.
15 REM SOME NUMBERS ARE GIVEN:
16 REM 25 APPLES, 17 PEARS
17 REM 32 BIG FRUITS
18 REM 28 YELLOW ONES.
19 REM THERE ARE TWO MORE GREEN APPLES THAN GREEN PEARS.
20 REM FIND THE NUMBER OF BIG YELLOW APPLES.
30 REM C: SMALL YELLOW APPLES
40 REM D: BIG YELLOW APPLES
50 REM E: BIG GREEN APPLES
60 REM F: BIG YELLOW PEARS
70 REM G: BIG GREEN PEARS
80 REM A: APPLES; P: PEARS
90 REM B: BIG FRUITS; Y: YELLOW ONES
100 LET A = 25
110 LET P = 17
120 LET B = 32
130 LET Y = 28
200 REM FOR C = 1 TO A
201 LET C=1
210 REM FOR D = 1 TO A-C
211 LET D = 1
220 REM FOR E = 1 TO A-C-D
221 LET E = 1
230 REM FOR F = 1 TO P
231 LET F = 1
240 REM FOR G = 1 TO P-F
241 LET G = 1
250 GOSUB 2000
260 IF S = 0 THEN GOTO 460
270 PRINT "SOLVED!"
280 PRINT "SMALL YELLOW APPLES:", C
290 PRINT "BIG YELLOW APPLES:", D, "*"
300 PRINT "BIG GREEN APPLES:", E
310 PRINT "BIG YELLOW PEARS:", F
320 PRINT "BIG GREEN PEARS:", G
400 END
460 REM NEXT G
461 LET G = G+1
462 IF G <= P-F THEN GOTO 250
470 REM NEXT F
471 LET F = F+1
472 IF F <= P THEN GOTO 240
480 REM NEXT E
481 LET E = E+1
482 IF E <= A-C-D THEN GOTO 230
490 REM NEXT D
491 LET D = D+1
492 IF D <= A-C THEN GOTO 220
500 REM NEXT C
501 LET C = C+1
502 IF C <= A THEN GOTO 210
510 PRINT "NO SOLUTION!"
520 END
1990 REM ** CHECK ROUTINE **
2000 LET S = 0
2001 REM PRINT C, D, E, F, G
2010 REM 25 APPLES, 17 PEARS
2020 IF C + D + E <> A THEN RETURN
2030 IF F + G <> P THEN RETURN
2040 REM 32 BIG FRUITS
2050 IF D + E + F + G <> B THEN RETURN
2060 REM 28 YELLOW ONES
2070 IF C + D + F <> Y THEN RETURN
2080 REM THERE ARE TWO MORE GREEN APPLES THAN GREEN PEARS
2090 IF E <> G + 2 THEN RETURN
2100 REM ** SOLVED! **
2110 LET S = 1
2990 RETURN
The firtst thing that emerges from the listing is the lack of FOR..NEXT loops in Tiny BASIC (I always forget about that!). This is not a big deal, since they can be replaced with (less elegant) IFs and GOTOs. Another limitation of this dialect is that variable names can only consist of a capital letter.
I ran the “Apples and Pears” program on TinyBasicBlazor, my Tiny BASIC environment for web browsers based on TinyBasic.NET and described in this post; it took more than half an hour to find the solution (I must check why)! With the console version of TinyBasic.NET, the problem is solved in a few seconds.
I almost forgot: there are 7 big yellow apples!
SMALL YELLOW APPLES: 10
BIG YELLOW APPLES: 7 *
BIG GREEN APPLES: 8
BIG YELLOW PEARS: 11
BIG GREEN PEARS: 6