TUPLE: point p v t ; C: point : get-points ( -- seq ) "input10.txt" ascii file-lines [ R/ -{,1}\d+/ all-matching-subseqs [ parse-number ] map first4 [ 2array ] 2bi@ 1 ] map ; : move1 ( p -- p' ) dup v>> [ v+ ] curry change-p [ 1 + ] change-t ; : move-points ( seq -- seq' ) [ move1 ] map ; :: movet ( p t -- p' ) p dup v>> t 1 - v*n [ v+ ] curry change-p [ drop t ] change-t ; : goto-time ( seq t -- seq' ) [ movet ] curry map ; : bounds ( seq -- w h ) [ p>> ] map unzip [ minmax swap - ] bi@ ; : area ( seq -- n ) bounds * ; : normalize ( seq -- seq' ) dup [ [ p>> first ] map ] [ [ p>> second ] map ] bi [ infimum ] bi@ 2array [ [ v- ] curry change-p ] curry map ; : find-msg ( seq -- seq' ) 1/0. [ over area 2dup > ] [ [ move-points ] 2dip nip ] while 2drop first t>> 1 - [ get-points ] dip goto-time ; : draw-msg ( seq -- ) normalize [ [ p>> reverse ] map ] [ bounds [ 1 + ] bi@ swap 32 ] bi [ CHAR: # ] 2dip [ set-indices ] keep [ "" like print ] each ; get-points find-msg [ draw-msg ] [ first t>> 1 - "Message will take %d seconds to appear.\n" printf ] bi