-
-
Save saolsen/114e4a8fca950cf143ff1924f13629a3 to your computer and use it in GitHub Desktop.
a0c 2020 day4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This part is literally perfect for polar, validation rules. | |
valid_passport_1(passport: Dictionary) if | |
passport matches { | |
byr: _, | |
iyr: _, | |
eyr: _, | |
hgt: _, | |
hcl: _, | |
ecl: _, | |
pid: _ | |
}; | |
?= valid_passport_1({ecl: "gry", pid: "860033327", eyr: "2020", hcl: "#fffffd", byr: "1937", iyr: "2017", cid: "147", hgt: "183cm"}); | |
# Counting is rough in polar, there's no way to do it that's not | |
# recursive and doesn't build up the polar stack. | |
# Which means we can't really count big arrays. | |
# Another opportunity for some sort of self recursive rule | |
# or tail call tricks. | |
count_valid_passports_1([], 0); | |
count_valid_passports_1([first, *rest], count) if | |
count_valid_passports_1(rest, rest_count) and | |
(valid_passport_1(first) and count = rest_count + 1 and cut) or count = rest_count; | |
# Same counting pattern as yesterday, don't like it that much. | |
# So, part 2 | |
# At first look, part 2 seems like it's the PERFECT polar use case. | |
# We validate a passport against a bunch of rules. | |
# The problem though, is that there's a whole lot of string parsing type conversion | |
# in the rules which is really rough / annoying to do in polar. | |
# I think along with a list stdlib, I really want a string stdlib and type conversion/parsing | |
# functions. This is the kind of program that polar should make SO easy. | |
valid_passport(passport: Dictionary) if | |
passport matches { | |
byr: byr, | |
iyr: iyr, | |
eyr: eyr, | |
hgt: hgt, | |
hcl: hcl, | |
ecl: ecl, | |
pid: pid | |
} and | |
valid_byr(byr) and | |
valid_iyr(iyr) and | |
valid_eyr(eyr) and | |
valid_hgt(hgt) and | |
valid_hcl(hcl) and | |
valid_ecl(ecl) and | |
valid_pid(pid); | |
valid_byr(byr) if | |
hack.len(byr) = 4 and | |
i = hack.int(byr) and | |
i matches Integer and | |
i >= 1920 and i <= 2002; | |
?= valid_byr("2002"); | |
?= not valid_byr("2003"); | |
?= not valid_byr("not a number"); | |
valid_iyr(iyr) if | |
hack.len(iyr) = 4 and | |
i = hack.int(iyr) and | |
i matches Integer and | |
i >= 2010 and i <= 2020; | |
?= valid_iyr("2010"); | |
?= not valid_iyr("2009"); | |
?= not valid_iyr("not a number"); | |
valid_eyr(eyr) if | |
hack.len(eyr) = 4 and | |
i = hack.int(eyr) and | |
i matches Integer and | |
i >= 2020 and i <= 2030; | |
valid_hgt(hgt) if | |
units = hack.substr(hgt, -2, nil) and | |
units in ["cm", "in"] and | |
i = hack.int(hack.substr(hgt, 0, -2)) and | |
i matches Integer and | |
(units = "cm" and i >= 150 and i <= 193) or | |
(units = "in" and i >= 59 and i <= 76); | |
?= valid_hgt("60in"); | |
?= valid_hgt("190cm"); | |
?= not valid_hgt("190in"); | |
?= not valid_hgt("190"); | |
valid_hcl(hcl) if | |
"#" = hack.get(hcl, 0) and | |
code = hack.substr(hcl, 1, nil) and | |
hack.len(code) = 6 and | |
# This doesn't work for some reason but should. | |
# It's actually an example in the docs even so probably a bug. | |
# forall(c in code, c in "0123456789abcdf"); | |
forall(c in code, c in ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]); | |
?= valid_hcl("#123abc"); | |
?= not valid_hcl("#123abz"); | |
?= not valid_hcl("123abc"); | |
valid_ecl(ecl) if | |
ecl in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]; | |
?= valid_ecl("brn"); | |
?= not valid_ecl("wat"); | |
valid_pid(pid) if | |
hack.len(pid) = 9 and | |
i = hack.int(pid) and | |
i matches Integer; | |
?= valid_pid("000000001"); | |
?= not valid_pid("0123456789"); | |
?= forall (p in test_valid, valid_passport(p)); | |
?= forall (p in test_invalid, not valid_passport(p)); | |
# This is another case of the problem I was having yesterday. This does the exact same thing | |
# as the other count valid passports rule but it checks them with a different rule. There's no way | |
# to abstract that though so I have to duplicate the whole rule. | |
count_valid_passports([], 0); | |
count_valid_passports([first, *rest], count) if | |
count_valid_passports(rest, rest_count) and | |
(valid_passport(first) and count = rest_count + 1 and cut) or count = rest_count; | |
# UGH, this times out on counting them too. | |
# Have to do the count from python again. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
TEST_INPUT = """ | |
ecl:gry pid:860033327 eyr:2020 hcl:#fffffd | |
byr:1937 iyr:2017 cid:147 hgt:183cm | |
iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884 | |
hcl:#cfa07d byr:1929 | |
hcl:#ae17e1 iyr:2013 | |
eyr:2024 | |
ecl:brn pid:760753108 byr:1931 | |
hgt:179cm | |
hcl:#cfa07d eyr:2025 pid:166559648 | |
iyr:2011 ecl:brn hgt:59in | |
""" | |
INPUT = """ | |
ecl:#eef340 eyr:2023 hcl:#c0946f pid:244684338 iyr:2020 cid:57 byr:1969 hgt:152cm | |
pid:303807545 cid:213 ecl:gry hcl:#fffffd | |
eyr:2038 byr:1951 | |
hgt:171cm iyr:2011 | |
hcl:#c0946f byr:1933 eyr:2025 pid:517067213 hgt:173cm | |
ecl:hzl | |
iyr:2018 | |
pid:5253256652 byr:2009 hgt:152cm iyr:1989 eyr:1968 hcl:64cb63 ecl:hzl | |
iyr:2013 | |
pid:862607211 eyr:2020 | |
hgt:174cm | |
byr:1990 | |
ecl:blu hcl:#888785 | |
ecl:grn byr:1955 | |
pid:608098408 eyr:2027 iyr:2020 hcl:#b6652a cid:264 | |
hgt:181cm | |
byr:1998 ecl:hzl eyr:2021 | |
hcl:#866857 hgt:189cm iyr:2030 | |
pid:013735467 | |
pid:075417314 hcl:#b6652a byr:1957 | |
iyr:2011 | |
hgt:154cm | |
eyr:2025 | |
ecl:amb | |
iyr:1993 hgt:74cm eyr:1960 | |
byr:2029 | |
hcl:293244 ecl:#3cb5e5 pid:4861232363 | |
hgt:153cm hcl:#6b5442 pid:065240897 byr:1932 | |
cid:196 ecl:blu eyr:2028 iyr:2019 | |
eyr:2024 ecl:amb | |
hcl:#866857 byr:1922 pid:496904942 hgt:164cm iyr:2020 | |
pid:847705161 byr:1951 cid:124 iyr:1991 | |
eyr:2028 ecl:dne | |
hcl:6b2d28 hgt:172cm | |
byr:2007 iyr:2029 ecl:hzl eyr:2026 hgt:168in | |
hcl:z | |
pid:63151612 | |
iyr:2027 hgt:172in | |
cid:174 byr:2014 hcl:z eyr:1921 | |
ecl:grt pid:#cebdc2 | |
ecl:amb hcl:#d09c0f | |
iyr:2015 hgt:156cm eyr:2026 byr:1962 | |
pid:086120872 | |
cid:125 | |
pid:837849996 | |
byr:1958 ecl:brn hgt:166cm hcl:#ceb3a1 eyr:2028 iyr:2012 | |
ecl:gry hgt:180cm | |
pid:939059935 eyr:2023 byr:1977 hcl:#b6652a | |
hgt:190in byr:2029 eyr:1984 | |
ecl:gry hcl:z pid:055092916 iyr:2010 | |
hgt:63in ecl:blu byr:1940 iyr:2012 eyr:2029 hcl:#7d3b0c | |
pid:163033394 | |
eyr:2040 pid:181cm | |
iyr:1928 hgt:76cm hcl:d8aafb byr:1949 cid:275 ecl:xry | |
hcl:#cfa07d ecl:oth byr:1948 eyr:2021 | |
pid:719690182 hgt:179cm iyr:2020 | |
byr:1939 cid:266 | |
eyr:2026 iyr:2017 hcl:#f116d2 | |
ecl:hzl pid:522421825 | |
hgt:68in | |
hcl:z hgt:61in | |
cid:115 pid:180cm iyr:2030 byr:2014 eyr:2032 ecl:hzl | |
ecl:xry | |
eyr:2028 pid:191cm iyr:2015 hgt:150cm byr:2029 | |
eyr:2027 | |
hcl:#a97842 pid:997937480 hgt:61in iyr:2019 | |
byr:1921 | |
ecl:grn | |
hgt:163cm | |
pid:912318455 iyr:2016 byr:1988 ecl:brn hcl:#a97842 cid:221 eyr:2029 | |
cid:333 hcl:#c0946f | |
hgt:163cm iyr:2018 eyr:2027 ecl:oth | |
cid:70 hcl:#c0946f | |
pid:961507902 byr:1949 ecl:grn iyr:2017 eyr:2029 hgt:69in | |
hgt:169cm ecl:amb | |
iyr:2013 pid:496169901 | |
byr:1943 eyr:2028 hcl:#ceb3a1 | |
cid:249 | |
ecl:blu cid:343 | |
iyr:1998 hgt:154in hcl:#efcc98 byr:1972 | |
pid:508213120 iyr:2012 eyr:2025 hcl:z hgt:70cm byr:1976 | |
ecl:brn | |
iyr:1924 | |
eyr:2005 | |
hcl:z | |
hgt:167 pid:154cm | |
byr:2007 | |
pid:761333244 hgt:180cm iyr:2017 hcl:#18171d eyr:2021 | |
byr:1983 | |
cid:67 ecl:oth | |
eyr:1993 | |
byr:2003 | |
hcl:#602927 | |
ecl:grt | |
cid:84 hgt:178 | |
pid:1847086637 iyr:2026 | |
hcl:#866857 hgt:162cm pid:483774485 iyr:2010 | |
byr:1946 eyr:2028 ecl:gry | |
pid:726639691 eyr:2028 | |
hgt:171cm hcl:#ff65a6 | |
iyr:2011 byr:1989 | |
hcl:z iyr:2026 ecl:xry | |
eyr:2037 byr:2005 pid:#f09a0f | |
hgt:68 cid:156 | |
hgt:71in ecl:blu eyr:2026 hcl:#18171d | |
byr:1981 iyr:2017 | |
pid:698636544 | |
eyr:2021 | |
byr:1957 ecl:brn pid:365378126 cid:93 iyr:2019 hcl:#18171d hgt:179cm | |
byr:1996 iyr:2014 hgt:64cm | |
eyr:2034 | |
hcl:z | |
pid:629486472 cid:140 | |
hgt:192cm eyr:2020 hcl:#b6652a iyr:1988 byr:2021 ecl:brn | |
byr:1955 iyr:2015 eyr:2030 | |
ecl:gry hcl:z pid:6550198754 | |
hgt:158cm cid:305 | |
ecl:gry hcl:#a97842 | |
hgt:176cm eyr:2022 pid:810146585 iyr:2020 | |
byr:2027 hcl:#cfa07d | |
iyr:2011 ecl:#f07598 | |
cid:293 | |
hgt:150cm pid:#fa948d eyr:2029 | |
eyr:2028 iyr:2013 hgt:69in ecl:gry pid:317170371 | |
cid:147 hcl:#bfe1f1 | |
byr:1976 | |
pid:059341891 hgt:174cm | |
ecl:oth | |
eyr:2029 iyr:2017 hcl:#733820 | |
iyr:2018 hcl:#ceb3a1 hgt:188cm cid:308 | |
pid:792826885 byr:1948 ecl:blu eyr:2028 | |
iyr:2017 cid:94 hcl:#95c7dc | |
pid:231757803 eyr:2022 | |
byr:1992 hgt:153cm ecl:amb | |
eyr:2027 | |
iyr:2011 hgt:186cm | |
ecl:brn pid:996347346 hcl:#866857 | |
byr:1960 | |
eyr:2025 byr:2001 | |
ecl:blu pid:755715478 iyr:2019 hgt:61in | |
ecl:gry | |
eyr:2038 | |
hgt:81 hcl:z iyr:2028 | |
cid:214 byr:1965 | |
pid:412744447 byr:1979 hcl:#cfa07d ecl:blu | |
eyr:2029 cid:157 | |
hgt:180in iyr:1948 | |
hgt:170cm | |
pid:623557081 byr:1924 eyr:2024 hcl:98d623 iyr:2012 ecl:amb | |
cid:311 ecl:grn | |
iyr:2011 byr:1982 | |
eyr:2002 hcl:#ef318a | |
pid:0548169957 | |
hgt:87 | |
eyr:2030 hcl:#733820 iyr:2016 pid:558470391 | |
byr:1936 ecl:oth hgt:185cm | |
iyr:2019 | |
ecl:amb byr:1949 | |
pid:376468392 | |
hgt:178cm | |
pid:019195245 | |
ecl:grn hgt:171cm | |
byr:1978 iyr:2011 eyr:2022 hcl:#733820 | |
cid:134 | |
hcl:#623a2f hgt:192cm eyr:2026 byr:1977 | |
ecl:grn cid:308 | |
ecl:hzl pid:715816358 hgt:69in iyr:2014 hcl:#623a2f | |
byr:1996 | |
eyr:2027 | |
iyr:1947 | |
ecl:#39a697 | |
hgt:183cm byr:2029 | |
eyr:2022 pid:7951883913 | |
hcl:z | |
ecl:gry byr:1950 | |
hcl:#18171d hgt:168cm iyr:2020 pid:677187333 eyr:2027 | |
byr:1969 ecl:blu hcl:#18171d iyr:2011 | |
hgt:162cm | |
pid:701349891 | |
cid:269 byr:1966 | |
iyr:2011 | |
pid:905940527 eyr:2023 hgt:190cm | |
ecl:brn hcl:#ceb3a1 | |
eyr:2027 pid:454627395 ecl:brn | |
hcl:#ceb3a1 cid:302 hgt:184cm | |
byr:1959 | |
iyr:2015 | |
iyr:2011 | |
eyr:2028 | |
hgt:166cm | |
hcl:#733820 byr:1938 ecl:blu pid:857984986 | |
hcl:#c0946f ecl:brn pid:226877822 | |
hgt:182cm byr:1998 | |
cid:160 | |
hgt:186in pid:26499164 byr:2017 | |
hcl:z | |
iyr:1998 eyr:2026 | |
cid:331 ecl:#236556 | |
pid:328866543 | |
hgt:165cm eyr:2039 iyr:1987 ecl:amb byr:2018 hcl:z | |
iyr:2016 eyr:2036 hcl:#888785 byr:1976 pid:160402352 hgt:76cm ecl:blu | |
ecl:blu | |
hcl:#fffffd eyr:2025 hgt:66in pid:979788527 | |
byr:1957 iyr:2013 | |
ecl:grn pid:279357265 iyr:2019 eyr:2021 byr:1953 | |
hgt:177cm hcl:#c0946f | |
ecl:oth hcl:z eyr:2025 byr:1949 hgt:189cm iyr:2020 pid:901383503 | |
byr:2019 hcl:#733820 | |
pid:31022828 eyr:1929 | |
hgt:75cm iyr:2012 ecl:grn | |
pid:080462937 | |
ecl:blu hcl:#866857 | |
cid:102 | |
iyr:2013 eyr:2025 byr:1975 hgt:64in | |
iyr:2016 | |
eyr:2028 | |
cid:125 | |
byr:1979 hcl:#866857 | |
ecl:brn hgt:173cm pid:814947616 | |
hcl:z byr:2020 pid:#c3b54b hgt:174in eyr:2038 | |
iyr:2016 | |
ecl:gmt | |
cid:132 | |
iyr:1958 | |
pid:61543452 hcl:z | |
ecl:zzz eyr:2039 byr:2006 | |
cid:55 eyr:2022 byr:1954 iyr:2015 | |
hgt:188cm hcl:#a97842 pid:49143631 ecl:amb | |
hgt:152cm | |
byr:1982 | |
iyr:2013 ecl:blu | |
hcl:#341e13 | |
eyr:2026 pid:440841976 | |
iyr:2019 ecl:blu pid:553456616 hcl:#733820 hgt:160cm byr:1932 eyr:2030 | |
byr:1980 hgt:169cm hcl:#7d3b0c cid:312 iyr:2010 | |
eyr:2026 pid:028550304 ecl:grn | |
ecl:amb eyr:2021 iyr:2014 hgt:71in pid:986053283 byr:1981 | |
ecl:oth | |
eyr:2023 hcl:#888785 | |
byr:1949 | |
iyr:2016 pid:699325656 | |
hgt:63cm cid:297 eyr:2020 pid:990390922 | |
hcl:#602927 ecl:lzr | |
iyr:2012 byr:2016 | |
hcl:9ea2fa eyr:2023 pid:088680493 | |
byr:1998 iyr:2017 ecl:utc hgt:170cm cid:175 | |
cid:316 iyr:2016 eyr:2026 hcl:#79ff1d hgt:65in | |
byr:1997 pid:215466710 ecl:oth | |
cid:213 byr:1983 hcl:#888785 iyr:2016 pid:767747981 eyr:2025 | |
ecl:hzl hgt:168cm | |
eyr:2030 byr:1972 | |
cid:282 | |
ecl:gry hgt:178cm | |
hcl:#a97842 | |
iyr:2018 | |
hcl:#6b5442 ecl:amb | |
eyr:2028 cid:104 hgt:159cm pid:446429120 iyr:2012 | |
byr:1938 | |
byr:1940 hgt:178cm ecl:oth | |
hcl:#ceb3a1 | |
pid:845683663 iyr:2015 eyr:2024 | |
byr:1940 pid:496262233 | |
hgt:184cm hcl:#b6652a | |
ecl:grn cid:152 iyr:2012 eyr:2029 | |
hgt:185cm pid:455744229 byr:1954 eyr:2022 ecl:gry hcl:#6b5442 iyr:2012 | |
hgt:182cm byr:1966 eyr:2028 ecl:#a5b7fc | |
iyr:2029 | |
pid:343591896 | |
cid:58 | |
ecl:hzl | |
eyr:2022 hgt:180in byr:2021 | |
hcl:#6b5442 | |
ecl:utc hcl:#b6652a | |
pid:635147657 byr:2020 | |
eyr:2022 hgt:157cm iyr:2018 | |
ecl:grt cid:312 iyr:1959 pid:154262836 | |
hgt:171cm | |
hcl:#fffffd | |
eyr:2024 | |
byr:1982 | |
hcl:#7a12b4 pid:223424149 ecl:hzl hgt:175cm | |
byr:1930 iyr:2010 eyr:2028 | |
hcl:#c0946f pid:633476454 eyr:2026 iyr:2011 | |
byr:1934 | |
hgt:186cm | |
cid:289 ecl:gry | |
hcl:#fffffd pid:376300524 hgt:155cm byr:1964 iyr:2017 eyr:2021 ecl:grn | |
hcl:a5d4dc byr:2006 cid:165 ecl:#db800f iyr:2029 pid:0199789970 eyr:1961 hgt:61cm | |
eyr:2027 hgt:170cm iyr:2010 | |
hcl:#c0946f | |
ecl:grn pid:415726530 | |
byr:1985 | |
cid:197 byr:1957 hgt:192in hcl:#a97842 ecl:hzl eyr:2029 pid:958973455 iyr:2011 | |
iyr:2015 pid:933689314 hgt:162cm ecl:amb | |
cid:122 eyr:2021 | |
hcl:#6b5442 byr:1973 | |
eyr:2026 hgt:172cm | |
iyr:2012 | |
ecl:brn hcl:#733820 pid:004474632 | |
byr:2000 | |
hgt:191cm eyr:2030 byr:1999 pid:9155071477 iyr:2026 hcl:#602927 cid:315 | |
ecl:grn | |
iyr:2010 pid:182884251 hcl:#18171d hgt:154cm | |
eyr:2020 | |
byr:1926 ecl:oth | |
iyr:2019 eyr:1920 pid:132839546 | |
cid:283 hgt:188in hcl:#efcc98 byr:2027 | |
iyr:2011 hgt:177cm | |
cid:117 byr:1976 | |
ecl:gry | |
hcl:#623a2f eyr:2030 pid:134592046 | |
byr:1968 hgt:146 | |
iyr:2013 hcl:eefdc4 eyr:2028 | |
ecl:xry pid:722120008 | |
iyr:2016 byr:1941 hgt:67cm cid:51 hcl:#b6652a ecl:hzl eyr:2034 pid:994005715 | |
hcl:#cfa07d ecl:oth | |
hgt:182cm eyr:2021 pid:612583941 | |
byr:1983 | |
iyr:2019 | |
byr:1922 | |
hcl:#602927 hgt:161cm ecl:gry eyr:2020 pid:190170808 iyr:2013 | |
hgt:63cm cid:136 | |
iyr:1999 | |
pid:8235748647 hcl:z | |
byr:2022 eyr:1933 | |
ecl:#304383 | |
cid:273 ecl:blu hcl:z | |
iyr:2011 byr:2007 | |
eyr:2020 | |
pid:942473857 hgt:178in | |
ecl:grt byr:2029 hgt:187in eyr:2030 cid:160 | |
hcl:#efcc98 pid:#39f22b | |
iyr:1966 | |
byr:1978 ecl:oth iyr:2011 hgt:164cm eyr:2027 hcl:#cfa07d | |
hgt:75cm hcl:#1e8137 byr:1986 ecl:blu eyr:2022 pid:796688423 | |
iyr:2012 | |
eyr:2026 | |
ecl:#3013af hcl:z pid:#e8597f hgt:123 iyr:2025 byr:1942 | |
hcl:z hgt:177in | |
iyr:1993 pid:#4c9348 byr:2008 eyr:1989 | |
pid:123524366 byr:1935 | |
hgt:156cm hcl:#7d3b0c | |
iyr:2020 ecl:brn eyr:2020 | |
hcl:z eyr:2038 pid:7663741757 ecl:gmt hgt:174 | |
byr:2008 iyr:1939 | |
cid:225 | |
hcl:#888785 hgt:172cm | |
ecl:oth pid:500711541 eyr:2027 | |
byr:1931 iyr:2012 | |
pid:575447108 ecl:amb byr:1943 | |
hcl:#888785 hgt:173cm eyr:2024 | |
eyr:2021 iyr:2010 pid:178773264 hgt:157cm byr:1965 hcl:#bb7bcf ecl:amb | |
iyr:2023 ecl:#35bd84 byr:2020 | |
hgt:72in | |
eyr:2037 | |
hcl:#6b5442 | |
pid:421311669 | |
byr:1921 iyr:2011 | |
pid:146088688 | |
eyr:2023 hcl:#15ed24 hgt:183cm | |
ecl:brn | |
hcl:#b6652a cid:243 | |
byr:1993 eyr:2024 | |
iyr:2014 hgt:172cm | |
pid:771275594 | |
eyr:2024 | |
hcl:#cfa07d pid:858807920 cid:293 hgt:157cm ecl:hzl iyr:2013 byr:1984 | |
ecl:blu hgt:193cm cid:73 hcl:#18171d eyr:2026 | |
iyr:2016 pid:124151812 byr:1945 | |
ecl:amb iyr:2018 | |
pid:214555737 hgt:157cm | |
eyr:2028 | |
byr:1925 hcl:#866857 | |
pid:5633250409 | |
hcl:4ef7d8 | |
byr:2004 iyr:1958 | |
hgt:96 | |
eyr:2038 ecl:xry cid:274 | |
byr:1972 pid:401239851 hgt:184in hcl:z iyr:2017 | |
eyr:2030 ecl:#cb289a cid:140 | |
hgt:175cm | |
byr:1926 hcl:#cfa07d eyr:2029 ecl:gry pid:325039730 iyr:2017 | |
cid:101 hgt:166cm byr:1986 ecl:amb | |
hcl:#7d3b0c iyr:2013 | |
pid:413769688 eyr:2024 | |
hgt:159cm cid:311 | |
byr:1993 eyr:2028 pid:188cm ecl:oth hcl:#602927 iyr:2013 | |
pid:565831038 | |
ecl:amb | |
hgt:155cm hcl:#fffffd cid:335 iyr:2016 | |
eyr:2029 byr:1997 | |
hgt:122 | |
byr:2022 | |
eyr:2028 ecl:blu iyr:2017 pid:269710626 hcl:#b6652a | |
cid:196 | |
byr:1953 hcl:#6b5442 iyr:2010 | |
pid:216121215 hgt:188cm ecl:blu | |
iyr:2011 hcl:98166c hgt:62cm | |
byr:2028 | |
eyr:2024 | |
pid:792478385 ecl:grn | |
hcl:#efcc98 iyr:2012 pid:020039675 eyr:2021 byr:1974 hgt:156cm | |
ecl:hzl | |
cid:123 hcl:#7d3b0c | |
byr:2026 eyr:2004 iyr:2012 ecl:oth pid:349203133 hgt:160cm | |
pid:085461475 | |
byr:1962 iyr:2020 hcl:#623a2f | |
eyr:2024 | |
cid:80 ecl:brn | |
hgt:154cm | |
ecl:oth hgt:156cm iyr:2016 | |
hcl:#6b5442 | |
byr:1973 | |
eyr:2021 pid:539898580 | |
iyr:2026 hgt:191cm | |
hcl:z | |
byr:1930 pid:#abc2f0 ecl:blu cid:242 eyr:2024 | |
cid:167 | |
hgt:179cm | |
iyr:2017 eyr:2021 pid:756797571 byr:1949 ecl:brn hcl:#a97842 | |
byr:1975 eyr:2030 | |
ecl:oth hgt:169in pid:4031206183 hcl:#733820 iyr:2017 cid:244 | |
ecl:#54cfeb hgt:152cm | |
iyr:2026 hcl:36b4b9 | |
byr:2030 | |
pid:#fa1cb9 eyr:1964 | |
byr:1974 cid:99 hcl:9e3296 | |
eyr:2032 | |
pid:686747414 | |
iyr:1995 | |
ecl:amb | |
iyr:2030 ecl:oth hcl:z byr:1979 | |
pid:114661006 hgt:191cm eyr:1941 | |
hcl:#341e13 iyr:2014 byr:1953 | |
pid:188326193 ecl:gry hgt:189cm cid:283 | |
eyr:2030 | |
byr:1975 | |
pid:092061576 hgt:73in eyr:2023 | |
ecl:brn cid:227 hcl:#5e9d91 | |
iyr:2011 | |
hcl:#7d3b0c hgt:167cm cid:141 | |
eyr:1957 byr:2012 ecl:gmt iyr:2019 pid:#1b7c8a | |
hgt:168cm hcl:#c0946f pid:599500784 byr:1930 eyr:2023 ecl:hzl cid:113 | |
iyr:2013 | |
eyr:2030 hcl:#b4cb4f | |
hgt:68in | |
ecl:brn byr:1923 pid:699162086 | |
iyr:2013 | |
ecl:dne hcl:z eyr:1971 | |
pid:#580add byr:2020 | |
hgt:190cm | |
hcl:#ceb3a1 | |
byr:1976 eyr:2020 | |
cid:162 iyr:2016 | |
hgt:168cm | |
ecl:hzl | |
pid:050478613 hgt:59cm | |
iyr:2017 | |
ecl:grn byr:2030 hcl:#cfa07d eyr:2025 | |
pid:352943968 eyr:2025 byr:1980 iyr:2014 ecl:gry hcl:#c0946f | |
hgt:193cm | |
pid:328621931 cid:310 hgt:170cm | |
hcl:#733820 byr:1955 | |
iyr:2016 | |
eyr:2028 ecl:hzl | |
hcl:#866857 | |
pid:095858739 byr:1956 | |
iyr:2018 hgt:193cm | |
ecl:hzl | |
eyr:2029 | |
pid:70973661 eyr:2039 ecl:gry | |
iyr:2016 | |
cid:291 | |
hcl:#623a2f hgt:97 | |
hcl:4d51a8 | |
eyr:1978 | |
ecl:gmt | |
byr:2029 iyr:2022 | |
pid:34507041 hgt:61cm | |
byr:1989 ecl:brn pid:769582914 | |
eyr:2026 cid:218 | |
iyr:2020 hcl:#866857 hgt:184cm | |
ecl:brn | |
iyr:1998 cid:227 | |
hgt:162in | |
byr:2026 | |
hcl:#602927 eyr:2027 pid:236998728 | |
ecl:gry byr:1984 hgt:157 cid:295 | |
eyr:2020 | |
iyr:2018 hcl:#733820 | |
pid:037871534 | |
hgt:166cm hcl:#c0946f pid:412146401 | |
iyr:2011 | |
eyr:2022 | |
byr:1938 | |
ecl:brn | |
ecl:brn cid:95 byr:1981 eyr:2030 hcl:#efcc98 pid:777041035 hgt:152cm iyr:2011 | |
eyr:2024 hgt:89 pid:3761913749 iyr:1939 byr:1967 hcl:a222f6 cid:165 ecl:#7fe574 | |
cid:339 hgt:156cm | |
ecl:brn iyr:2013 byr:1951 hcl:#efcc98 eyr:2026 | |
pid:863566946 | |
ecl:brn hcl:#6b5442 eyr:2023 | |
pid:787129723 byr:1949 iyr:2015 | |
pid:#7f615a | |
cid:202 hcl:#6b5442 eyr:2028 | |
ecl:#a5419c | |
hgt:75cm | |
iyr:2011 | |
byr:2001 | |
pid:864001133 | |
cid:236 | |
byr:1943 hcl:#733820 ecl:dne eyr:2025 hgt:171cm iyr:1989 | |
pid:193073684 ecl:grn byr:1962 iyr:2014 | |
hcl:#cfa07d hgt:189cm | |
cid:321 eyr:2029 | |
byr:1959 | |
hcl:#b6652a | |
eyr:2026 | |
hgt:159cm pid:815014918 iyr:2011 ecl:amb | |
iyr:2017 hgt:182cm | |
hcl:#a97842 eyr:2023 ecl:grn pid:656177536 | |
byr:1973 | |
eyr:1923 ecl:grn | |
cid:138 iyr:2020 | |
hgt:164cm byr:1958 hcl:#c0946f pid:783366277 | |
iyr:1932 hgt:172 ecl:blu | |
hcl:#733820 byr:1962 pid:554221464 | |
cid:169 pid:922622614 | |
byr:1942 hcl:#ceb3a1 hgt:169cm eyr:2024 | |
ecl:gry iyr:2017 | |
cid:219 ecl:grn | |
hgt:156cm byr:1998 eyr:2021 | |
iyr:2017 hcl:#ceb3a1 pid:450186263 | |
ecl:amb hgt:179cm pid:768428582 iyr:2010 eyr:2023 byr:1952 hcl:#fffffd | |
eyr:2024 | |
hgt:193cm | |
iyr:2017 pid:469033795 byr:1979 hcl:#18171d cid:67 ecl:amb | |
iyr:2016 byr:1937 pid:798267514 hgt:155cm hcl:#866857 eyr:2026 | |
ecl:oth | |
hgt:172cm hcl:#866857 iyr:2018 pid:662186551 | |
byr:1996 | |
eyr:2025 ecl:amb | |
pid:2854521962 | |
iyr:2021 | |
ecl:zzz | |
hcl:12f1ba eyr:2037 hgt:159cm | |
byr:1937 | |
ecl:oth pid:488050418 byr:1927 hcl:#a97842 hgt:153cm iyr:2013 eyr:2024 | |
pid:119536312 ecl:#2036ad | |
hcl:543178 iyr:2020 | |
byr:2013 | |
hgt:177cm | |
eyr:2022 | |
pid:788908662 hcl:#602927 eyr:2029 | |
ecl:oth byr:1930 | |
iyr:2020 | |
hgt:179cm | |
byr:1972 | |
pid:053386972 iyr:2014 ecl:grn hgt:65in hcl:#cfa07d | |
pid:9828921035 ecl:blu | |
hcl:z hgt:152in | |
eyr:1949 byr:2010 | |
cid:157 pid:097910554 byr:1999 | |
hgt:159cm hcl:#6b5442 ecl:blu eyr:2024 | |
iyr:2010 | |
hcl:#a97842 | |
eyr:2040 ecl:#f8ad77 | |
hgt:173cm | |
byr:2019 iyr:2010 | |
pid:#d16a6e | |
ecl:dne hgt:191cm iyr:2020 hcl:#b6652a | |
eyr:2021 pid:571971509 byr:1983 | |
hcl:#18171d iyr:2016 pid:159074622 | |
eyr:2027 hgt:163cm byr:1954 | |
cid:257 | |
pid:243560302 cid:58 | |
hcl:53a4cf byr:2012 | |
ecl:#fdbfb8 eyr:1920 hgt:179 iyr:2026 | |
pid:040606106 eyr:2030 hgt:188cm | |
byr:1969 | |
iyr:2012 hcl:#ceb3a1 ecl:amb | |
eyr:2022 | |
hgt:175cm hcl:#b6652a byr:1967 pid:269969031 | |
iyr:2018 | |
hcl:#18171d cid:278 byr:1931 | |
pid:134809791 | |
eyr:2035 ecl:#44e6cd iyr:1993 | |
hgt:177in | |
ecl:utc cid:289 | |
iyr:1923 | |
hcl:13a67a pid:3045345984 byr:2030 eyr:1944 | |
pid:839901650 eyr:2030 | |
ecl:grn | |
byr:2015 iyr:2017 hgt:168 hcl:131f4e | |
iyr:2015 pid:529736732 ecl:brn hgt:176cm | |
eyr:2026 byr:1952 hcl:#6b5442 | |
hcl:#c0946f | |
cid:323 pid:303966428 iyr:2019 | |
eyr:2027 hgt:170cm | |
byr:2001 | |
ecl:brn | |
pid:193678728 hgt:72in eyr:2027 iyr:2015 byr:1951 ecl:gry hcl:#18171d | |
eyr:2026 cid:283 | |
iyr:1938 pid:687430885 | |
hgt:186cm | |
byr:1949 ecl:#521638 hcl:d13b2f | |
eyr:2024 hcl:#ceb3a1 iyr:2013 ecl:brn | |
hgt:168cm pid:792088241 | |
hcl:#888785 ecl:amb | |
byr:2009 iyr:2015 | |
hgt:151cm | |
eyr:2020 pid:223927808 | |
byr:1926 | |
pid:717704850 | |
hcl:#623a2f eyr:2022 hgt:64in iyr:2018 ecl:gry | |
eyr:2023 byr:1954 | |
hgt:169cm | |
ecl:hzl | |
iyr:2010 pid:116868997 hcl:#18171d | |
ecl:hzl byr:1965 hcl:#a97842 iyr:2011 pid:506354451 hgt:172cm eyr:2029 | |
eyr:2022 pid:994565705 | |
iyr:2013 ecl:brn hcl:#623a2f | |
byr:1979 | |
iyr:2011 | |
byr:1931 hgt:183cm hcl:#284f26 cid:306 | |
ecl:amb eyr:2021 | |
pid:977533079 | |
eyr:2027 | |
iyr:2011 ecl:gry | |
byr:1993 | |
pid:272334781 hgt:161cm hcl:#9a35b6 | |
eyr:2026 | |
hcl:#602927 ecl:blu | |
pid:212300161 byr:1946 | |
cid:193 iyr:2020 hgt:157cm | |
pid:538594567 byr:1976 eyr:2027 hcl:#efcc98 iyr:2011 hgt:154cm ecl:oth | |
byr:1949 | |
hcl:z ecl:#ce67aa | |
eyr:1942 pid:7978941589 iyr:2025 hgt:161in | |
hcl:#c0946f | |
cid:55 | |
byr:1963 ecl:blu hgt:161cm | |
pid:547120453 iyr:2015 eyr:2021 | |
hgt:173cm eyr:2022 | |
iyr:2016 byr:2001 | |
ecl:hzl pid:239803460 | |
hcl:#b6652a ecl:oth eyr:2021 hgt:167cm pid:401266644 iyr:1969 byr:1974 | |
eyr:2030 pid:581963885 | |
hcl:#64cb23 | |
ecl:blu | |
byr:1928 hgt:181cm iyr:2018 | |
pid:186338247 | |
ecl:hzl hgt:193cm hcl:#ceb3a1 | |
eyr:2022 iyr:2010 | |
iyr:2015 ecl:gry hgt:159cm eyr:2027 hcl:#ceb3a1 | |
byr:1925 pid:715902111 cid:149 | |
iyr:2018 hcl:#623a2f eyr:2020 hgt:162cm ecl:grn cid:135 | |
byr:1922 | |
pid:373216777 | |
eyr:2020 pid:749899012 hcl:#888785 ecl:brn | |
iyr:2010 cid:225 hgt:172cm | |
byr:1972 | |
iyr:2020 hgt:178cm ecl:grn hcl:#18171d pid:613792489 cid:240 | |
eyr:2028 | |
byr:1972 | |
iyr:2015 byr:1938 eyr:2026 | |
cid:113 ecl:grn | |
pid:846231640 hgt:161cm | |
hcl:#b6652a | |
ecl:gry | |
hcl:#ceb3a1 | |
byr:1956 cid:338 pid:936012518 | |
hgt:62in | |
eyr:2029 iyr:2016 | |
pid:730866353 ecl:brn byr:1986 | |
iyr:2014 | |
hgt:190cm | |
eyr:2021 hcl:#a97842 cid:126 | |
eyr:2021 | |
cid:180 pid:958310635 ecl:brn iyr:2015 hgt:189cm hcl:#efcc98 | |
hgt:188cm ecl:hzl pid:179001863 iyr:2016 eyr:2029 hcl:#341e13 byr:1932 | |
cid:77 eyr:2027 hcl:#623a2f iyr:2016 ecl:brn hgt:170cm | |
byr:1947 | |
hgt:66in pid:617518313 iyr:2013 byr:1977 hcl:#b6652a ecl:brn eyr:2025 | |
pid:787861420 | |
iyr:2014 hcl:#623a2f hgt:61in | |
ecl:oth cid:78 | |
eyr:2022 byr:1975 | |
ecl:hzl | |
iyr:2017 eyr:2028 hcl:#602927 | |
byr:1958 pid:985208714 | |
hgt:160cm | |
byr:2002 | |
iyr:2013 | |
hcl:#341e13 pid:188110633 ecl:gry hgt:169cm | |
eyr:2025 | |
byr:1981 | |
eyr:2028 | |
hcl:#341e13 ecl:amb hgt:160cm cid:121 | |
iyr:2015 pid:963848397 | |
iyr:2013 hcl:#866857 pid:#db8648 eyr:2021 ecl:gry | |
byr:1975 | |
hgt:153cm cid:114 | |
hgt:109 | |
cid:287 hcl:#6b5442 | |
iyr:2028 byr:1926 eyr:2036 pid:2378208387 | |
ecl:#245a62 | |
pid:857722366 | |
byr:1975 eyr:2027 | |
ecl:grn iyr:2019 hcl:#0afad1 | |
hgt:66in | |
byr:1935 hcl:#cfa07d hgt:173cm ecl:brn eyr:2021 iyr:2019 | |
cid:66 eyr:2024 hcl:#efcc98 byr:2002 iyr:2010 | |
hgt:176cm pid:697153153 ecl:amb | |
iyr:2019 | |
hcl:#cfa07d ecl:blu | |
pid:695914972 | |
eyr:2024 | |
hgt:158cm | |
byr:1943 | |
ecl:xry hgt:62in | |
pid:14733148 cid:148 | |
iyr:2016 byr:1925 hcl:#6b5442 | |
eyr:2028 | |
iyr:2025 | |
cid:53 hgt:132 ecl:gmt hcl:159b19 | |
pid:156cm | |
byr:2025 eyr:2001 | |
hcl:#623a2f ecl:oth byr:1974 iyr:2018 hgt:161cm eyr:2029 pid:6826285172 | |
ecl:gry | |
byr:1956 hcl:#7d3b0c hgt:170cm iyr:2020 | |
eyr:2020 | |
pid:#946a88 hgt:186cm hcl:#733820 byr:1946 ecl:#016645 iyr:2015 | |
hgt:181cm hcl:#888785 iyr:2013 pid:634152817 | |
byr:1982 cid:245 ecl:grn eyr:2021 | |
ecl:brn | |
pid:737531770 iyr:2010 | |
eyr:2020 | |
byr:1929 hgt:189cm hcl:#c0946f | |
cid:158 iyr:2019 hcl:#341e13 eyr:2027 ecl:amb | |
byr:1986 pid:834976623 | |
pid:976934668 cid:61 eyr:2020 iyr:2020 | |
hgt:76in byr:1927 ecl:amb | |
hcl:#e05ee3 | |
pid:526042518 iyr:2019 eyr:2027 hcl:#623a2f byr:1976 ecl:amb | |
pid:279367290 hcl:#a97842 hgt:158cm | |
eyr:2027 | |
byr:1959 | |
iyr:2020 | |
ecl:xry byr:2028 | |
pid:357216861 hcl:#a97842 eyr:2024 hgt:66cm | |
iyr:2012 | |
hgt:188in | |
ecl:lzr cid:64 eyr:1958 byr:2014 hcl:z pid:285207570 iyr:2026 | |
eyr:1973 iyr:2017 ecl:oth cid:282 pid:695814158 | |
hcl:z | |
iyr:2010 pid:661168409 | |
hcl:#53c696 | |
hgt:186cm ecl:amb | |
byr:1960 | |
eyr:2029 | |
eyr:1982 hgt:169cm | |
iyr:2002 byr:2025 hcl:327f93 pid:831648100 | |
byr:1967 ecl:oth | |
eyr:2021 | |
hcl:#602927 iyr:2014 | |
pid:274974402 hgt:183cm | |
""" | |
TEST_VALID = """ | |
pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980 | |
hcl:#623a2f | |
eyr:2029 ecl:blu cid:129 byr:1989 | |
iyr:2014 pid:896056539 hcl:#a97842 hgt:165cm | |
hcl:#888785 | |
hgt:164cm byr:2001 iyr:2015 cid:88 | |
pid:545766238 ecl:hzl | |
eyr:2022 | |
iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719 | |
""" | |
TEST_INVALID = """ | |
eyr:1972 cid:100 | |
hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926 | |
iyr:2019 | |
hcl:#602927 eyr:1967 hgt:170cm | |
ecl:grn pid:012533040 byr:1946 | |
hcl:dab227 iyr:2012 | |
ecl:brn hgt:182cm pid:021572410 eyr:2020 byr:1992 cid:277 | |
hgt:59cm ecl:zzz | |
eyr:2038 hcl:74454a iyr:2023 | |
pid:3556412378 byr:2007 | |
""" | |
def parse(input): | |
passports = [] | |
passport = {} | |
for line in input.split("\n"): | |
if line: | |
for field in line.split(" "): | |
k, v = field.split(":") | |
passport[k] = v | |
else: | |
if passport: | |
passports.append(passport) | |
passport = {} | |
return passports | |
test_input = parse(TEST_INPUT) | |
input = parse(INPUT) | |
test_valid = parse(TEST_VALID) | |
test_invalid = parse(TEST_INVALID) | |
from oso import Oso | |
oso = Oso() | |
oso.register_constant(test_input, "test_input") | |
oso.register_constant(input, "input") | |
oso.register_constant(test_valid, "test_valid") | |
oso.register_constant(test_invalid, "test_invalid") | |
class Hack: | |
@classmethod | |
def int(cls, x): | |
try: | |
return int(x) | |
except ValueError: | |
pass | |
@classmethod | |
def len(cls, s): | |
return len(s) | |
@classmethod | |
def get(cls, s, i): | |
return s[i] | |
@classmethod | |
def substr(cls, s, start, end): | |
return s[start:end] | |
oso.register_constant(Hack, "hack") | |
oso.load_file("day4.polar") | |
# oso.repl() | |
count = 0 | |
successes = 0 | |
for test in input: | |
count += 1 | |
if list(oso.query_rule("valid_passport", test)): | |
successes += 1 | |
print(count, successes) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Today's problem should have been a perfect fit for polar. Given a bunch of passport data, count the number of valid passports according to a bunch of rules.
The parsing of the raw data to dictionaries is basically impossible in polar so I did it in python.
Rule matching seems like it would be perfect for polar but many of the rules involved parsing things into ints or checking substrings, things you can't really do in native polar. Having a standard library is absolutely gonna be something we have to do. I sorta hacked in the stuff I needed for today in the Hack class.
I hit a bug, this didn't work.
forall(c in "1af", c in "0123456789abcdf")
I think we even say this works in our docs. Not sure why it didn't work. Each part of that works by itself but doesn't work in a
forall
like that.Counting the number of elements in a list that match something is really painful in polar. You have to do it with a recursive rule which grows the stack as it evaluates. It's really slow, awkward to write and for big lists just doesn't work because you'll time out or blow the polar stack.