USING: advent kernel assocs sequences math math.order math.parser math.vectors arrays accessors combinators sets ; IN: advent.day9 TUPLE: state knots seen ; : ( n -- state ) 1 + { 0 0 } HS{ { 0 0 } } clone state boa ; number ] bi 2array ] map ; : (update-pair) ( head tail -- tail' ) tuck v- dup vabs [ 1 > ] any? [ [ sgn ] map v+ ] [ drop ] if ; : (update-tails) ( state -- state' ) [ unclip [ (update-pair) ] accumulate swap suffix ] change-knots dup [ knots>> last ] [ seen>> adjoin ] bi ; : (step) ( state insn -- state' ) first2 swap '[ [ knots>> [ first _ v+ ] keep set-first ] keep (update-tails) ] times ; PRIVATE> : day9-part1 ( -- n ) (input) 1 [ (step) ] reduce seen>> cardinality ; : day9-part2 ( -- n ) (input) 9 [ (step) ] reduce seen>> cardinality ;