:: count-valid-passports ( validator: ( assoc -- ? ) -- n ) "/tmp/input" ascii file-lines { "" } split [ " " join " " split [ ":" split first2 ] H{ } map>assoc validator call ] count ; inline : p1 ( -- n ) [ { "byr" "iyr" "eyr" "hgt" "hcl" "ecl" "pid" } swap keys subset? ] count-valid-passports ; : p2 ( -- n ) [ { [ "byr" of string>number dup [ 1920 2002 between? ] when ] [ "iyr" of string>number dup [ 2010 2020 between? ] when ] [ "eyr" of string>number dup [ 2020 2030 between? ] when ] [ "hgt" of { { [ "cm" ?tail ] [ 150 193 ] } { [ "in" ?tail ] [ 59 76 ] } [ f f ] } cond [ [ string>number ] 2dip pick [ between? ] [ 3drop f ] if ] [ nip ] if* ] [ "hcl" of "#" ?head [ [ length 6 = ] [ "0123456789abcdef" subset? ] bi and ] [ drop f ] if ] [ "ecl" of { "amb" "blu" "brn" "gry" "grn" "hzl" "oth" } in? ] [ "pid" of [ length 9 = ] [ "0123456789" subset? ] bi and ] } 1&& ] count-valid-passports ;