Part 1 ez, part 2 was pain but theoretically works on a C64

Part 2 takes about 2 seconds per iteration and needs to
do 46857582 iterations.

From what ive tested everything else works and the C64 is
capable of decrementing 46857582 so the loop should finish
successfully... eventually...
This commit is contained in:
Thomas Muller 2024-06-20 23:32:52 -04:00
parent cfd74a292a
commit fce178d777
8 changed files with 101 additions and 0 deletions

1
day_6/answer1 Normal file
View file

@ -0,0 +1 @@
1108800

1
day_6/answer2 Normal file
View file

@ -0,0 +1 @@
36919753

2
day_6/hint1 Normal file
View file

@ -0,0 +1,2 @@
Time: 7 15 30
Distance: 9 40 200

3
day_6/input1 Normal file
View file

@ -0,0 +1,3 @@
Time: 46 85 75 82
Distance: 208 1412 1257 1410

3
day_6/input2 Normal file
View file

@ -0,0 +1,3 @@
Time: 46857582
Distance: 208141212571410

4
day_6/notes Normal file
View file

@ -0,0 +1,4 @@
2000 - num_to_digit_stream(N) -> NS, D
2500 - modulo(A, B) -> M
3000 - bigmult(NA[], DA, NB[], DB) -> PR[], DP
3500 - biggt(NA[], DA, WD[], DW) -> G

14
day_6/part1.bas Normal file
View file

@ -0,0 +1,14 @@
0 ACCUM = 1
100 INPUT "TIME"; TIME%
101 IF TIME% = -1 THEN GOTO 1000
110 INPUT "DIST"; DIST%
199 WINS% = 0
200 FOR I=0 TO TIME%
210 CALCDIST% = (TIME% - I) * I
211 REM PRINT CALCDIST%
220 IF CALCDIST% > DIST% THEN WINS% = WINS% + 1
300 NEXT I
301 REM PRINT WINS%
310 ACCUM = ACCUM * WINS%
900 GOTO 100
1000 PRINT ACCUM

73
day_6/part2.bas Normal file
View file

@ -0,0 +1,73 @@
0 DIM WD(20)
1 DIM NA(20)
2 DIM NB(20)
3 DIM PR(20)
100 INPUT "TIME"; TM
110 INPUT "DIST"; DI$
111 DW = LEN(DI$)
112 FOR I=1 TO DW: WD(DW-I)=ASC(MID$(DI$,I,1))-48 :NEXT
199 WI = 0
200 FOR X = 0 TO TM
201 IF X MOD 100000 = 0 THEN PRINT X
210 N = TM - X
211 GOSUB 2000
212 FOR J=0 TO D: NA(J)=NS(J) :NEXT
213 DA = D
214 N = X
215 GOSUB 2000
216 FOR J=0 TO D: NB(J)=NS(J) :NEXT
217 DB = D
218 GOSUB 3000
219 GOSUB 3500
220 IF G > 0 THEN WINS = WINS + 1
300 NEXT X
310 PRINT WINS
320 END
2000 REM INT TO BASE10 STREAM
2010 D=0
2020 A = N
2021 B = 10
2022 GOSUB 2500
2023 NS(D) = M
2030 N = INT(N / 10)
2040 D = D + 1
2050 IF N > 0 THEN GOTO 2020
2060 RETURN
2499 REM
2500 REM MODULO
2501 REM
2510 M = A - INT(A / B) * B
2520 RETURN
3000 FOR I=0 TO DB
3010 FOR J=0 TO DA
3020 PR(I + J) = PR(I + J) + (NA(J) * NB(I))
3030 NEXT J
3040 NEXT I
3050 REM FIXING TIME
3060 FOR I=0 TO (DA+DB)
3070 TP = INT(PR(I) / 10)
3080 A = PR(I)
3081 B = 10
3082 GOSUB 2500
3083 PR(I) = M
3090 PR(I + 1) = PR(I + 1) + TP
3100 NEXT I
3110 IF PR(I) > 0 THEN GOTO 3140
3120 I = I - 1
3130 GOTO 3110
3140 DP = I
3150 RETURN
3500 IF DP > DW THEN GOTO 3540
3501 FOR I=DP TO 0 STEP -1
3510 IF PR(I) > WD(I) THEN GOTO 3540
3511 IF PR(I) < WD(I) THEN GOTO 3530
3520 NEXT I
3530 G = 0
3531 RETURN
3540 G = 1
3541 RETURN