diff --git a/lib/day4/day4.ex b/lib/day4/day4.ex new file mode 100644 index 0000000..d78b5fc --- /dev/null +++ b/lib/day4/day4.ex @@ -0,0 +1,144 @@ +defmodule Day4 do + @example """ + 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 + """ + + def part1(example \\ false) do + count_all_valid(example, false) + end + + def part2(example \\ false) do + count_all_valid(example, true) + end + + def count_all_valid(example, check_values) do + if(example, do: @example, else: File.read!("lib/day4/input.txt")) + |> String.trim() + |> String.split("\n\n") + |> parse_input() + |> count_valid(check_values) + end + + def parse_input(inputs) do + Enum.map(inputs, fn input -> + input + |> String.split() + |> Enum.reduce(%{}, fn pair, acc -> + [k, v] = String.split(pair, ":") + Map.put(acc, k, v) + end) + end) + end + + @doc """ + iex> Day4.validate_byr("2002") + true + iex> Day4.validate_byr("2003") + false + """ + def validate_byr(v) do + Regex.match?(~r/(^19[2-9][0-9]|200[0-2])$/, v) + end + + @doc """ + iex> Day4.validate_iyr("2010") + true + iex> Day4.validate_iyr("2009") + false + iex> Day4.validate_iyr("2021") + false + """ + def validate_iyr(v) do + Regex.match?(~r/^(201\d|2020)$/, v) + end + + @doc """ + iex> Day4.validate_eyr("2020") + true + iex> Day4.validate_eyr("2030") + true + iex> Day4.validate_eyr("2019") + false + iex> Day4.validate_eyr("2031") + false + """ + def validate_eyr(v) do + Regex.match?(~r/^(202\d|2030)$/, v) + end + + @doc """ + iex> Day4.validate_hgt("60in") + true + iex> Day4.validate_hgt("190cm") + true + iex> Day4.validate_hgt("190in") + false + iex> Day4.validate_hgt("190") + false + """ + def validate_hgt(v) do + Regex.match?(~r/^(1[5-8]\dcm|19[0-9]cm|59in|6\din|7[0-6]in)$/, v) + end + + @doc """ + iex> Day4.validate_hcl("#123abc") + true + iex> Day4.validate_hcl("#123ABC") + true + iex> Day4.validate_hcl("#123abz") + false + iex> Day4.validate_hcl("123abc") + false + """ + def validate_hcl(v) do + Regex.match?(~r/#[0-9a-f]{6}/i, v) + end + + @doc """ + iex> Day4.validate_ecl("brn") + true + iex> Day4.validate_ecl("wat") + false + """ + def validate_ecl(v) do + Regex.match?(~r/^(amb|b(lu|rn)|gr[yn]|hzl|oth)$/i, v) + end + + @doc """ + iex> Day4.validate_pid("000000001") + true + iex> Day4.validate_pid("0123456789") + true + """ + def validate_pid(v) do + Regex.match?(~r/^\d{9}$/, v) + end + + @required_keys ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] + + def count_valid(data, check_values) do + Enum.count(data, fn passport -> + is_valid(passport, check_values) + end) + end + + def is_valid(data, check_values) do + Enum.all?(@required_keys, fn k -> + Map.has_key?(data, k) && + (!check_values || + apply(Day4, String.to_atom("validate_#{k}"), [Map.fetch!(data, k)])) + end) + end +end diff --git a/lib/day4/input.txt b/lib/day4/input.txt new file mode 100644 index 0000000..745e4ee --- /dev/null +++ b/lib/day4/input.txt @@ -0,0 +1,957 @@ +iyr:1928 cid:150 pid:476113241 eyr:2039 hcl:a5ac0f +ecl:#25f8d2 +byr:2027 hgt:190 + +hgt:168cm eyr:2026 ecl:hzl hcl:#fffffd cid:169 pid:920076943 +byr:1929 iyr:2013 + +hgt:156cm ecl:brn eyr:2023 +iyr:2011 +hcl:#6b5442 pid:328412891 byr:1948 + +byr:1950 iyr:2019 eyr:2020 ecl:amb cid:279 pid:674907993 hgt:189cm hcl:#602927 + +byr:1976 +ecl:hzl iyr:2015 hgt:178cm eyr:2022 hcl:#341e13 +pid:473630095 + +iyr:2020 eyr:2023 ecl:blu byr:1984 +hgt:163cm hcl:#866857 pid:628113926 + +ecl:amb +pid:312508073 +hgt:70in byr:1922 iyr:2019 eyr:2030 hcl:#866857 + +hcl:#007d7c pid:195125455 cid:213 hgt:154cm eyr:2021 ecl:grn byr:1981 + +ecl:oth hgt:185cm pid:958027833 hcl:#b6652a iyr:2028 cid:171 +eyr:1994 + +ecl:hzl byr:1982 hcl:#fffffd hgt:188cm iyr:2018 pid:039931872 cid:288 eyr:2025 + +cid:71 iyr:2012 byr:1950 hcl:#7d3b0c pid:803324747 eyr:2023 hgt:151cm ecl:oth + +iyr:2013 +ecl:grn eyr:2022 +pid:053411982 byr:1946 cid:302 hcl:#60ca85 +hgt:160cm + +hgt:169cm eyr:2035 pid:023983645 iyr:2014 ecl:amb hcl:#c0946f byr:1975 cid:258 + +byr:1933 ecl:hzl +hcl:#c0946f iyr:2013 pid:655452550 +hgt:170cm +eyr:2024 + +hgt:156 +ecl:oth +cid:235 +pid:609823906 iyr:2016 eyr:2021 hcl:#6b5442 +byr:1932 + +iyr:2006 +hgt:103 ecl:#2d77e5 cid:214 byr:2018 hcl:6c53a4 pid:190cm eyr:1940 + +ecl:grn +pid:497830156 byr:2002 eyr:2023 hgt:169cm iyr:2016 hcl:#733820 + +ecl:gmt hgt:75cm byr:2007 eyr:2037 iyr:2028 hcl:4591f6 cid:118 + +cid:94 +ecl:hzl byr:1972 hcl:#7d3b0c iyr:2015 pid:219956257 +eyr:2022 hgt:165cm + +eyr:2022 hgt:180cm ecl:amb hcl:#c0946f +pid:543330083 +iyr:2014 +cid:286 byr:1989 + +ecl:hzl eyr:2027 iyr:2019 pid:125201586 +byr:1947 cid:74 hcl:#341e13 + +iyr:2020 hgt:192cm ecl:oth +pid:651509606 byr:1965 eyr:2029 +hcl:#b6652a + +hgt:165cm eyr:2025 ecl:oth pid:844167324 byr:1950 iyr:2014 hcl:#a97842 + +hgt:159cm +byr:1945 hcl:#6b5442 iyr:2027 +eyr:2024 +cid:94 ecl:brn pid:476551927 + +pid:479260033 hcl:#efcc98 iyr:2018 ecl:grn +byr:1993 cid:92 hgt:165cm +eyr:2027 + +iyr:2015 pid:106083602 +hgt:168cm eyr:2025 ecl:gry byr:1996 cid:341 +hcl:#fffffd + +iyr:2010 hgt:192cm +pid:247508683 ecl:#57a15d byr:1972 +hcl:#602927 eyr:2024 + +ecl:blu byr:1934 hcl:#888785 iyr:2019 pid:905361316 eyr:2021 hgt:150cm + +hgt:184cm hcl:#cfa07d cid:335 iyr:2018 byr:1995 +ecl:grn eyr:2026 pid:435090537 + +pid:302395756 +ecl:grn hcl:z byr:2005 hgt:111 eyr:2031 cid:147 + +ecl:gry pid:561021264 cid:178 byr:1980 iyr:2010 +eyr:2028 hcl:#7d3b0c hgt:181cm + +hgt:172cm byr:1923 pid:741415636 ecl:grn eyr:2022 iyr:2013 + +pid:457776708 +byr:1992 +hcl:#b6652a hgt:157cm eyr:2024 iyr:2011 + +pid:177860177 +ecl:blu +hgt:154cm hcl:#cfa07d iyr:2015 eyr:2022 +byr:1977 + +pid:992814815 eyr:2028 iyr:2017 hgt:181cm hcl:#cfa07d +byr:1961 ecl:hzl + +eyr:2025 hcl:#a97842 +byr:1930 pid:468404395 +iyr:2013 ecl:oth cid:220 hgt:170cm + +cid:198 +iyr:2018 hcl:#a97842 hgt:74in +pid:279483949 eyr:2029 ecl:gry byr:1931 + +byr:2004 iyr:2021 pid:165cm ecl:#7e7d04 +hcl:#18171d +eyr:2035 hgt:61 + +ecl:#492a33 +hgt:168cm +iyr:2018 +byr:2017 cid:293 +pid:1764204298 hcl:#cfa07d eyr:2022 + +hcl:#866857 +eyr:2026 +cid:193 hgt:160cm byr:1970 iyr:2011 ecl:amb pid:895650554 + +eyr:2022 +iyr:2018 +hcl:#efcc98 cid:181 +byr:2029 ecl:utc hgt:188cm pid:332630362 + +hcl:#ceb3a1 +iyr:2013 pid:592603167 +cid:95 ecl:blu eyr:2022 + +hcl:#efcc98 +iyr:2011 pid:550968343 +ecl:hzl byr:1924 eyr:2022 +hgt:191cm cid:120 + +hgt:150cm ecl:grn +hcl:8f3824 pid:735766540 eyr:2029 +byr:2000 iyr:2015 + +hcl:z +ecl:hzl byr:2003 hgt:118 eyr:2008 iyr:2022 +pid:157cm + +byr:1950 ecl:blu hgt:163cm +pid:455597862 cid:302 eyr:2027 +hcl:#341e13 iyr:2015 + +iyr:2015 ecl:oth eyr:2023 byr:1998 hcl:#ceb3a1 cid:136 pid:253146183 +hgt:179cm + +iyr:2018 hcl:#cfa07d cid:80 +pid:347839572 byr:1946 eyr:2023 ecl:blu +hgt:163cm + +iyr:1969 cid:324 eyr:1927 ecl:lzr +hcl:z +byr:2030 hgt:172cm +pid:#997235 + +iyr:2017 ecl:brn +hgt:165cm +pid:818623102 byr:1968 hcl:#fffffd eyr:2020 + +eyr:2023 byr:1966 ecl:blu +cid:295 pid:347753668 +hcl:#c0946f +iyr:2010 hgt:163cm + +hcl:#ceb3a1 pid:395843182 hgt:168cm eyr:2025 iyr:2014 byr:1991 ecl:gry cid:283 + +iyr:2011 byr:1928 pid:438089427 +hgt:152cm +ecl:hzl eyr:2022 cid:254 hcl:#866857 + +iyr:2015 +hcl:#ceb3a1 +ecl:lzr eyr:2022 hgt:173cm pid:1799325911 cid:210 byr:2018 + +iyr:2010 +pid:121142355 +eyr:2020 +cid:302 +hgt:158cm ecl:amb +byr:1978 hcl:#623a2f + +pid:110863702 +hcl:#341e13 iyr:2017 byr:1942 hgt:175cm cid:277 eyr:2030 +ecl:amb + +hcl:#c0946f +pid:473360783 byr:1986 +hgt:159cm ecl:brn +iyr:2011 eyr:2023 + +iyr:2015 hcl:#733820 pid:245692263 +ecl:oth byr:1960 eyr:2022 + +hcl:b9c0fd iyr:1996 hgt:83 +byr:2029 pid:#449a30 +ecl:grt eyr:1925 + +hgt:68cm +eyr:2039 hcl:#cfa07d +pid:193cm iyr:1984 +ecl:#b9ec76 + +eyr:2023 ecl:amb +byr:1942 +iyr:2012 hcl:#b6652a hgt:156cm pid:398126488 + +ecl:oth hgt:150cm byr:1937 pid:927692980 iyr:2013 eyr:2023 hcl:#623a2f + +eyr:2026 byr:1921 pid:297672804 hgt:172cm iyr:2011 ecl:brn + +eyr:2026 cid:241 +hcl:#341e13 +pid:316611397 hgt:193cm +byr:1977 + +pid:509492550 hgt:64cm eyr:2030 hcl:#b6652a byr:1986 iyr:1922 ecl:gry + +hgt:165cm cid:248 hcl:#6b5442 eyr:2026 +pid:703744314 +byr:1921 iyr:2020 +ecl:blu + +byr:2001 pid:332016728 +iyr:2018 cid:89 +eyr:2031 hgt:155cm ecl:zzz +hcl:#866857 + +byr:2023 +hcl:z pid:3586415546 iyr:2022 cid:209 hgt:188in ecl:brn + +ecl:grn +hgt:61in iyr:1925 byr:1984 hcl:#733820 +pid:216995428 eyr:1944 + +byr:1969 hcl:#a97842 cid:226 +iyr:2011 pid:621770561 +eyr:2024 ecl:blu + +hcl:#efcc98 eyr:2024 +iyr:2010 ecl:hzl +pid:153620883 byr:1957 + +iyr:2015 +cid:162 eyr:2020 +pid:89806820 byr:1955 +hcl:b043dd ecl:brn + +hgt:162cm +hcl:2ee8db +byr:2008 iyr:2003 pid:50279629 eyr:2030 ecl:grt + +pid:939011546 byr:1945 +hgt:70in hcl:#cfa07d eyr:2027 ecl:grn iyr:2015 + +hgt:83 ecl:hzl hcl:z eyr:2026 byr:2029 + +cid:244 hcl:#623a2f iyr:2012 pid:527925497 +byr:1957 +eyr:2024 ecl:brn + +hgt:179cm +byr:1928 +pid:933893768 hcl:#18171d ecl:gry iyr:2016 eyr:2027 + +hgt:158cm iyr:2017 ecl:brn byr:1935 eyr:2020 +pid:331047535 cid:345 hcl:#888785 + +byr:2009 +ecl:#893922 +iyr:2020 hcl:a59633 hgt:170in eyr:1995 +pid:28540793 + +byr:1955 hgt:68cm +hcl:#67dac3 eyr:2031 pid:502641687 ecl:oth iyr:1922 + +pid:2523045951 cid:203 hgt:75cm eyr:2031 hcl:#888785 +iyr:1937 byr:1988 + +pid:558076850 eyr:2030 +hgt:192cm ecl:brn +cid:296 byr:1954 +hcl:#733820 iyr:2012 + +cid:272 eyr:2030 pid:044961585 +hcl:#602927 byr:1990 hgt:173cm ecl:gry iyr:2018 + +byr:1958 iyr:2019 hgt:163cm eyr:2029 +pid:384542472 hcl:819959 +ecl:#866be8 + +iyr:2027 +pid:7267919678 byr:2013 hgt:161in hcl:z ecl:brn + +pid:855195796 ecl:oth +eyr:2030 hgt:163cm hcl:#341e13 byr:1978 +iyr:2011 cid:206 + +ecl:brn eyr:2029 hcl:#fffffd iyr:2018 pid:065149883 byr:1938 hgt:178cm + +eyr:2024 +byr:1983 +ecl:gry +hgt:154cm +iyr:2019 +pid:#f331f5 hcl:#7d3b0c cid:315 + +ecl:brn pid:131551626 iyr:2013 eyr:2022 byr:1949 +hgt:155cm hcl:#18171d + +cid:203 eyr:2028 iyr:2019 +byr:1939 +hcl:#18171d pid:091534428 hgt:175cm + +byr:1921 eyr:2025 iyr:2014 pid:719127279 ecl:brn hcl:#cfa07d cid:243 hgt:176cm + +byr:1976 hgt:182cm +ecl:gry pid:534666141 +iyr:2019 eyr:2027 cid:197 hcl:#602927 + +byr:2015 +pid:164cm hgt:90 eyr:2036 iyr:1947 hcl:b7b0e6 ecl:#fd96b3 + +eyr:2029 cid:264 pid:931433692 +byr:1974 ecl:oth hcl:z hgt:67in iyr:2012 + +pid:179cm ecl:#00a56d +eyr:2025 hcl:eed83e iyr:1949 hgt:177in + +hgt:159cm ecl:blu +pid:5642951907 iyr:2029 byr:1952 +hcl:#6b5442 + +ecl:amb hgt:163cm +pid:811866600 byr:1952 +iyr:2019 hcl:#888785 +cid:250 eyr:2027 + +byr:1953 hgt:190cm +pid:156cm hcl:#7d3b0c eyr:2022 ecl:#1b0b35 iyr:2015 + +pid:709465009 byr:1971 iyr:2018 hcl:#602927 ecl:oth +cid:222 eyr:2025 + +hcl:#623a2f pid:583448566 +byr:1999 +eyr:2026 hgt:179cm +iyr:2015 ecl:gry cid:55 + +hgt:179cm iyr:2013 ecl:amb hcl:#95766f pid:620956072 +byr:1997 eyr:2026 + +ecl:blu iyr:1924 pid:866797032 hgt:193cm cid:90 hcl:#fffffd eyr:1998 byr:1990 + +hcl:#733820 ecl:brn byr:1950 eyr:2028 +hgt:155cm iyr:2017 +pid:605542221 + +hgt:171cm iyr:2019 byr:1930 +ecl:hzl +eyr:2026 hcl:#a6ef22 pid:294449839 + +pid:480248391 +hgt:150cm eyr:2027 cid:226 hcl:#cfa07d +byr:1940 ecl:brn +iyr:2018 + +hcl:z ecl:#769ca0 pid:180cm +byr:1922 iyr:2026 eyr:2028 +hgt:180cm + +ecl:lzr byr:1967 pid:50313895 hcl:34441e hgt:158in iyr:2030 eyr:2039 + +iyr:2025 +pid:2210753 byr:2010 hgt:173cm cid:208 +eyr:2008 hcl:de66d6 +ecl:grt + +iyr:2018 eyr:2026 +cid:289 byr:1992 +hgt:170cm pid:856187601 ecl:gry hcl:#efcc98 + +cid:94 byr:1934 hgt:59in eyr:2022 +hcl:#623a2f pid:573884719 +iyr:2016 ecl:oth + +pid:206185815 ecl:grn hcl:#cfa07d eyr:2027 +iyr:2018 byr:1989 +hgt:176cm + +hgt:175cm byr:1999 +pid:409477026 +hcl:#cfa07d +ecl:amb eyr:2021 iyr:2017 cid:75 + +byr:2018 +cid:150 eyr:2033 pid:043853978 iyr:2017 hgt:61cm hcl:z +ecl:#f19d87 + +pid:549507973 hgt:178cm byr:1929 ecl:oth +iyr:2020 eyr:2025 +hcl:#7d3b0c + +iyr:2014 hgt:171cm ecl:blu byr:1999 +hcl:#6b5442 pid:813505466 +eyr:2029 + +ecl:zzz eyr:2034 +byr:2022 +pid:52407584 iyr:2016 hcl:#888785 +hgt:176in + +ecl:oth +byr:1994 iyr:2018 hgt:64in pid:136896463 +eyr:2022 +hcl:#a97842 + +ecl:#535e3c hgt:84 +eyr:1963 hcl:z +iyr:1986 pid:187cm byr:2028 cid:258 + +eyr:2029 +cid:257 hgt:175cm +ecl:oth iyr:2016 +hcl:#602927 pid:506432649 + +iyr:2015 hgt:165cm +ecl:gmt cid:116 hcl:z +byr:1998 +eyr:2021 +pid:170cm + +iyr:2023 hgt:178cm cid:109 pid:#6eca6e hcl:#7d3b0c eyr:1961 +ecl:xry byr:2012 + +eyr:2025 +ecl:grn +pid:708755870 hgt:189cm hcl:#e23d5f +iyr:2017 byr:1982 + +hcl:#866857 pid:85618849 ecl:brn byr:1958 eyr:2025 +hgt:111 +cid:190 + +hgt:75cm byr:1983 iyr:2000 +eyr:2007 +cid:307 +pid:227345093 ecl:#080923 hcl:#ceb3a1 + +hcl:#602927 +ecl:oth hgt:158cm byr:1992 iyr:2012 pid:708206240 +eyr:2026 cid:125 + +eyr:1920 pid:873476029 hgt:192cm byr:1971 ecl:gry iyr:2020 hcl:#f463f6 + +pid:295847270 hcl:#7d3b0c ecl:oth iyr:2015 +byr:2000 hgt:181cm eyr:2025 + +hgt:189cm +hcl:#18171d iyr:2013 +pid:686835652 byr:1972 +ecl:grn eyr:2029 + +iyr:2010 +ecl:grn hgt:63cm eyr:2027 hcl:#602927 pid:240973955 byr:1984 cid:280 + +pid:883408516 eyr:2022 +iyr:2010 hgt:182cm ecl:hzl byr:2000 cid:220 + +iyr:2018 pid:026680847 cid:117 hcl:#602927 hgt:67cm ecl:xry eyr:2030 +byr:1989 + +byr:1933 ecl:hzl +hgt:179cm +pid:500053352 eyr:2020 hcl:#fffffd +iyr:2014 + +hgt:153cm +pid:523083973 ecl:brn +iyr:2011 byr:2000 hcl:#cfa07d +eyr:2020 cid:114 + +hcl:#efcc98 ecl:blu +byr:1974 iyr:2019 +hgt:165cm +eyr:2020 pid:755433303 + +eyr:2022 +ecl:amb byr:1927 iyr:2012 pid:409960222 hcl:#733820 hgt:169cm cid:336 + +ecl:#564a01 +hgt:136 iyr:1984 +pid:#646419 +eyr:2032 +hcl:z + +hgt:71in hcl:14d37b +byr:2017 cid:243 ecl:zzz pid:208245975 +iyr:2029 + +byr:1974 hcl:#6b5442 pid:562222331 hgt:68in +cid:319 +ecl:grn +iyr:2012 eyr:2028 + +iyr:2010 byr:1948 hgt:169cm eyr:2022 hcl:#623a2f +cid:93 ecl:hzl + +cid:347 +byr:1939 hgt:151cm eyr:2026 +iyr:2010 +hcl:#fffffd ecl:gry +pid:562919031 + +hgt:171cm +iyr:2010 pid:812511153 byr:1971 eyr:2026 ecl:hzl +hcl:#6b5442 + +cid:319 eyr:2026 iyr:2013 +hgt:155in +hcl:z pid:185cm + +hgt:178cm ecl:gry cid:139 hcl:#341e13 pid:390510619 eyr:2026 iyr:2012 +byr:1952 + +eyr:2025 pid:78761845 +hcl:#866857 iyr:2019 +hgt:173cm ecl:blu byr:1936 + +eyr:2028 hgt:192cm +byr:1946 pid:897533472 ecl:brn hcl:#efcc98 + +pid:467427172 hcl:#efcc98 +eyr:2021 byr:1923 +iyr:2012 cid:139 hgt:176cm + +iyr:2015 eyr:2028 +pid:069618718 +hgt:190cm ecl:grn hcl:#888785 +byr:1956 cid:68 + +ecl:brn hgt:173cm eyr:2022 +iyr:2010 pid:525711593 byr:1990 + +cid:292 +ecl:blu hcl:#602927 hgt:67in iyr:2011 byr:1990 eyr:2027 pid:298224903 + +hgt:159cm eyr:2029 pid:854089988 iyr:2018 ecl:gry byr:1962 hcl:#efcc98 + +ecl:grn byr:1964 eyr:2022 +hgt:61in pid:202756433 hcl:#cfa07d cid:241 +iyr:2015 + +hgt:68in byr:1973 hcl:#18171d ecl:hzl +pid:701847555 eyr:2030 iyr:2019 + +eyr:2022 +ecl:grn hgt:151cm iyr:2020 hcl:#83f878 byr:1982 pid:816902510 + +cid:130 hgt:187in eyr:2040 +ecl:brn +iyr:2020 +hcl:z pid:7364218001 +byr:1949 + +hgt:183cm +eyr:2023 iyr:2019 byr:1946 pid:684966686 +cid:307 ecl:brn hcl:#cfa07d + +hcl:#6b5442 eyr:2024 pid:7727182081 +iyr:2017 +hgt:110 ecl:dne + +ecl:blu byr:1987 cid:167 iyr:2015 hgt:189cm +pid:797675433 eyr:2024 hcl:#6b5442 + +iyr:2018 byr:1929 ecl:brn hgt:60in eyr:2024 pid:152cm hcl:#a97842 + +iyr:2020 eyr:2025 byr:1942 pid:007017276 ecl:oth hgt:170cm +hcl:#ceb3a1 cid:104 + +iyr:2012 ecl:oth eyr:2020 +byr:1965 hcl:#efcc98 +hgt:173cm +cid:102 pid:302599543 + +hgt:187cm pid:958933966 +ecl:hzl byr:1955 +eyr:2027 hcl:#6b5442 + +ecl:oth iyr:2013 +eyr:2027 hgt:153cm cid:86 hcl:#602927 +pid:568040159 byr:1926 + +hgt:187cm iyr:2008 pid:151cm ecl:blu eyr:1954 + +byr:2014 +pid:9029821667 hgt:59cm eyr:2035 hcl:e9c79a +iyr:2010 + +eyr:2027 pid:#d676d0 +hcl:d2fcfa hgt:154cm ecl:hzl byr:1938 + +ecl:lzr hgt:61in eyr:2025 +pid:556812665 +byr:1923 iyr:2019 +hcl:e962ed + +iyr:2019 +eyr:2029 +hcl:#866857 byr:1977 pid:115229656 hgt:193cm +ecl:brn cid:350 + +hcl:z pid:#8d311d iyr:2023 hgt:71cm +byr:1923 ecl:zzz eyr:2039 + +cid:66 hgt:165cm +eyr:2027 iyr:2012 hcl:#b6652a ecl:amb pid:946987379 byr:1999 + +byr:2028 iyr:2013 ecl:#376cda +eyr:1928 pid:#c135ce hcl:z hgt:185in + +hcl:100344 iyr:1933 eyr:2023 hgt:71cm byr:2010 ecl:#6a8007 pid:90001213 + +iyr:2012 +byr:1987 eyr:2020 hgt:190cm cid:298 hcl:#866857 + +hgt:161cm hcl:#efcc98 ecl:grn eyr:2028 iyr:2014 +byr:1966 pid:769989459 + +hgt:173cm pid:527615519 eyr:2024 hcl:#602927 byr:1949 ecl:oth cid:328 + +pid:679489285 +hgt:153cm byr:1963 +hcl:#602927 eyr:2026 ecl:blu + +ecl:blu hgt:186cm hcl:#c0946f pid:741255292 eyr:2022 byr:1996 iyr:2017 + +hgt:172cm +hcl:#888785 eyr:2022 pid:377797887 byr:1980 + +hcl:z pid:399837694 iyr:2018 ecl:#33e59d eyr:2038 +hgt:60in + +eyr:2027 +byr:1923 +hgt:170cm pid:754104917 +iyr:2020 cid:135 hcl:#341e13 +ecl:brn + +ecl:grn hcl:#c0946f +byr:2028 iyr:2016 pid:950191991 +hgt:193cm cid:93 +eyr:1935 + +ecl:brn hcl:#733820 eyr:2024 +iyr:2017 pid:450063924 +byr:2000 hgt:172cm + +iyr:2008 +cid:229 byr:2023 eyr:2022 hcl:#341e13 +ecl:grn +hgt:70in pid:104660281 + +eyr:2023 hgt:181cm cid:289 pid:828542447 +iyr:2013 ecl:grn byr:1922 hcl:#866857 + +iyr:2030 pid:152cm cid:297 ecl:#75a512 hcl:z hgt:156in byr:2006 +eyr:2035 + +iyr:2012 hcl:#18171d eyr:2025 hgt:188cm +ecl:blu byr:1976 + +iyr:2018 hgt:157cm hcl:#b6652a +ecl:oth byr:2002 eyr:2023 + +cid:161 +hcl:#b6652a iyr:2016 +byr:1930 ecl:oth pid:000425745 hgt:167cm eyr:2022 + +hgt:160cm hcl:#89f1a0 eyr:2023 pid:867868252 byr:1976 iyr:2019 ecl:hzl + +byr:1966 ecl:grn pid:597443937 +iyr:2014 eyr:2029 + +pid:306301971 ecl:#a145cc +hcl:z iyr:2018 cid:325 eyr:2023 byr:1942 hgt:157cm + +ecl:brn +pid:771134604 hgt:160cm +byr:1961 eyr:2020 +iyr:2012 hcl:#6b5442 + +iyr:1922 +ecl:gmt +eyr:1963 +pid:#d1a6f3 hcl:z byr:2015 hgt:153in + +eyr:2022 ecl:gry +hgt:156cm +pid:640711969 +hcl:#cfa07d + +ecl:grn +eyr:1980 pid:385212564 hcl:5b27f7 hgt:160cm iyr:2016 cid:171 byr:1990 + +iyr:2020 +cid:212 pid:959667791 byr:2002 ecl:amb +hgt:75in eyr:2026 hcl:#888785 + +byr:1969 eyr:2021 +iyr:2012 +pid:318752605 hgt:179cm +cid:81 hcl:#888785 + +byr:1926 hcl:#c0946f iyr:2010 hgt:155cm ecl:gry pid:475722917 +eyr:2030 + +eyr:2025 +ecl:grn byr:1980 iyr:2010 hgt:160cm hcl:#d03ef0 pid:474973131 + +eyr:2020 iyr:2012 hgt:150cm +hcl:#c0946f +byr:1924 ecl:amb + +iyr:2016 hgt:173cm eyr:2029 +hcl:#888785 ecl:hzl byr:2001 cid:334 pid:291454183 + +iyr:2013 +pid:909258239 byr:1970 +ecl:utc eyr:2026 +cid:312 hgt:158cm +hcl:#18171d + +ecl:grn +byr:1941 pid:395943714 +eyr:2027 +hcl:#7d3b0c +iyr:2011 hgt:158cm + +ecl:amb hcl:#fffffd +byr:1992 +pid:266072435 +eyr:2028 iyr:2020 hgt:161cm + +hcl:de3776 eyr:2021 +cid:234 ecl:#160982 +iyr:2017 byr:1992 + +byr:1979 iyr:2020 ecl:brn +hcl:#6b5442 +pid:492860333 hgt:168cm eyr:2030 + +eyr:2025 hcl:#fffffd pid:776551474 +ecl:hzl hgt:169cm +iyr:2017 + +ecl:hzl +eyr:2029 +iyr:2013 byr:1952 hgt:152cm +pid:968064648 hcl:#6b5442 + +byr:1955 +pid:947711080 +cid:149 ecl:amb +hgt:150cm +hcl:#341e13 eyr:2022 iyr:2016 + +hgt:71cm ecl:#c6c47f +byr:2028 iyr:1994 eyr:2030 pid:0684877002 cid:237 hcl:#341e13 + +eyr:2030 hcl:#a97842 hgt:188cm byr:2000 pid:262013450 +iyr:2018 + +hgt:74in byr:1955 ecl:blu iyr:2012 hcl:#341e13 pid:165688658 + +hgt:176cm cid:346 iyr:2012 +pid:322396589 +ecl:gry eyr:2029 +byr:1976 +hcl:#888785 + +eyr:2021 +iyr:2015 hcl:3a6401 byr:1997 ecl:blu pid:188cm hgt:166in + +ecl:blu iyr:2010 byr:1984 hgt:183 +pid:306571244 hcl:#623a2f eyr:2033 cid:113 + +ecl:#804adb byr:2004 hgt:181cm +hcl:#623a2f +eyr:2040 pid:#57e9d1 +iyr:2028 cid:97 + +iyr:2015 pid:294753454 byr:1980 eyr:2020 +hgt:76in +ecl:oth +hcl:#a97842 + +hcl:#a7a05c pid:0137262572 eyr:2023 cid:350 iyr:2015 +ecl:#52d3fe hgt:190cm +byr:2007 + +pid:826827136 eyr:2030 ecl:brn byr:1946 hcl:#a97842 iyr:2018 +hgt:173in + +byr:1967 +iyr:2015 pid:142177822 hgt:157cm ecl:oth eyr:2024 cid:221 + +iyr:2012 byr:1942 cid:187 pid:886132093 +hgt:158cm ecl:hzl hcl:#1bc909 + +pid:490847399 +byr:1963 +hgt:69in +iyr:2011 ecl:gry +eyr:2027 hcl:#e4f497 cid:87 + +iyr:2014 ecl:hzl hgt:159cm hcl:#c0946f eyr:2028 byr:1926 pid:007819051 + +hcl:#cfa07d pid:639664506 ecl:amb +byr:1997 cid:137 iyr:2014 eyr:2030 hgt:67in + +hgt:191in +eyr:2025 +cid:128 +byr:2021 iyr:2015 +hcl:5ed1ae ecl:lzr +pid:406311551 + +eyr:2035 +ecl:gmt hcl:71e1ef iyr:2023 +pid:4347854 byr:2017 + +hgt:169cm +eyr:2028 +ecl:oth iyr:2016 byr:1954 +pid:662755630 hcl:#733820 + +eyr:2029 pid:664032828 hgt:185cm hcl:#fffffd byr:1991 ecl:grn iyr:2017 + +pid:240747543 hgt:190cm +hcl:#18171d iyr:2013 eyr:2021 ecl:grn byr:1920 + +iyr:2024 pid:87644548 hgt:126 +byr:1971 ecl:brn +eyr:2040 + +iyr:2020 +ecl:lzr byr:2014 eyr:2027 pid:976290173 +hcl:#efcc98 +hgt:192in + +pid:112431133 byr:1950 hgt:174cm +iyr:2020 +cid:118 hcl:#341e13 eyr:2023 ecl:amb + +pid:034858755 +hcl:#d93689 iyr:2012 eyr:2025 +hgt:67cm +ecl:brn byr:2027 +cid:306 + +eyr:2024 hcl:#fffffd ecl:hzl hgt:188cm cid:199 byr:2015 pid:983962091 iyr:1937 + +hcl:#c0946f pid:899925634 +eyr:2025 byr:2020 +iyr:2016 +ecl:grt hgt:173cm + +hgt:59cm hcl:c5b2d7 byr:2008 iyr:2027 +ecl:lzr pid:155cm +eyr:2035 + +iyr:2014 +eyr:2022 pid:850258746 hcl:#a97842 byr:2022 ecl:brn hgt:178cm + +cid:214 iyr:2017 +ecl:oth +hcl:#866857 byr:1995 pid:793515973 hgt:193cm eyr:2023 + +hcl:#18171d +iyr:2017 hgt:193cm cid:183 eyr:2025 pid:728034540 ecl:hzl byr:1969 + +eyr:2025 ecl:gry byr:2002 iyr:2019 hgt:174cm pid:603301922 +hcl:#fffffd + +byr:2002 +cid:98 pid:828911903 eyr:2030 ecl:blu hgt:65in hcl:#74b1dc + +byr:1969 hcl:#a97842 ecl:gry eyr:2027 pid:835656333 hgt:152cm cid:324 iyr:2014 + +pid:848442741 eyr:2030 hcl:#ceb3a1 byr:1984 iyr:2019 ecl:grn hgt:164cm + +hcl:#341e13 iyr:2019 hgt:166cm pid:419840849 byr:1974 eyr:2026 cid:211 + +byr:1945 pid:646444288 iyr:2020 +eyr:2023 hgt:186cm + +pid:375892516 +hgt:187cm +iyr:2010 eyr:2028 byr:1972 cid:272 ecl:blu hcl:#888785 + +hgt:181in +ecl:grn eyr:2034 +hcl:#7d3b0c byr:2018 +pid:206240985 iyr:2015 + +hgt:177 eyr:1973 pid:83092851 cid:92 ecl:utc byr:2023 hcl:z iyr:1948 + +eyr:2029 pid:1655089174 ecl:grn hgt:158cm iyr:2011 hcl:#b6652a byr:1926 +cid:158 + +hcl:#341e13 +iyr:2006 +byr:2008 hgt:185 eyr:2024 ecl:utc + +hgt:171cm +pid:533365287 byr:1957 hcl:#ceb3a1 iyr:2014 ecl:amb eyr:2020 +cid:184 + +hcl:#b6652a +pid:553897602 iyr:1929 ecl:grn cid:191 hgt:178cm byr:1991 eyr:2024 + +byr:1994 hgt:152cm pid:198152466 +eyr:2022 ecl:hzl hcl:#4df239 iyr:2020 + +ecl:grn +eyr:2022 +byr:1968 iyr:2017 pid:044109096 + +hcl:#d257c7 eyr:2036 +iyr:2018 +ecl:#5b11eb +byr:1950 diff --git a/test/day4_test.exs b/test/day4_test.exs new file mode 100644 index 0000000..4d84076 --- /dev/null +++ b/test/day4_test.exs @@ -0,0 +1,51 @@ +defmodule Day4Test do + use ExUnit.Case + doctest Day4 + + test "checks invalid passports" do + passports = + """ + 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 + """ + |> String.trim() + |> String.split("\n\n") + |> Day4.parse_input() + + assert Day4.count_valid(passports, true) == 0 + end + + test "checks valid passports" do + passports = + """ + 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 + """ + |> String.trim() + |> String.split("\n\n") + |> Day4.parse_input() + + assert Day4.count_valid(passports, true) == 4 + end +end