USING: accessors classes.tuple combinators io.encodings.ascii io.files kernel literals math math.order parser-combinators parser-combinators.simple prettyprint sequences strings unicode ; IN: aoc.2020.02 << ALIAS: int integer-parser : range ( -- p ) int "-" token <& int <&> ; : char ( -- p ) [ letter? ] satisfy ; : password ( -- p ) char <+> [ >string ] <@ ; : `policy` ( -- p ) range " " token <& char <:&> ": " token <& password <:&> ; TUPLE: policy low high char password ; : ( str -- obj ) `policy` parse-1 policy slots>tuple ; >> CONSTANT: input $[ "resource:work/aoc/2020/02/input.txt" ascii file-lines [ ] map ] : valid1? ( policy -- ? ) { [ password>> ] [ char>> [ = ] curry count ] [ low>> ] [ high>> between? ] } cleave ; : valid2? ( policy -- ? ) { [ low>> 1 - ] [ password>> nth ] [ char>> = ] [ high>> 1 - ] [ password>> nth ] [ char>> = xor ] } cleave ; : part1 ( -- ) input [ valid1? ] count . ; : part2 ( -- ) input [ valid2? ] count . ;