-CHDIR ".\qbasicapps\math\loto"\r
-\r
-\r
-' Lottery analyzer\r
-' made by Svjatoslav Agejenko\r
-' in 2001\r
-' homepage: svjatoslav.eu\r
-' email: svjatoslav@svjatoslav.eu\r
- \r
-DECLARE SUB ennus ()\r
-DECLARE SUB menu ()\r
-DECLARE SUB gr1 ()\r
-DECLARE SUB gr2 ()\r
-DECLARE SUB getson (a$)\r
-DECLARE SUB loaddata ()\r
-DECLARE SUB wai ()\r
-DECLARE SUB gr3 ()\r
+' Program to analyze lottery winning numbers.\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2001, Initial version\r
+' 2024.09, Improved program readability using AI\r
+\r
DEFINT A-Y\r
\r
-DECLARE SUB start ()\r
DIM SHARED mitus, sona$(1 TO 50)\r
DIM SHARED num(1 TO 500, 1 TO 7)\r
DIM SHARED mitun\r
menu\r
\r
SUB ennus\r
-DIM buf(1 TO 48)\r
-PRINT "viimase 10 loosimise ajal:"\r
-\r
-FOR a = mitun - 10 TO mitun\r
-FOR b = 2 TO 7\r
-buf(num(a, b)) = buf(num(a, b)) + 1\r
-NEXT b\r
-NEXT a\r
-\r
-FOR b = 1 TO 6\r
-c = 0\r
-FOR a = 1 TO 48\r
-IF buf(a) > c THEN c = buf(a): d = a\r
-NEXT a\r
-PRINT d; " esines: "; c; " korda"\r
-buf(d) = 0\r
-NEXT b\r
-\r
-PRINT "--------------------------------------"\r
-\r
-FOR a = 1 TO mitun\r
-FOR b = 2 TO 7\r
-buf(num(a, b)) = a\r
-NEXT b\r
-NEXT a\r
-\r
-FOR b = 1 TO 6\r
-c = 30000\r
-FOR a = 1 TO 48\r
-IF buf(a) < c THEN c = buf(a): d = a\r
-NEXT a\r
-PRINT d; " esines viimati: "; mitun - c; " loosimist tagasi"\r
-buf(d) = 30000\r
-NEXT b\r
-\r
+ DIM buf(1 TO 48)\r
+ PRINT "During the last 10 draws:"\r
+\r
+ ' Count occurrences of each number in the last 10 draws\r
+ FOR a = mitun - 10 TO mitun\r
+ FOR b = 2 TO 7\r
+ buf(num(a, b)) = buf(num(a, b)) + 1\r
+ NEXT b\r
+ NEXT a\r
+\r
+ ' Print the most frequent numbers\r
+ FOR b = 1 TO 6\r
+ c = 0\r
+ FOR a = 1 TO 48\r
+ IF buf(a) > c THEN c = buf(a): d = a\r
+ NEXT a\r
+ PRINT d; " appeared: "; c; " times"\r
+ buf(d) = 0\r
+ NEXT b\r
+\r
+ PRINT "--------------------------------------"\r
+\r
+ ' Find when each number last appeared\r
+ FOR a = 1 TO mitun\r
+ FOR b = 2 TO 7\r
+ buf(num(a, b)) = a\r
+ NEXT b\r
+ NEXT a\r
+\r
+ FOR b = 1 TO 6\r
+ c = 30000\r
+ FOR a = 1 TO 48\r
+ IF buf(a) < c THEN c = buf(a): d = a\r
+ NEXT a\r
+ PRINT d; " appeared last time: "; mitun - c; " draws ago"\r
+ buf(d) = 30000\r
+ NEXT b\r
\r
END SUB\r
\r
SUB getson (a$)\r
-mitus = 0\r
-\r
-d = 1\r
-FOR b = 1 TO LEN(a$)\r
-c$ = RIGHT$(LEFT$(a$, b), 1)\r
-IF c$ = " " THEN\r
-d = 1\r
-ELSE\r
-IF d = 1 THEN\r
-mitus = mitus + 1\r
-sona$(mitus) = ""\r
-d = 0\r
-END IF\r
-sona$(mitus) = sona$(mitus) + c$\r
-END IF\r
-NEXT b\r
+ mitus = 0\r
+\r
+ d = 1\r
+ FOR b = 1 TO LEN(a$)\r
+ c$ = RIGHT$(LEFT$(a$, b), 1)\r
+ IF c$ = " " THEN\r
+ d = 1\r
+ ELSE\r
+ IF d = 1 THEN\r
+ mitus = mitus + 1\r
+ sona$(mitus) = ""\r
+ d = 0\r
+ END IF\r
+ sona$(mitus) = sona$(mitus) + c$\r
+ END IF\r
+ NEXT b\r
\r
END SUB\r
\r
SUB gr1\r
-CLS\r
-LINE (0, 0)-(600, 0), 1\r
-LINE (0, 49)-(600, 49), 1\r
-LINE (0, 50)-(600, 50), 1\r
-LINE (0, 48 * 6 + 51)-(600, 48 * 6 + 51), 1\r
-FOR a = 1 TO mitun\r
-c = 0\r
-FOR b = 2 TO 7\r
-c = c + num(a, b)\r
-PSET (a, num(a, b)), 15\r
-NEXT b\r
-LINE (a, c + 50)-(a, 24 * 6 + 50), 10\r
-NEXT a\r
-wai\r
+ CLS\r
+ LINE (0, 0)-(600, 0), 1\r
+ LINE (0, 49)-(600, 49), 1\r
+ LINE (0, 50)-(600, 50), 1\r
+ LINE (0, 48 * 6 + 51)-(600, 48 * 6 + 51), 1\r
+\r
+ ' Draw vertical lines for each draw and plot numbers\r
+ FOR a = 1 TO mitun\r
+ c = 0\r
+ FOR b = 2 TO 7\r
+ c = c + num(a, b)\r
+ PSET (a, num(a, b)), 15\r
+ NEXT b\r
+ LINE (a, c + 50)-(a, 24 * 6 + 50), 10\r
+ NEXT a\r
+\r
+ wai\r
END SUB\r
\r
SUB gr2\r
-CLS\r
-DIM buf(1 TO 20000)\r
-\r
-FOR x = 1 TO mitun - 1\r
-FOR a = 2 TO 7\r
-LINE (600, num(x, a))-(610, num(x + 1, a)), 3\r
-NEXT a\r
-LINE (600, 1)-(600, 48), 1\r
-SOUND 0, 2\r
-GET (10, 1)-(610, 50), buf(1)\r
-PUT (1, 1), buf(1), PSET\r
-LINE (601, 1)-(610, 50), 0, BF\r
-IF INKEY$ <> "" GOTO 5\r
-NEXT x\r
-wai\r
-5\r
+ CLS\r
+ DIM buf(1 TO 20000)\r
+\r
+ ' Draw lines connecting consecutive lottery numbers\r
+ FOR x = 1 TO mitun - 1\r
+ FOR a = 2 TO 7\r
+ LINE (600, num(x, a))-(610, num(x + 1, a)), 3\r
+ NEXT a\r
+ LINE (600, 1)-(600, 48), 1\r
+ SOUND 0, 2\r
+\r
+ ' Scroll the screen to the left\r
+ GET (10, 1)-(610, 50), buf(1)\r
+ PUT (1, 1), buf(1), PSET\r
+ LINE (601, 1)-(610, 50), 0, BF\r
+\r
+ IF INKEY$ <> "" GOTO 5\r
+ NEXT x\r
+\r
+ wai\r
+ 5\r
END SUB\r
\r
SUB gr3\r
-CLS\r
-PAINT (1, 1), 3\r
-DIM buf(1 TO 48)\r
-DIM buf2(1 TO 20000)\r
-c = 0\r
-\r
-FOR a = 1 TO mitun\r
-FOR b = 1 TO 48\r
-buf(b) = 0\r
-NEXT b\r
-\r
-FOR b = 2 TO 7\r
-buf(num(a, b)) = 10\r
-NEXT b\r
-\r
-FOR b = 1 TO 48\r
-c = c + 1\r
-buf2(c) = buf(b)\r
-NEXT b\r
-NEXT a\r
-\r
-FOR e = 2 TO 400\r
-d = 0\r
-FOR x = 1 TO 639\r
-FOR y = 1 TO e\r
-d = d + 1\r
-IF d > c THEN GOTO 4\r
-PSET (x, y), buf2(d)\r
-NEXT y\r
-NEXT x\r
-4\r
-LINE (x + 1, 1)-(x + 1, e), 14\r
-LINE (x + 1, y)-(x + 4, y), 12\r
-IF INKEY$ <> "" THEN GOTO 6\r
-NEXT e\r
-wai\r
-6\r
+ CLS\r
+ PAINT (1, 1), 3\r
+ DIM buf(1 TO 48)\r
+ DIM buf2(1 TO 20000)\r
+\r
+ c = 0\r
+\r
+ ' Prepare data for drawing\r
+ FOR a = 1 TO mitun\r
+ FOR b = 1 TO 48\r
+ buf(b) = 0\r
+ NEXT b\r
+\r
+ FOR b = 2 TO 7\r
+ buf(num(a, b)) = 10\r
+ NEXT b\r
+\r
+ FOR b = 1 TO 48\r
+ c = c + 1\r
+ buf2(c) = buf(b)\r
+ NEXT b\r
+ NEXT a\r
+\r
+ ' Draw the graph\r
+ FOR e = 2 TO 400\r
+ d = 0\r
+ FOR x = 1 TO 639\r
+ FOR y = 1 TO e\r
+ d = d + 1\r
+ IF d > c THEN GOTO 4\r
+ PSET (x, y), buf2(d)\r
+ NEXT y\r
+ NEXT x\r
+ 4\r
+\r
+ LINE (x + 1, 1)-(x + 1, e), 14\r
+ LINE (x + 1, y)-(x + 4, y), 12\r
+\r
+ IF INKEY$ <> "" THEN GOTO 6\r
+ NEXT e\r
+\r
+ wai\r
+ 6\r
END SUB\r
\r
SUB loaddata\r
-PRINT "�ks hetk ...."\r
-\r
-mitun = 0\r
-OPEN "loos.txt" FOR INPUT AS #1\r
-1\r
-IF EOF(1) <> 0 THEN GOTO 2\r
-LINE INPUT #1, a$\r
-getson a$\r
-mitun = mitun + 1\r
-FOR b = 1 TO 7\r
-num(mitun, b) = VAL(sona$(b))\r
-NEXT b\r
-GOTO 1\r
-2\r
-CLOSE #1\r
-\r
-CLS\r
+ PRINT "One moment..."\r
+\r
+ mitun = 0\r
+ OPEN "loos.txt" FOR INPUT AS #1\r
+\r
+ 1\r
+ IF EOF(1) <> 0 THEN GOTO 2\r
+\r
+ LINE INPUT #1, a$\r
+ getson a$\r
+\r
+ mitun = mitun + 1\r
+\r
+ ' Parse and store lottery numbers\r
+ FOR b = 1 TO 7\r
+ num(mitun, b) = VAL(sona$(b))\r
+ NEXT b\r
+\r
+ GOTO 1\r
+\r
+ 2\r
+ CLOSE #1\r
+\r
+ CLS\r
END SUB\r
\r
SUB menu\r
3\r
-CLS\r
+ CLS\r
+\r
7\r
-LOCATE 1, 1\r
-PRINT " Viking loto statistika anal��s"\r
-PRINT "1 - t�ppgraaf"\r
-PRINT "2 - joongraaf"\r
-PRINT "3 - sobitus"\r
-PRINT "4 - statistika"\r
-PRINT "5 - v�lja"\r
-a$ = INPUT$(1)\r
-\r
-IF a$ = "1" THEN gr1\r
-IF a$ = "2" THEN gr2\r
-IF a$ = "3" THEN gr3\r
-IF a$ = "4" THEN ennus: GOTO 7\r
-IF a$ = "5" THEN SYSTEM\r
-GOTO 3\r
+ LOCATE 1, 1\r
+\r
+ PRINT " Lottery statistics analysis"\r
+\r
+ PRINT "1 - Dot graph"\r
+ PRINT "2 - Line graph"\r
+ PRINT "3 - Combinatorics"\r
+ PRINT "4 - Statistics"\r
+ PRINT "5 - Exit program"\r
+\r
+ a$ = INPUT$(1)\r
+\r
+ IF a$ = "1" THEN gr1\r
+ IF a$ = "2" THEN gr2\r
+ IF a$ = "3" THEN gr3\r
+ IF a$ = "4" THEN ennus: GOTO 7\r
+ IF a$ = "5" THEN SYSTEM\r
+\r
+ GOTO 3\r
\r
END SUB\r
\r
SUB start\r
-SCREEN 12\r
+ SCREEN 12\r
\r
END SUB\r
\r
SUB wai\r
-a$ = INPUT$(1)\r
-END SUB\r
+ a$ = INPUT$(1)\r
\r
+END SUB\r
-' Material simulation, simulates shockwaves propagation in gas.\r
-' made by Svjatoslav Agejenko\r
-' in 2003\r
-' homepage: svjatoslav.eu\r
-' email: svjatoslav@svjatoslav.eu\r
- \r
-DECLARE SUB saveit ()\r
-DECLARE SUB playit ()\r
-DECLARE SUB frmget ()\r
-DECLARE SUB frmsav ()\r
-DECLARE SUB spot (x!, y!, p!)\r
-DECLARE SUB lin (x1!, y1!, x2!, y2!)\r
-DECLARE SUB disp ()\r
-DECLARE SUB start ()\r
-DIM SHARED wal\r
-wal = 9980\r
+' Program to simulate shock waves propagation in gas.\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003, Initial version\r
+' 2024.09, Improved program readability using AI\r
+\r
+DECLARE SUB saveit()\r
+DECLARE SUB playit()\r
+DECLARE SUB frmget()\r
+DECLARE SUB frmsav()\r
+DECLARE SUB spot(x!, y!, p!)\r
+DECLARE SUB lin(x1!, y1!, x2!, y2!)\r
+DECLARE SUB disp()\r
+DECLARE SUB start()\r
+DIM SHARED wall\r
+wall = 9980\r
\r
DIM SHARED press(1 TO 100, 1 TO 100)\r
DIM SHARED spdx(1 TO 100, 1 TO 100)\r
\r
OPEN "tst.an0" FOR BINARY AS #1\r
\r
-\r
start\r
\r
1\r
\r
FOR y = 2 TO 99\r
FOR x = 2 TO 99\r
- IF press(x, y) = wal THEN spdx(x - 1, y) = 0: spdy(x, y - 1) = 0: spdx(x, y) = 0: spdy(x, y) = 0: GOTO 3\r
- spdy(x, y) = spdy(x, y) - (press(x, y) / 500) ' gravitation\r
+ IF press(x, y) = wall THEN\r
+ spdx(x - 1, y) = 0\r
+ spdy(x, y - 1) = 0\r
+ spdx(x, y) = 0\r
+ spdy(x, y) = 0\r
+ GOTO 3\r
+ END IF\r
+\r
+ ' Apply gravitation\r
+ spdy(x, y) = spdy(x, y) - (press(x, y) / 500)\r
+\r
+ IF press(x + 1, y) = wall THEN\r
+ spdx(x, y) = 0\r
+ GOTO 2\r
+ END IF\r
\r
- IF press(x + 1, y) = wal THEN spdx(x, y) = 0: GOTO 2\r
+ ' Calculate x-direction speed\r
spdx(x, y) = (press(x + 1, y) - press(x, y)) / 20 + spdx(x, y)\r
2\r
- IF press(x, y + 1) = wal THEN spdy(x, y) = 0: GOTO 3\r
+\r
+ IF press(x, y + 1) = wall THEN\r
+ spdy(x, y) = 0\r
+ GOTO 3\r
+ END IF\r
+\r
+ ' Calculate y-direction speed\r
spdy(x, y) = (press(x, y + 1) - press(x, y)) / 20 + spdy(x, y)\r
3\r
NEXT x\r
NEXT y\r
\r
-\r
4\r
b = 0\r
FOR y = 2 TO 99\r
a = press(x, y) + spdx(x, y) + spdy(x, y) - spdx(x - 1, y) - spdy(x, y - 1)\r
\r
IF a = 0 OR ((a < 0) AND (a > -.0001)) THEN\r
- IF spdx(x, y) < 0 THEN spdx(x, y) = 0\r
- IF spdy(x, y) < 0 THEN spdy(x, y) = 0\r
- IF spdx(x - 1, y) > 0 THEN spdx(x - 1, y) = 0\r
- IF spdy(x, y - 1) > 0 THEN spdy(x, y - 1) = 0\r
+ IF spdx(x, y) < 0 THEN\r
+ spdx(x, y) = 0\r
+ END IF\r
+\r
+ IF spdy(x, y) < 0 THEN\r
+ spdy(x, y) = 0\r
+ END IF\r
+\r
+ IF spdx(x - 1, y) > 0 THEN\r
+ spdx(x - 1, y) = 0\r
+ END IF\r
+\r
+ IF spdy(x, y - 1) > 0 THEN\r
+ spdy(x, y - 1) = 0\r
+ END IF\r
END IF\r
\r
IF a < 0 THEN\r
- IF spdx(x, y) < 0 THEN spdx(x, y) = spdx(x, y) / 1.5\r
- IF spdy(x, y) < 0 THEN spdy(x, y) = spdy(x, y) / 1.5\r
- IF spdx(x - 1, y) > 0 THEN spdx(x - 1, y) = spdx(x - 1, y) / 1.5\r
- IF spdy(x, y - 1) > 0 THEN spdy(x, y - 1) = spdy(x, y - 1) / 1.5\r
+ IF spdx(x, y) < 0 THEN\r
+ spdx(x, y) = spdx(x, y) / 1.5\r
+ END IF\r
+\r
+ IF spdy(x, y) < 0 THEN\r
+ spdy(x, y) = spdy(x, y) / 1.5\r
+ END IF\r
+\r
+ IF spdx(x - 1, y) > 0 THEN\r
+ spdx(x - 1, y) = spdx(x - 1, y) / 1.5\r
+ END IF\r
+\r
+ IF spdy(x, y - 1) > 0 THEN\r
+ spdy(x, y - 1) = spdy(x, y - 1) / 1.5\r
+ END IF\r
+\r
b = 1\r
+\r
+ ' Display negative pressure\r
LOCATE 20, 1\r
PRINT a\r
END IF\r
\r
FOR y = 2 TO 99\r
FOR x = 2 TO 99\r
- IF spdx(x, y) > 0 THEN spdxp(x - 1, y) = ((press(x, y) * spdx(x - 1, y)) + (spdx(x, y) * spdx(x, y))) / (press(x, y) + spdx(x, y)) - spdx(x - 1, y)\r
- IF spdy(x, y) > 0 THEN spdyp(x, y - 1) = ((press(x, y) * spdy(x, y - 1)) + (spdy(x, y) * spdy(x, y))) / (press(x, y) + spdy(x, y)) - spdy(x, y - 1)\r
- IF spdx(x - 1, y) < 0 THEN spdxp(x, y) = ((press(x, y) * spdx(x, y)) - (spdx(x - 1, y) * spdx(x - 1, y))) / (press(x, y) - spdx(x - 1, y)) - spdx(x, y)\r
- IF spdy(x, y - 1) < 0 THEN spdyp(x, y) = ((press(x, y) * spdy(x, y)) - (spdy(x, y - 1) * spdy(x, y - 1))) / (press(x, y) - spdy(x, y - 1)) - spdy(x, y)\r
+ ' Update pressure based on speed\r
+ IF spdx(x, y) > 0 THEN\r
+ spdxp(x - 1, y) = ((press(x, y) * spdx(x - 1, y)) + (spdx(x, y) * spdx(x, y))) /\r
+ (press(x, y) + spdx(x, y)) - spdx(x - 1, y)\r
+ END IF\r
+\r
+ IF spdy(x, y) > 0 THEN\r
+ spdyp(x, y - 1) = ((press(x, y) * spdy(x, y - 1)) + (spdy(x, y) * spdy(x, y))) /\r
+ (press(x, y) + spdy(x, y)) - spdy(x, y - 1)\r
+ END IF\r
+\r
+ ' Handle negative speeds\r
+ IF spdx(x - 1, y) < 0 THEN\r
+ spdxp(x, y) = ((press(x, y) * spdx(x, y)) - (spdx(x - 1, y) * spdx(x - 1, y))) /\r
+ (press(x, y) - spdx(x - 1, y)) - spdx(x, y)\r
+ END IF\r
+\r
+ IF spdy(x, y - 1) < 0 THEN\r
+ spdyp(x, y) = ((press(x, y) * spdy(x, y)) - (spdy(x, y - 1) * spdy(x, y - 1))) /\r
+ (press(x, y) - spdy(x, y - 1)) - spdy(x, y)\r
+ END IF\r
NEXT x\r
NEXT y\r
\r
-\r
FOR y = 2 TO 99\r
FOR x = 2 TO 99\r
+ ' Update pressure based on speed\r
press(x + 1, y) = press(x + 1, y) - spdx(x, y)\r
press(x, y + 1) = press(x, y + 1) - spdy(x, y)\r
press(x, y) = press(x, y) + spdx(x, y)\r
\r
FOR y = 2 TO 99\r
FOR x = 2 TO 99\r
+ ' Update speed based on previous speed\r
spdx(x, y) = spdx(x, y) + spdxp(x, y)\r
spdxp(x, y) = 0\r
spdy(x, y) = spdy(x, y) + spdyp(x, y)\r
NEXT x\r
NEXT y\r
\r
-\r
FOR y = 1 TO 100\r
FOR x = 1 TO 100\r
+ ' Draw pixel based on pressure\r
PSET (x, y), press(x, y) + 16\r
NEXT x\r
NEXT y\r
\r
saveit\r
\r
-\r
-\r
-\r
GOTO 1\r
\r
CLOSE #1\r
SUB disp\r
FOR y = 47 TO 53\r
FOR x = 47 TO 53\r
+ ' Display pressure values in a grid\r
LOCATE y - 46, (x - 46) * 4\r
PRINT press(x, y)\r
NEXT x\r
\r
END SUB\r
\r
-SUB lin (x1, y1, x2, y2)\r
+SUB lin(x1, y1, x2, y2)\r
\r
m = ABS(x1 - x2)\r
m1 = ABS(y1 - y2)\r
-IF m1 > m THEN m = m1\r
+IF m1 > m THEN\r
+ m = m1\r
+END IF\r
\r
+' Calculate line coordinates\r
x3 = x2 - x1\r
y3 = y2 - y1\r
\r
FOR a = 0 TO m\r
+ ' Interpolate points along the line\r
x5 = x3 * a / m + x1\r
y5 = y3 * a / m + y1\r
- press(x5, y5) = wal\r
-NEXT a\r
\r
+ ' Set pressure to wall value\r
+ press(x5, y5) = wall\r
+NEXT a\r
\r
END SUB\r
\r
SUB saveit\r
FOR y = 1 TO 100\r
a$ = ""\r
+\r
FOR x = 1 TO 100\r
+ ' Save pixel color as string\r
a$ = a$ + CHR$(POINT(x, y))\r
NEXT x\r
+\r
linb = a$\r
PUT #1, , linb\r
NEXT y\r
\r
-\r
END SUB\r
\r
-SUB spot (x, y, p)\r
+SUB spot(x, y, p)\r
+' Set pressure to value `p` in a 2x2 area\r
press(x, y) = p\r
press(x + 1, y) = p\r
press(x, y + 1) = p\r
\r
FOR a = 1 TO 100\r
FOR b = 1 TO 100\r
+ ' Initialize pressure and speed variables\r
press(a, b) = 3\r
spdx(a, b) = 0\r
spdy(a, b) = 0\r
\r
FOR y = 30 TO 60\r
FOR x = 10 TO 50\r
+ ' Create initial pressure spots\r
spot x, y, 30\r
NEXT x\r
NEXT y\r
\r
+' Draw boundary lines\r
lin 2, 2, 2, 99\r
lin 99, 2, 99, 99\r
lin 2, 99, 99, 99\r
lin 2, 2, 99, 2\r
\r
FOR x = 5 TO 40 STEP 5\r
+ ' Draw additional lines for testing\r
lin x, 80, x + 50, 80 - x\r
NEXT x\r
\r
END SUB\r
-\r