Skip to content

Instantly share code, notes, and snippets.

@saolsen
Created December 4, 2020 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saolsen/114e4a8fca950cf143ff1924f13629a3 to your computer and use it in GitHub Desktop.
Save saolsen/114e4a8fca950cf143ff1924f13629a3 to your computer and use it in GitHub Desktop.
a0c 2020 day4
# 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.
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)
@saolsen
Copy link
Author

saolsen commented Dec 4, 2020

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment