As with day 1, the first part of this is easy. I'm "parsing"
the input data by using s:tokenize and then unpacking the
two element array. Convert the numeric part to a number, then
a simple set of s:cases to process things.
~~~:a:unpack [ ] a:for-each ;
:parse ASCII:SPACE s:tokenize a:unpack s:to-number swap ;
:process
parse
'forward [ + ] s:case
'down [ swap [ + ] dip ] s:case
'up [ swap [ - ] dip ] s:case
drop-pair ;
(depth,horizontal)
#0 #0 'day2.input [ process ] file:for-each-line
* n:put nl
~~~
The second half is modestly more difficult. As I'm minimizing
any use of variables, this is a little messier than I'd prefer,
but it's still pretty straightforward.
I'm reusing the "parsing" part from the first half.
My stack values are: aim depth horizontal
~~~:process
parse
'forward [ [ + ] [ 'abcd 'acbda reorder * + swap ] bi ] s:case
'down [ [ rot ] dip + rot rot ] s:case
'up [ [ rot ] dip - rot rot ] s:case
drop-pair ;
(aim,depth,horizontal)
#0 #0 #0 'day2.input [ process ] file:for-each-line
* n:put nl drop (discard_the_aim_field)
~~~