1
0
Fork 0
factor-puzzles/aoc2015/day7/day7.factor

38 lines
1.2 KiB
Factor

! Copyright (C) 2021 Bubbler.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays assocs combinators combinators.short-circuit
hashtables io.encodings.utf8 io.files kernel locals math
math.parser prettyprint sequences sequences.extras splitting
strings ;
IN: aoc2015.day7
: day7-data ( -- assoc )
"datasets/aoc2015/day7.txt" utf8 file-contents "\n" split
[ " -> " split-subseq first2 >string swap " " split 2array ] map ;
DEFER: eval-expr
:: num-or-var ( cached assoc num/var -- cached n )
cached num/var
{ [ dec> ] [ cached [ assoc swap eval-expr ] cache ] } 1|| ;
: eval-expr ( cached assoc str -- cached n )
over at dup length {
{ 1 [ first num-or-var ] }
{ 2 [ last num-or-var 65535 bitxor ] }
[ drop [ <evens> [ num-or-var ] with map first2 ] keep second {
{ "AND" [ bitand ] }
{ "OR" [ bitor ] }
{ "LSHIFT" [ shift ] }
{ "RSHIFT" [ neg shift ] }
} case ]
} case ;
: day7-silver ( assoc -- n ) f >hashtable swap "a" eval-expr nip ;
: day7-gold ( assoc -- n )
[ day7-silver 10 >base 1array ] [ "b" swap set-at ] [ day7-silver ] tri ;
: day7-main ( -- )
day7-data [ day7-silver . ] [ day7-gold . ] bi ;
MAIN: day7-main