USING: arrays grouping io io.encodings.ascii io.files kernel literals math math.parser prettyprint sequences sequences.extras splitting ; CONSTANT: numbers $[ "input.txt" ascii [ readln ] with-file-reader "," split [ dec> ] map ] CONSTANT: boards $[ "input.txt" ascii file-lines { "" } split rest [ [ " " split [ dec> ] map ] map-concat sift ] map ] : mark ( seq n -- newseq ) 1array { -1 } replace ; : mark-all ( seq n -- newseq ) [ mark ] curry map ; : row-filled? ( matrix -- ? ) [ [ -1 = ] all? ] any? ; : won? ( seq -- ? ) 5 group dup flip [ row-filled? ] either? ; : unmarked-sum ( seq -- newseq ) { -1 } { 0 } replace sum ; : part1 ( -- ) boards numbers [ mark-all dup [ won? ] any? ] find nip swap [ won? ] find nip unmarked-sum * . ; : part2 ( -- ) boards numbers [ mark-all [ won? ] reject dup length 1 = ] find drop 1 + numbers swap tail [ first ] dip [ mark dup won? ] find nip swap unmarked-sum * . ; part1 part2