aoc-forth

Advent of code solutions in UF forth
git clone git://git.alexwennerberg.com/aoc-forth
Log | Files | Refs | README

commit 19fe7ce7a884d71a03bec28725ef894921e3dbf1
parent 05b208756f4f506e55a9d847dba8c524a868d480
Author: alex wennerberg <alex@alexwennerberg.com>
Date:   Mon,  5 Dec 2022 10:59:04 -0800

fix day 5 part 2

Diffstat:
M2022/05.fs | 57+++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 20 deletions(-)

diff --git a/2022/05.fs b/2022/05.fs @@ -1,39 +1,56 @@ 62 constant stack-size +9 constant num-stacks + : stacks create ( n ) 0 do here cell+ , stack-size allot loop does> swap stack-size cell+ * + ( [a] -- ) ; -9 stacks crate-stack + +num-stacks stacks crate-stack + +: 3dup 2 pick 2 pick 2 pick ; : push ( n a -- ) tuck @ c! 1 swap +! ; : ?empty ( a -- f ) dup @ 2 - = ; +: clear-stack ( a -- ) dup 2 + swap ! ; + \ 99 == error : pop ( a -- n ) dup ?empty if 99 . cr bye then dup -1 swap +! @ dup 1+ 0 swap c! c@ ; : c-to-n ( c -- u ) 48 - ; : move-from ( u2 u3 ) crate-stack swap crate-stack pop swap push ; \ move u1 items from u2 to u3 : cratemover-9000 ( u1 u2 u3 -- ) rot 0 do 2dup move-from loop 2drop ; -: cratemover-9001 ( u1 u2 u3 -- ) >r crate-stack swap crate-stack swap @ r> - cmove ; +: cratemover-9001 ( u1 u2 u3 -- ) \ a bit sloppy + rot >r crate-stack swap crate-stack ( a3 a2 ) + dup dup @ r@ - swap ! swap + dup dup @ r@ + swap ! swap ( a3 a2 ) + @ swap @ ( sp2 sp3 ) r@ - r> 3dup cmove nip erase ; + : 0idx ( u1 u2 -- u3 u4 ) 1- swap 1- swap ; : move ( -- ) noop ; : from noop ; : debug 0 crate-stack 64 9 * dump ; : to ( -- | n ) bl parse drop c@ c-to-n 0idx cratemover-9000 ; -: push-str ( a1 a2 u -- ) 0 do 2dup c@ swap push 1+ loop drop ; -\ To save energy, start of input is manually parsed -\ Sample -\ 0 crate-stack " ZN" push-str -\ 1 crate-stack " MCD" push-str -\ 2 crate-stack " P" push-str +: push-str ( a1 a2 u -- ) 0 do 2dup c@ swap push 1+ loop 2drop ; +: print-sol num-stacks 0 do r@ crate-stack dup pop dup emit swap push loop ; +: clear-stacks num-stacks 0 do r@ crate-stack clear-stack loop ; -\ [P] [C] [C] -\ [W] [B] [G] [V] [V] -\ [V] [T] [Z] [J] [T] [S] -\ [D] [L] [Q] [F] [Z] [W] [R] -\ [C] [N] [R] [H] [L] [Q] [F] [G] -\ [F] [M] [Z] [H] [G] [W] [L] [R] [H] -\ [R] [H] [M] [C] [P] [C] [V] [N] [W] -\ [W] [T] [P] [J] [C] [G] [W] [P] [J] -\ 1 2 3 4 5 6 7 8 9 +\ To save energy, start of input is manually parsed TODO parse +\ Sample + \ 0 crate-stack " ZN" push-str + \ 1 crate-stack " MCD" push-str + \ 2 crate-stack " P" push-str +\ Real input +0 crate-stack " WRF" push-str +1 crate-stack " THMCDVWP" push-str +2 crate-stack " PMZNL" push-str +3 crate-stack " JCHR" push-str +4 crate-stack " CPGHQTB" push-str +5 crate-stack " GCWLFZ" push-str +6 crate-stack " WVLQZJGC" push-str +7 crate-stack " PNRFWTVC" push-str +8 crate-stack " JWHGRSV" push-str +include input.txt +print-sol \ part 1 +clear-stacks -\ Real input 0 crate-stack " WRF" push-str 1 crate-stack " THMCDVWP" push-str 2 crate-stack " PMZNL" push-str @@ -44,7 +61,7 @@ 7 crate-stack " PNRFWTVC" push-str 8 crate-stack " JWHGRSV" push-str +: to ( -- | n ) bl parse drop c@ c-to-n 0idx cratemover-9001 ; include input.txt -: solve 9 0 do r@ crate-stack dup pop dup emit swap push loop ; -solve +print-sol \ part 2 bye