mirror of
https://github.com/plasmaofthedawn/adventofcode.git
synced 2025-08-22 01:22:02 -05:00
pladcl day11 and day12
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
state start
|
||||
|
||||
return_if(`ln` < '0' or `ln` > '9')
|
||||
|
||||
read_number()
|
||||
`dnSN`
|
||||
`[ ]n`
|
||||
`0SD`
|
||||
blink()
|
||||
`lo+so`
|
||||
end
|
||||
|
||||
interrupt program_start
|
||||
# C: cache
|
||||
`0sc`
|
||||
end
|
||||
|
||||
interrupt program_end
|
||||
`10an`
|
||||
`lop`
|
||||
end
|
||||
|
||||
function print_array
|
||||
|
||||
for '?' in `l0` to `lc` do
|
||||
array_get('X', `l?`)
|
||||
`n[ ]n`
|
||||
end
|
||||
`10an`
|
||||
|
||||
end
|
||||
|
||||
|
||||
function blink
|
||||
# N: number
|
||||
# D: depth
|
||||
|
||||
# if we hit max depth
|
||||
if `lD` == 25 then
|
||||
`LNstLDst`
|
||||
return 1
|
||||
end
|
||||
|
||||
# check cache
|
||||
if `lN` < 1000000 then
|
||||
if array_get('C', `lNlD1000000*+`) > 0 then
|
||||
return array_get('C', `LNLD1000000*+`)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# 0 case -- check 1 rock
|
||||
if `lN` == 0 then
|
||||
|
||||
`1SN`
|
||||
`lD1+SD`
|
||||
blink()
|
||||
|
||||
end
|
||||
# even digit case -- check split rock
|
||||
if `lNZ2%` == 0 then
|
||||
|
||||
`lN`
|
||||
`10lNZ2/^`
|
||||
`~` # get top and bottom
|
||||
|
||||
`SNSN`
|
||||
`lD1+dSDSD`
|
||||
|
||||
blink()
|
||||
blink()
|
||||
`+`
|
||||
|
||||
end
|
||||
# default case
|
||||
if `lNZ2%` != 0 and `lN` != 0 then
|
||||
|
||||
`lN2024*SN`
|
||||
`lD1+SD`
|
||||
blink()
|
||||
|
||||
end
|
||||
|
||||
`s.`
|
||||
# cacheable
|
||||
if `lN` < 1000000 then
|
||||
array_set('C', `lNlD1000000*+`, `l.`)
|
||||
end
|
||||
|
||||
`LNstLDst` # clear params
|
||||
|
||||
return `l.`
|
||||
|
||||
end
|
||||
|
||||
function read_number
|
||||
read_number_start()
|
||||
read_number_end()
|
||||
end
|
||||
|
||||
function read_number_start
|
||||
|
||||
-1
|
||||
# ret _1 if not a digit
|
||||
return_if(`ln` < 48)
|
||||
return_if(`ln` > 57)
|
||||
`st`
|
||||
|
||||
# throw the true digit onto the stack
|
||||
`ln48-`
|
||||
|
||||
# inc i
|
||||
adjust_index(1)
|
||||
# recurse
|
||||
read_number_start()
|
||||
|
||||
end
|
||||
|
||||
function read_number_end
|
||||
|
||||
# if we only have 1 item on stack (-1) we found no number, so return
|
||||
return_if(1 == `z`)
|
||||
|
||||
# push entire number thing onto temporary stack
|
||||
`[STz0<.]ds.x`
|
||||
# multiply ten then pop and add repeatedly until done
|
||||
`0`
|
||||
`[LTd_1=qr10*+l.x]ds.x`
|
||||
# get rid of the extra -1
|
||||
`st`
|
||||
# decrement i so we reread the skipped char
|
||||
adjust_index(-1)
|
||||
|
||||
end
|
||||
|
Reference in New Issue
Block a user