advent: add 2020 day1 part1 solution (partial)

This commit is contained in:
Zack Buhman 2025-08-12 18:23:57 -05:00
parent 4d51b47046
commit 566a90782d
5 changed files with 190 additions and 1 deletions

View File

@ -0,0 +1,35 @@
import random
def has_2020_2(l):
length = len(l)
found = set()
for i in range(length):
for j in range(length):
if i == j:
continue
if l[i] + l[j] == 2020:
found.add(frozenset((i, j)))
return len(found) == 1
def has_2020_3(l):
length = len(l)
found = set()
for i in range(length):
for j in range(length):
for k in range(length):
if i == j or k == i:
continue
if l[i] + l[j] + l[k] == 2020:
found.add(frozenset((i, j)))
return len(found) == 1
def gen_random():
return [random.randint(100, 2500) for _ in range(64)]
def find_input():
while True:
l = gen_random()
if has_2020_2(l) and has_2020_3(l):
return l
print("\n".join(map(str, find_input())))

View File

@ -0,0 +1,64 @@
2425
1176
1549
1178
1758
2293
880
1602
871
1423
347
2353
1460
2019
1767
2213
1988
193
2434
1862
2176
760
1227
1005
1143
2199
2268
927
942
240
211
1996
1479
1068
1392
1827
2285
1380
1669
1282
2182
2424
1082
1826
344
1584
1741
1614
517
907
1091
1755
1921
176
1668
2112
1485
944
1771
1105
409
1975
2333
2434

View File

@ -0,0 +1,70 @@
;; input data: m0
;; input data: m1
;; input data: m2
;; variables m3:
loop_0_ix = 0 ; decrementing counter
loop_1_start = 1
;start = 0
start = 0 ; constant
;; initialization
;; [X ] [Y ] [D1 ]
mov (start + 0),ct0
;; initialize multiplier output to 2020
mov 63,ct3
mvi 2020,mc3 ; m3[63] used as temporary
mov 63,ct3
mov m3,y mov 1,rx
;; initialize variables
mov loop_0_ix,ct3
mov (64 - start),mc3 ; loop_0_ix+
mov (start + 1),mc3 ; loop_1_start+
;; outer loop init
mov loop_inner,top
mov (64 - start),lop ; (LOP: 64)
mov 1,pl
mov loop_1_start,ct3
solve_loop_0_top:
;; [X ] [Y ] [D1 ]
;; calculate inner loop starting index
;; P: 1 ; A: 64
mov m3,a mov m3,ct1 ; loop_1_start
;; pre-decrement lop; effectively a jump to loop_inner
btm ; (LOP: 63)
add mov all,mc3 ; loop_1_start+ (delay slot)
loop_inner:
mov m0,p mov m1,a
add mov mul,p mov alu,a
sub
jmp z,found
nop
btm
;; increment ct1 (A discarded)
mov mc1,a ; (delay slot)
;; increment ct0 (A discarded)
mov mc0,a
loop_exit_test:
;; [X ] [Y ] [D1 ]
mov loop_0_ix,ct3
mov m3,a mov 1,pl ; m3: loop_0_ix
sub mov alu,a mov all,mc3 ; m3: loop_0_ix+
jmp nz,solve_loop_0_top
mov all,lop ; (delay slot)
not_found:
jmp end
clr a ; (delay slot)
found:
;; [X ] [Y ] [D1 ]
mov m1,x mov m0,y clr a
mov mul,p
add mov alu,a ; (delay slot)
end:

20
scu-dsp/base10_to_bin.py Normal file
View File

@ -0,0 +1,20 @@
import struct
import sys
input_file = sys.argv[1]
output_file = sys.argv[2]
with open(input_file, 'r') as f:
buf = f.read()
def parse_input(buf):
lines = buf.strip().split('\n')
for line in lines:
if not line.strip():
yield 0
else:
yield int(line)
with open(output_file, 'wb') as f:
for num in parse_input(buf):
f.write(struct.pack(">i", num))

View File

@ -14,7 +14,7 @@ base10_loop:
mov 0,ct0
mvi div10_unsigned,pc
;; [X ] [Y ] [D1 ]
mov mc0,y mov 1,lop ; mvi imm,pc delay slot (executed twice)
mov mc0,y mov 1,lop ; mvi imm,pc delay slot (executed twice)
;; after function return:
mov all,mc0 ; m0[1] (1234)
mov all,pl ; ??? why can't this happen in the next instruction?