Paste: aoc 2018 day 10
Author: | Krenium |
Mode: | factor |
Date: | Mon, 10 Dec 2018 07:59:47 |
Plain Text |
TUPLE: point p v t ;
C: <point> point
: get-points ( -- seq )
"input10.txt" ascii file-lines [
R/ -{,1}\d+/ all-matching-subseqs [ parse-number ] map
first4 [ 2array ] 2bi@ 1 <point>
] 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 <matrix>
] 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
New Annotation