Paste: AOC dec 3 2023
Author: | zip |
Mode: | factor |
Date: | Sun, 17 Dec 2023 02:24:23 |
Plain Text |
IN: dec-3
USING: io io.encodings.utf8 io.files io.pathnames kernel math.parser namespaces
sequences unicode regexp assocs math ranges sequences.product arrays
sequences.deep accessors ;
: read-input ( -- seq )
home "Desktop/aoc2023/dec-3/input.txt" append-path
utf8 file-lines ;
: position>edges ( integer -- seq )
dup [ 1 - ] [ 1 + ] bi 3array ;
: xy>halo ( integer integer -- seq )
[ position>edges ] bi@ 2array <product-sequence> >array ;
: unique ( seq -- seq )
[ dup ] H{ } map>assoc values ;
: slice>halo ( y xslice -- seq )
[ from>> ] [ to>> ] bi [a..b)
[ over xy>halo ] map flatten1 unique
nip
;
: in-upper-bounds? ( element bounds -- ? )
[ <= ] 2map first2 and ;
: in-lower-bounds? ( element bounds -- ? )
[ >= ] 2map first2 and ;
: in-bounds? ( element lower upper -- ? )
[ dupd in-lower-bounds? swap ] dip in-upper-bounds? and ;
: bounded-halo ( halo lower upper -- halo )
rot [ 2over in-bounds? ] filter 2nip ;
: get-upper-bounds ( lines -- bounds )
[ first length 1 - ] [ length 1 - ] bi 2array ;
: machine-at? ( xy lines -- ? )
[ first2 ] dip nth nth 1array "" like
R/ [^0-9.]/ matches? ;
: beside-machine? ( y slice lines -- ? )
[ slice>halo { 0 0 } ] dip
[ get-upper-bounds ] keep
[ bounded-halo ] dip
swap [ over machine-at? ] map nip [ ] any? ;
: beside-machines ( y slice lines -- seq )
[ slice>halo { 0 0 } ] dip
[ get-upper-bounds ] keep
[ bounded-halo ] dip
swap [ [ over machine-at? ] keep f ? ] map nip sift ;
: part-number ( y slice lines -- integer )
[ drop nip string>number ] 3keep
beside-machine? swap f ? ;
TUPLE: machine-part xy partnumber type ;
: <machine-part> ( xy number type -- part )
machine-part boa ;
: part ( y slice lines -- part/f )
[ drop nip string>number ] 3keep
[ beside-machines ?first ] keep
over
[ [ dup first2 ] dip nth nth 1array "" like
[ swap ] dip <machine-part> ]
[ 3drop f ] if ;
: line>partnumbers ( str -- seq )
R/ \d+/ all-matching-slices ;
: line-part-numbers ( y lines -- seq )
[ nth line>partnumbers ] 2keep rot
[ [ over ] dip pick part ] map
2nip sift ;
: get-all-parts ( lines -- seq )
dup length [0..b)
[ over line-part-numbers ] map concat nip ;
: gear-ratios ( machineparts -- seq )
[ type>> "*" = ] filter
H{ } clone swap
[ [ partnumber>> ] [ xy>> ] bi pick push-at ] each
values
[ length 2 = ] filter
[ product ] map ;
: solve1 ( -- integer )
read-input
get-all-parts
[ partnumber>> ] map
sum ;
: solve2 ( -- integer )
read-input
get-all-parts
gear-ratios
sum ;
New Annotation