USING: arrays combinators generalizations io.encodings.utf8 io.files kernel math math.intervals math.order math.parser math.ranges multiline namespaces peg.ebnf prettyprint sequences sequences.generalizations ; IN: 2021.22 EBNF: parse [=[ number = [0-9-]+ => [[ dec> ]] range = [x-z]~ "="~ number ".."~ number (","?)~ rule = ("on"|"off") " "~ range range range ]=] : merge ( seq -- pair ) [ first2 <= ] filter [ first first ] [ last second ] bi 2array ; : split-cuboid ( cuboid1 cuboid2 -- cuboids ) [ [ first ] [ second ] [ bi@ 2array ] bi-curry@ 2bi { [ drop infimum ] [ [ second 1 - ] [ first min ] bi* ] [ [ supremum ] [ infimum dup 1 + ] bi* ] [ [ first max ] [ first ] bi* ] } 2cleave [ 2array ] 2tri@ 3array ] 2map first3 { [ [ first ] [ merge ] [ merge ] tri* ] [ [ third ] [ merge ] [ merge ] tri* ] [ [ second ] [ first ] [ merge ] tri* ] [ [ second ] [ third ] [ merge ] tri* ] [ [ second ] [ second ] [ first ] tri* ] [ [ second ] [ second ] [ third ] tri* ] } 3cleave [ 3array ] 3 6 mnapply 6 narray [ [ first2 <= ] all? ] filter ; : intersect? ( seq seq -- ? ) [ [ first ] [ second ] [ bi@ 2array ] bi-curry@ 2bi [ supremum ] [ infimum ] bi* 2array ] 2map [ first2 <= ] all? ; : reboot ( seq -- n ) 1 cut [ [ rest ] map ] dip [ unclip [ [ V{ } clone -rot [ 2dup intersect? [ split-cuboid append ] [ drop suffix ] if ] curry each ] keep ] dip "on" = [ suffix ] [ drop ] if ] each [ [ first2 swap - 1 + ] map product ] map-sum ; "input22" utf8 file-lines [ parse ] map [ [ rest [ first2 [ -50 >= ] [ 50 <= and ] bi* ] all? ] filter ] keep [ reboot . ] bi@