Paste: AOC day 11

Author: chunes
Mode: factor
Date: Sun, 13 Dec 2020 01:03:48
Plain Text |
USING: combinators combinators.short-circuit fry
io.encodings.ascii io.files kernel literals locals math
math.matrices math.vectors prettyprint sequences ;
IN: aoc.2020.11

CONSTANT: input $[ "input.txt" ascii file-lines ]

CONSTANT: adjacent {
    { -1 -1 } { 0 -1 } { 1 -1 }
    { -1  0 }          { 1  0 }
    { -1  1 } { 0  1 } { 1  1 }
}

: matrix-map-loc ( ... matrix quot: ( ... elt loc -- ... newelt ) -- ... newmatrix )
    [ dup dimension <coordinate-matrix> ] dip [ 2map ] curry 2map ; inline

: in-bounds? ( loc matrix -- ? )
    dimension [ { [ drop neg? not ] [ < ] } 2&& ] 2all? ;

: adj-locs ( loc -- seq ) adjacent [ v+ ] with map ;

: ib-locs ( loc matrix -- seq )
    [ adj-locs ] dip [ in-bounds? ] curry filter ;

: neighbors ( loc matrix -- seq )
    [ ib-locs ] [ matrix-nths ] bi ;

: occupied ( seq -- n ) [ CHAR: # = ] count ;

:: flip ( ch count n -- newch )
    {
        { [ count zero? ch CHAR: L = and ] [ CHAR: # ] }
        { [ count n >= ch CHAR: # = and ] [ CHAR: L ] }
        [ ch ]
    } cond ;

: step ( matrix -- newmatrix )
    dup [ neighbors occupied 4 flip ] curry matrix-map-loc ;

: simulate ( ... matrix quot: ( ... matrix -- ... newmatrix ) -- ... newmatrix )
    '[ dup @ tuck = not ] loop ; inline

: part1 ( -- ) input [ step ] simulate concat occupied . ;

: collided? ( loc matrix -- ? )
    { [ in-bounds? not ] [ matrix-nth CHAR: . = not ] } 2|| ;

: ray ( dir loc matrix -- collision-loc )
    [ 2dup collided? ]
    [ [ [ v+ ] keepd swap ] dip ] do until drop nip ;

: rays ( loc matrix -- seq )
    [ adjacent ] 2dip [ ray ] 2curry map ;

: ib-rays ( loc matrix -- seq )
    [ rays ] keep [ in-bounds? ] curry filter ;

: neighbors2 ( loc matrix -- seq )
    [ ib-rays ] [ matrix-nths ] bi ;

: step2 ( matrix -- newmatrix )
    dup [ neighbors2 occupied 5 flip ] curry matrix-map-loc ;

: part2 ( -- ) input [ step2 ] simulate concat occupied . ;

New Annotation

Summary:
Author:
Mode:
Body: