From 5a2aec7e76b498a97bed59218197ce472d1621b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Fri, 4 Dec 2020 20:15:55 +0000 Subject: [PATCH 1/7] Complete day 4.1 --- day-4/.gitignore | 1 + day-4/Cargo.lock | 78 ++++ day-4/Cargo.toml | 10 + day-4/input | 1068 +++++++++++++++++++++++++++++++++++++++++++++ day-4/src/main.rs | 80 ++++ 5 files changed, 1237 insertions(+) create mode 100644 day-4/.gitignore create mode 100644 day-4/Cargo.lock create mode 100644 day-4/Cargo.toml create mode 100644 day-4/input create mode 100644 day-4/src/main.rs diff --git a/day-4/.gitignore b/day-4/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/day-4/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/day-4/Cargo.lock b/day-4/Cargo.lock new file mode 100644 index 0000000..44f11e3 --- /dev/null +++ b/day-4/Cargo.lock @@ -0,0 +1,78 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-4" +version = "0.1.0" +dependencies = [ + "indoc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-4/Cargo.toml b/day-4/Cargo.toml new file mode 100644 index 0000000..223e26a --- /dev/null +++ b/day-4/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day-4" +version = "0.1.0" +authors = ["Tristan Daniël Maat <tm@tlater.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indoc = "0.3" diff --git a/day-4/input b/day-4/input new file mode 100644 index 0000000..5b0a490 --- /dev/null +++ b/day-4/input @@ -0,0 +1,1068 @@ +hgt:159cm +pid:561068005 eyr:2025 iyr:2017 cid:139 ecl:blu hcl:#ceb3a1 +byr:1940 + +iyr:2014 +byr:1986 pid:960679613 eyr:2025 ecl:hzl + +cid:211 ecl:blu hcl:#7d3b0c iyr:2011 pid:006632702 +byr:1982 eyr:2023 hgt:68in + +hcl:#341e13 hgt:192 iyr:2028 +ecl:utc +eyr:2027 byr:1979 pid:653515689 + +eyr:2026 hgt:161cm ecl:#1850b8 +pid:298779494 hcl:b2114e iyr:1953 + +hgt:155cm +hcl:#a97842 iyr:2019 +ecl:gry byr:1939 +pid:935099157 eyr:2027 + +eyr:2024 ecl:grn +pid:102781360 byr:1962 iyr:2013 hcl:#602927 + +hcl:#602927 hgt:152cm +pid:659074205 ecl:brn iyr:2014 byr:1951 + +iyr:2025 hcl:8464b2 byr:2030 pid:976783295 hgt:155cm ecl:dne + +hcl:#ceb3a1 byr:1984 pid:863872932 +iyr:2016 hgt:190cm ecl:grn eyr:2026 + +eyr:2030 hcl:#efcc98 +cid:166 pid:894418497 ecl:hzl +hgt:189cm iyr:2014 byr:1966 + +byr:1937 iyr:2017 eyr:2028 +ecl:amb +hgt:165cm cid:84 +pid:435289747 + +hgt:166cm hcl:#6b5442 byr:1953 eyr:2023 iyr:2010 +pid:948173962 ecl:amb + +byr:1962 cid:276 iyr:2010 hgt:183cm pid:097154397 +hcl:#341e13 eyr:2024 + +hgt:61cm +byr:1942 ecl:xry hcl:#05e97d pid:42823283 +eyr:2024 + +hcl:#888785 +pid:960190685 byr:1967 iyr:2012 cid:99 eyr:2021 +hgt:76in + +eyr:2025 byr:1958 hcl:#18171d iyr:2012 pid:759427419 +ecl:hzl + +ecl:#829d2e +cid:60 iyr:2028 +byr:1979 hcl:caff12 eyr:1931 pid:#fd7aab hgt:184cm + +cid:251 byr:1981 pid:625590775 +hcl:#a97842 eyr:2020 +ecl:amb hgt:178cm +iyr:2016 + +pid:026891577 ecl:amb byr:2014 +hcl:bc419f eyr:2026 +iyr:1948 +hgt:123 cid:67 + +ecl:hzl +hgt:152cm hcl:#efcc98 +byr:1993 +eyr:2025 + +ecl:grn iyr:1924 eyr:2039 pid:8441306576 +hgt:163in +byr:2012 +cid:193 + +ecl:#78f4fa +eyr:2020 hgt:165cm byr:1965 pid:987868257 iyr:2012 +cid:331 hcl:z + +ecl:brn cid:289 pid:868305933 +byr:1936 hgt:174cm iyr:2016 hcl:#623a2f eyr:2021 + +hcl:#2a6308 eyr:2027 hgt:154cm ecl:grn +iyr:2012 +byr:1940 +pid:675209536 + +pid:186cm eyr:2022 +hcl:#fffffd hgt:151cm iyr:2016 ecl:hzl byr:1954 + +ecl:grn hgt:177cm pid:725111435 byr:1927 eyr:2027 cid:154 iyr:2010 hcl:#623a2f + +pid:801551597 cid:55 eyr:2028 hgt:193cm hcl:#a97842 +ecl:hzl byr:1942 iyr:2015 + +cid:176 eyr:2030 iyr:2018 byr:1932 hgt:162cm pid:896180324 ecl:amb hcl:#6b5442 + +cid:239 ecl:grn iyr:1953 pid:9500162195 +byr:1998 +hgt:182cm hcl:#733820 eyr:1966 + +eyr:2030 +pid:919325322 hcl:z iyr:2024 hgt:71cm ecl:#1e935c byr:2026 + +iyr:2012 +ecl:gry eyr:2025 hcl:#602927 hgt:168cm byr:1925 +pid:303312675 + +hgt:150in iyr:2014 ecl:gry eyr:2029 +byr:2029 +cid:228 + +ecl:#9524e0 byr:2026 hcl:z +iyr:2023 +cid:325 +eyr:1996 +pid:6172325031 hgt:191 + +ecl:#689e88 +eyr:1937 +cid:75 byr:1963 iyr:2024 +pid:4980937 hgt:156cm +hcl:#fffffd + +pid:719820090 iyr:2020 hgt:165cm +hcl:#ceb3a1 byr:1997 ecl:blu eyr:2027 + +eyr:2025 +pid:241723456 +iyr:2011 +byr:1953 cid:230 hgt:185cm hcl:#efcc98 ecl:oth + +byr:1936 hcl:#623a2f +iyr:2010 hgt:156cm +eyr:2022 +pid:064253102 ecl:brn + +cid:332 hcl:#a97842 eyr:2026 ecl:gry iyr:2019 pid:#4e4a46 +hgt:150cm +byr:1987 + +ecl:grn hgt:67in +iyr:2012 +byr:1953 pid:910793005 hcl:#341e13 eyr:2020 + +iyr:2024 eyr:2030 cid:204 hgt:166cm pid:218828260 +hcl:701b48 ecl:gry byr:1930 + +hgt:162cm pid:024916763 eyr:2026 ecl:hzl +hcl:#efcc98 iyr:2019 byr:1921 + +eyr:2025 +iyr:2017 ecl:hzl hcl:#fffffd hgt:167cm pid:779214145 + +eyr:2022 +hcl:#6b5442 byr:1941 ecl:grn hgt:169cm iyr:2014 +pid:610328167 + +iyr:2026 cid:179 pid:193cm +ecl:#deb37c +byr:1958 eyr:2024 +hgt:185cm + +pid:907508207 ecl:oth byr:1941 iyr:2017 hcl:#341e13 +eyr:2030 hgt:186cm + +iyr:2018 byr:1925 +ecl:brn eyr:2023 pid:903196231 +hgt:159cm +hcl:#a97842 cid:323 + +hgt:185cm ecl:hzl eyr:2022 iyr:2020 pid:572453155 hcl:#fffffd + +hcl:#a97842 ecl:blu pid:#ab3597 eyr:1964 byr:2030 +hgt:181cm iyr:2018 + +ecl:blu +hcl:#602927 +cid:234 +hgt:68in eyr:2021 pid:257420555 iyr:2014 byr:1972 + +hcl:#7d3b0c eyr:2022 +hgt:152cm byr:1974 +iyr:2017 +pid:353127736 +ecl:gry + +iyr:2018 eyr:2028 byr:1924 hcl:#69929e ecl:gry +hgt:68in pid:942207567 + +eyr:2028 cid:90 +hgt:185cm +ecl:amb byr:1990 pid:947625812 hcl:#623a2f iyr:2011 + +eyr:2023 byr:1996 hgt:175cm +iyr:2012 +hcl:#866857 ecl:blu +pid:437669135 + +byr:1937 eyr:2030 +hcl:#866857 iyr:2017 pid:513963895 hgt:157cm +ecl:grn + +iyr:2016 hcl:#623a2f eyr:2025 +pid:559150893 hgt:176cm +byr:1920 ecl:amb + +byr:1982 +eyr:1961 ecl:hzl +hgt:167cm hcl:#888785 iyr:2011 cid:261 pid:709006236 + +pid:307171649 byr:1935 hcl:#888785 hgt:182cm ecl:brn eyr:2030 iyr:2013 +cid:256 + +ecl:hzl +eyr:1998 +byr:2009 +hgt:153cm iyr:2010 +hcl:#888785 pid:140487128 + +iyr:2019 cid:78 +hgt:169cm +hcl:#888785 ecl:hzl byr:1997 eyr:2028 + +hgt:182in eyr:2025 hcl:#cfa07d ecl:#27a1c9 byr:2005 pid:8143047758 + +byr:2013 hgt:178in +eyr:1933 +pid:829007679 iyr:2016 hcl:#783308 +ecl:grn + +cid:267 byr:1930 pid:949963673 eyr:2026 +ecl:grn iyr:2020 +hgt:188cm hcl:#6b5442 + +eyr:2022 pid:254482159 +byr:1935 iyr:2017 +ecl:hzl +hcl:#b6652a +hgt:165cm + +hcl:109d15 hgt:72cm +cid:258 byr:2023 eyr:1987 ecl:grt iyr:2022 + +byr:1969 +ecl:oth hgt:151cm +pid:578662559 +eyr:2024 iyr:2015 hcl:#602927 +cid:343 + +iyr:2011 byr:1989 +ecl:brn eyr:2029 pid:123354233 +hcl:#efcc98 + +hcl:#a97842 iyr:2010 pid:558586208 +eyr:2029 byr:2002 ecl:amb +cid:225 hgt:152cm + +eyr:2005 byr:2024 iyr:1924 ecl:gmt cid:186 pid:#886ae9 +hcl:3cf4cd hgt:74cm + +ecl:gry +eyr:2029 +iyr:2013 +hgt:178cm hcl:#7d3b0c + +byr:1970 hcl:#6b5442 hgt:155cm iyr:2020 ecl:hzl +pid:698123164 eyr:2030 cid:185 + +hcl:#6b5442 ecl:hzl +iyr:2014 cid:324 pid:149063285 hgt:64in eyr:2023 +byr:1949 + +hcl:#866857 +eyr:2025 +iyr:2012 cid:116 hgt:185cm +pid:416329937 +ecl:grn byr:1962 + +iyr:2020 cid:55 byr:1985 hcl:#733820 pid:237883033 eyr:2020 ecl:blu + +iyr:2020 hgt:71in +ecl:hzl byr:1960 cid:53 hcl:#888785 pid:590574853 eyr:2024 + +pid:834729501 iyr:2019 hgt:72in byr:1977 +hcl:#604861 ecl:oth eyr:2024 + +pid:111536282 ecl:gry +hgt:69in eyr:2021 byr:1940 +iyr:2019 +hcl:#ceb3a1 + +hgt:186cm pid:045765056 ecl:gry byr:1958 iyr:2012 +eyr:2025 hcl:#cfa07d + +hgt:61in eyr:2023 pid:4189258985 ecl:brn iyr:1995 +hcl:#602927 byr:2017 + +byr:1984 hcl:#866857 +iyr:2013 pid:927074474 hgt:168cm +eyr:2021 ecl:oth + +hgt:186cm +pid:948677443 iyr:2014 hcl:#866857 byr:1968 ecl:amb eyr:2027 + +eyr:2028 cid:260 hcl:#623a2f pid:500330326 +iyr:2018 hgt:170cm +ecl:gry +byr:1960 + +hgt:71cm +pid:6209572 byr:1927 iyr:2011 ecl:utc hcl:3bc47a eyr:1984 + +hgt:164cm cid:160 iyr:2010 +byr:1922 eyr:2024 hcl:#c0946f ecl:gry pid:867476938 + +cid:316 +iyr:2015 hcl:#b6652a hgt:72cm pid:#c37dbf byr:2022 eyr:2036 ecl:#8bd8f4 + +iyr:2016 hgt:172cm +pid:482664712 ecl:hzl eyr:2024 hcl:#602927 byr:1945 + +eyr:2029 pid:883381915 +hgt:174cm byr:1937 hcl:#fffffd ecl:gry cid:91 + +eyr:2029 pid:302832265 hcl:#ceb3a1 byr:2010 +hgt:64 iyr:1960 + +hgt:170cm eyr:2030 pid:846949920 +hcl:#ceb3a1 +ecl:hzl iyr:2016 byr:1945 + +hcl:#efcc98 +pid:406029852 eyr:2023 byr:1981 ecl:blu iyr:2013 + +pid:788563693 hcl:#a97842 hgt:172cm eyr:2022 ecl:brn iyr:2010 byr:2002 + +iyr:2013 +hgt:60cm hcl:#7d3b0c pid:6594060725 ecl:#46a7d7 eyr:2023 byr:1995 + +cid:313 byr:1964 pid:102442749 eyr:2020 +hgt:167cm +hcl:#341e13 + +ecl:grn hgt:163cm pid:405504213 cid:349 hcl:#733820 eyr:2029 iyr:2011 + +ecl:hzl pid:470689685 iyr:2015 byr:1980 hgt:180cm eyr:2027 + +eyr:2023 iyr:2013 +hgt:189cm hcl:#866857 byr:1981 +cid:313 +ecl:brn pid:386584267 + +iyr:2011 +hcl:#7d3b0c +eyr:2027 +ecl:gry byr:1931 +hgt:71in +pid:435568613 + +eyr:2021 +pid:443386140 hgt:192cm iyr:2015 byr:1974 + +byr:1989 ecl:oth iyr:2011 +eyr:2027 +pid:761106563 hcl:#efcc98 +hgt:60in + +byr:1933 ecl:brn pid:607926472 +hcl:#cfa07d eyr:2026 +iyr:2010 + +ecl:hzl eyr:2027 hgt:175cm +pid:68527368 +byr:1980 iyr:2017 hcl:#341e13 + +hgt:159cm pid:6199921925 iyr:1920 byr:1950 ecl:amb cid:229 eyr:2034 + +pid:060780170 ecl:gmt +eyr:1961 hgt:184cm hcl:#a97842 byr:2007 + +eyr:2025 byr:1970 ecl:brn hgt:183cm pid:423232940 hcl:#cfa07d cid:283 + +hcl:#18171d hgt:191cm +byr:1951 +eyr:2029 +pid:627632195 cid:268 iyr:2012 + +eyr:2025 iyr:2019 hgt:163cm +ecl:oth pid:967756889 +byr:1938 + +hgt:160cm iyr:2015 +ecl:#9cf598 pid:297446459 cid:123 byr:1968 eyr:1970 +hcl:#efcc98 + +ecl:hzl pid:311990731 hgt:171cm hcl:#602927 byr:1978 +eyr:2026 cid:254 iyr:2014 + +hcl:#8e0dfc +pid:961997362 byr:1950 eyr:2027 hgt:184in ecl:blu iyr:2015 cid:266 + +pid:953859016 iyr:2018 hcl:#341e13 ecl:grn cid:61 +hgt:192cm +eyr:2022 byr:1920 + +eyr:2026 pid:149020634 byr:1942 iyr:2021 hcl:#6b5442 +ecl:oth hgt:176in + +eyr:2025 hgt:176cm +iyr:2020 ecl:oth hcl:#efcc98 pid:196082064 byr:2002 + +hgt:172in hcl:z +pid:#b454a0 +ecl:#d7a600 +byr:1977 +eyr:2035 iyr:2014 + +cid:254 iyr:2020 +pid:716596533 +hcl:#341e13 byr:1947 +hgt:150cm ecl:hzl eyr:2028 + +iyr:2019 pid:190601635 byr:1922 hcl:#18171d hgt:71in ecl:brn eyr:2021 + +byr:1938 iyr:2019 eyr:2028 pid:568504071 hcl:#efcc98 hgt:178cm ecl:amb + +pid:921417345 eyr:2020 ecl:brn hcl:#c0946f +hgt:168cm +byr:1983 cid:170 +iyr:2018 + +iyr:2020 cid:212 eyr:2002 pid:61850316 hgt:148 hcl:#b6652a +byr:2024 ecl:grn + +hcl:z eyr:1985 iyr:2015 hgt:72cm ecl:brn pid:599880521 + +pid:166cm hcl:z +hgt:165 eyr:2036 +cid:152 iyr:1943 +ecl:zzz + +eyr:2021 iyr:2014 +hgt:156cm +pid:654181902 ecl:amb +byr:1946 +hcl:#733820 + +iyr:2019 +hgt:189cm byr:1940 pid:419593669 ecl:amb +cid:149 hcl:#fffffd eyr:2020 + +hgt:172cm +ecl:lzr pid:788208394 hcl:#341e13 cid:183 +iyr:2020 eyr:2027 byr:1988 + +byr:2030 ecl:#d82c54 iyr:2014 +hcl:#be9be7 eyr:2027 pid:1291285950 hgt:61cm + +ecl:hzl +hcl:#a97842 hgt:186cm byr:1992 eyr:2022 + +iyr:2017 hgt:191cm pid:097984693 eyr:2025 byr:1963 +cid:333 +ecl:blu + +ecl:zzz pid:425594420 +byr:1983 +hcl:z +eyr:2028 hgt:184cm +iyr:1937 + +hgt:167cm +eyr:2025 hcl:#623a2f pid:575911832 +cid:305 byr:1939 iyr:2020 + +iyr:2015 hgt:179cm hcl:d678e0 byr:2030 pid:284187009 eyr:1977 cid:285 + +pid:405789549 byr:1982 eyr:2020 hcl:#623a2f +hgt:161cm iyr:2013 ecl:amb + +pid:775860836 hgt:184cm hcl:#fffffd ecl:amb byr:1930 eyr:2022 iyr:2016 + +iyr:2020 byr:1979 +eyr:2024 hgt:171cm +ecl:brn hcl:#ceb3a1 pid:853915000 + +iyr:2015 pid:244459567 +hcl:#18171d cid:224 byr:1931 eyr:2022 hgt:169cm ecl:gry + +iyr:2017 cid:308 eyr:2026 ecl:blu hgt:59in byr:1953 +hcl:#ceb3a1 pid:466915764 + +hcl:#7d3b0c +byr:1940 iyr:2015 +eyr:2020 pid:950614940 ecl:amb +hgt:179cm + +byr:2010 +cid:106 eyr:2022 +iyr:2020 pid:336057617 ecl:brn hcl:f13e26 +hgt:182cm + +byr:1981 iyr:2017 hgt:152cm +hcl:#fffffd +eyr:2024 ecl:gry + +cid:216 hgt:193cm +byr:1975 ecl:oth pid:684529055 iyr:2018 eyr:2020 hcl:#18171d + +hgt:150cm +eyr:2028 +hcl:#cfa07d ecl:grn +iyr:2018 byr:1951 pid:749102509 + +pid:937451204 hcl:#341e13 iyr:2020 +hgt:171cm eyr:2021 +byr:1941 +ecl:hzl + +cid:69 +iyr:2014 eyr:2022 pid:174789690 hgt:157cm byr:1961 ecl:hzl +hcl:#a97842 + +hcl:#7d3b0c pid:658134059 hgt:65in byr:2005 ecl:#2dcb50 iyr:2012 +eyr:2030 + +eyr:2027 +hgt:68in ecl:oth hcl:#888785 iyr:2016 pid:181577931 + +iyr:1997 byr:1994 +hgt:189cm +ecl:gry pid:564165515 +eyr:2029 hcl:#ceb3a1 + +hcl:#602927 eyr:2024 +cid:130 +iyr:2015 ecl:blu +hgt:184cm byr:1996 +pid:897871188 + +ecl:oth hcl:#623a2f +iyr:2016 pid:012591439 byr:1937 eyr:2022 hgt:176cm + +eyr:2020 +byr:1965 +iyr:2013 hgt:193cm +hcl:#ceb3a1 +ecl:hzl pid:177120440 + +byr:1934 iyr:2015 hcl:#341e13 +pid:370860309 ecl:oth +eyr:2028 hgt:157cm + +ecl:brn +byr:2001 +iyr:2010 +eyr:2028 hcl:#866857 hgt:183cm pid:194361427 + +hgt:182cm pid:449667574 ecl:amb +byr:1958 iyr:2017 +hcl:#efcc98 + +iyr:2020 ecl:hzl eyr:2030 hgt:185cm byr:1969 hcl:#ceb3a1 pid:157651787 + +pid:893956434 eyr:2027 hgt:185cm hcl:#a97842 +byr:1944 ecl:oth + +byr:2011 +iyr:2018 +hcl:#623a2f hgt:159cm ecl:blu pid:174cm +eyr:2030 + +ecl:grt pid:520129782 eyr:2020 +byr:2020 hcl:z cid:50 iyr:2017 +hgt:156cm + +iyr:2015 +ecl:grn hcl:#83b224 eyr:2021 pid:554994156 hgt:179cm byr:1994 + +ecl:gry byr:1971 pid:772131254 +eyr:2027 cid:201 hcl:#602927 + +cid:125 +byr:1943 hgt:168cm ecl:hzl pid:418786991 +eyr:2020 iyr:2016 +hcl:#cfa07d + +pid:825704567 eyr:2032 byr:2024 +iyr:1926 +hcl:d31139 hgt:190in + +cid:243 hcl:#cfa07d byr:1951 ecl:oth pid:382615614 +iyr:2018 eyr:2030 hgt:64in + +byr:1925 hgt:187cm ecl:oth eyr:2023 hcl:#888785 + +eyr:2028 iyr:2013 ecl:brn byr:1923 cid:174 hcl:#b6652a hgt:154cm pid:274036240 + +ecl:brn hgt:183cm iyr:2016 +byr:1922 +hcl:#efcc98 eyr:2030 + +hgt:188cm +byr:1979 +ecl:amb +eyr:2025 hcl:#b6652a cid:130 +pid:646985829 iyr:2019 + +hgt:76cm hcl:z cid:112 ecl:zzz +pid:953385473 eyr:2020 +byr:1943 + +ecl:#12c807 +byr:1954 eyr:1934 hgt:73cm hcl:#ceb3a1 iyr:2015 pid:704621520 + +hgt:188cm hcl:#733820 eyr:2024 ecl:grn +iyr:2018 byr:1982 pid:522812862 + +hgt:68cm ecl:blu +byr:2023 pid:875418461 iyr:2021 eyr:2020 hcl:#623a2f + +byr:1967 +pid:313706535 ecl:amb hcl:#888785 +iyr:2012 +eyr:2026 + +eyr:2026 +pid:288363970 cid:70 byr:1932 hgt:157cm iyr:2016 ecl:hzl hcl:#ceb3a1 + +byr:1992 pid:539896055 +eyr:2023 +cid:189 hgt:70in ecl:oth iyr:2019 +hcl:#866857 + +hgt:158in +ecl:gry byr:2028 +eyr:2036 cid:188 +hcl:#cfa07d +pid:044279141 + +eyr:2024 hgt:170cm ecl:hzl +byr:1939 pid:851235247 iyr:2013 +hcl:#fffffd + +ecl:hzl hcl:#c0946f +hgt:167cm +eyr:2024 byr:1936 pid:463230636 cid:297 +iyr:2016 + +pid:291401545 ecl:grn hcl:#b6652a iyr:2014 +hgt:185cm eyr:2025 byr:1947 + +eyr:2029 pid:612595763 +iyr:2018 ecl:gry +cid:290 +byr:1991 hcl:#733820 +hgt:150cm + +hgt:151cm +pid:667532675 cid:134 +byr:1930 +hcl:#efcc98 iyr:2012 +ecl:oth + +ecl:gry +hcl:#888785 hgt:161cm +eyr:2023 +pid:467759498 cid:274 + +eyr:2023 byr:1956 hgt:188cm iyr:2014 hcl:#b6652a pid:382721925 ecl:brn + +byr:1947 ecl:gry eyr:2020 +pid:874004905 hcl:#602927 hgt:161cm iyr:2029 + +pid:164334257 +iyr:2014 cid:286 eyr:2020 +hcl:#733820 +ecl:gry byr:1959 hgt:165cm + +hgt:59in +pid:#5b1362 +eyr:2028 iyr:1980 hcl:z byr:2030 +ecl:utc + +pid:604128460 iyr:2016 byr:1952 hgt:152cm ecl:grn hcl:#7d3b0c eyr:2021 + +pid:7483106309 eyr:2005 hgt:158in byr:2024 iyr:1935 hcl:z +ecl:#158994 + +hcl:22207f eyr:1994 +cid:166 pid:#d8e64c ecl:utc +byr:1966 hgt:70cm +iyr:1980 + +iyr:2012 pid:045892410 hgt:70in ecl:dne hcl:1a323a byr:1920 eyr:2022 + +hcl:#18171d iyr:2019 eyr:2026 +hgt:191cm pid:514596186 cid:327 byr:1938 ecl:grn + +pid:904148746 hcl:#a97842 hgt:161cm +cid:181 +iyr:2012 eyr:2020 ecl:oth + +iyr:2028 +eyr:2034 +cid:276 pid:#0e7ee2 byr:2020 +hgt:63cm ecl:gry +hcl:z + +pid:4270554593 eyr:2031 ecl:lzr hgt:72cm +iyr:2027 hcl:ffc210 cid:132 +byr:2008 + +iyr:2018 pid:174cm cid:144 +ecl:#10b2ed byr:1931 eyr:2040 hcl:z hgt:68in + +pid:446746712 +iyr:1957 +ecl:oth cid:213 hgt:184cm byr:2008 hcl:z + +hcl:#7d3b0c iyr:2012 ecl:hzl +eyr:2023 pid:270148060 + +pid:832184923 +eyr:2023 hgt:180cm +byr:1965 ecl:hzl cid:189 hcl:#a97842 +iyr:2016 + +pid:688867083 +iyr:2011 hcl:#733820 cid:147 eyr:2021 +byr:1986 ecl:oth + +hgt:166in ecl:amb byr:2014 +pid:169cm hcl:#cfa07d iyr:1976 + +hgt:64in byr:1987 hcl:01f3d7 +pid:553206412 eyr:2027 ecl:grn cid:336 +iyr:2012 + +cid:336 +ecl:oth byr:1975 +pid:296100726 hcl:#6b5442 iyr:2016 hgt:180cm eyr:2029 + +hcl:#ceb3a1 hgt:181cm pid:364719801 byr:1922 eyr:2029 +iyr:2010 cid:346 ecl:gry + +hcl:#1c7f1d cid:205 +hgt:184cm +byr:1928 +pid:694275035 iyr:2018 ecl:blu eyr:2023 + +eyr:1970 +hcl:z byr:2001 +pid:9244596 iyr:2030 hgt:187in ecl:blu + +hgt:96 +byr:2030 ecl:zzz eyr:1920 pid:115437655 hcl:z +iyr:2017 +cid:344 + +iyr:2018 +eyr:2023 +hcl:#888785 hgt:188cm +ecl:amb byr:1992 pid:602211075 + +pid:848099019 hgt:168cm iyr:2016 +eyr:2026 ecl:amb +hcl:#866857 byr:1981 + +iyr:2013 hcl:#623a2f hgt:151cm cid:135 byr:1974 eyr:2026 ecl:gry +pid:313553018 + +hcl:#733820 +byr:1986 hgt:182cm +ecl:brn eyr:2024 iyr:2017 +pid:676008782 + +eyr:2030 pid:833874339 iyr:2011 byr:1949 hgt:159cm +ecl:brn hcl:#602927 + +hgt:182cm hcl:#6b5442 pid:131549376 eyr:2029 iyr:2012 +ecl:gry byr:1926 + +cid:55 ecl:amb iyr:2015 hgt:192cm hcl:#a97842 +byr:1944 +eyr:2027 + +iyr:1944 eyr:2038 hcl:a2adf2 cid:99 byr:2006 hgt:67cm +pid:154cm +ecl:dne + +eyr:2005 hcl:#1495bd ecl:grt byr:2028 +iyr:2016 hgt:155 pid:182cm +cid:326 + +hgt:136 +pid:599182089 eyr:2020 byr:1945 +iyr:2012 +ecl:oth hcl:#18171d + +pid:4695182580 +iyr:2012 +ecl:brn eyr:2039 byr:1936 +hcl:#cfa07d + +ecl:hzl byr:1949 cid:133 hgt:159cm hcl:#b6652a pid:9833212692 iyr:2011 eyr:2030 + +eyr:2020 +hgt:175cm +cid:140 iyr:2014 byr:1980 hcl:#7d3b0c +ecl:grn pid:400508366 + +pid:#100a75 iyr:2016 +hgt:65 +eyr:2037 ecl:hzl +byr:1962 + +eyr:2024 pid:180cm hcl:#6b5442 hgt:154cm +iyr:1964 + +byr:1986 hgt:159cm ecl:brn +pid:856817592 hcl:#cfa07d eyr:2024 +iyr:2017 + +hgt:166cm +byr:1996 hcl:#410645 +ecl:hzl iyr:2010 cid:178 pid:337713295 +eyr:2026 + +iyr:2017 byr:1964 hgt:167cm hcl:#7d3b0c cid:298 ecl:brn pid:371416367 + +byr:1929 iyr:2011 hcl:#fffffd ecl:blu +pid:013408674 hgt:187cm eyr:2021 + +hcl:#cfa07d byr:1986 cid:331 +iyr:2010 ecl:gry pid:616063053 hgt:150cm +eyr:2028 + +pid:013835033 iyr:2017 byr:1991 +hgt:154cm hcl:#efcc98 eyr:2020 + +byr:1978 eyr:2024 +hgt:155cm iyr:2012 hcl:#694989 pid:914726069 +ecl:amb + +ecl:blu pid:139464317 hcl:#fffffd eyr:2024 byr:1970 hgt:72in iyr:2012 + +byr:1965 hcl:#ceb3a1 ecl:hzl iyr:2019 pid:910593212 eyr:2029 + +byr:1994 cid:228 +ecl:grn hgt:171cm pid:538884417 eyr:2025 iyr:2011 hcl:#6b5442 + +cid:264 hcl:#623a2f +hgt:186cm iyr:2012 ecl:brn eyr:2024 pid:304101929 byr:1954 + +hgt:183cm byr:1987 hcl:z ecl:gry eyr:2020 pid:384983241 iyr:2015 + +pid:#885c1a +byr:2012 eyr:2034 ecl:#8ea705 iyr:2028 hgt:61cm hcl:z + +eyr:2023 hgt:156cm byr:1939 hcl:#cd2220 ecl:brn pid:484163297 + +hgt:158in +byr:2000 ecl:lzr +iyr:2014 +eyr:2033 pid:50157400 + +byr:1974 hcl:#c0946f +iyr:2018 pid:285451524 cid:299 eyr:2029 hgt:184cm ecl:hzl + +byr:1974 hcl:#602927 hgt:151cm iyr:2013 pid:322935162 ecl:amb +cid:209 +eyr:2026 + +hcl:#341e13 iyr:2015 +ecl:gry byr:1970 +hgt:186cm +pid:330151070 eyr:2034 + +ecl:gry eyr:2023 +hgt:160cm hcl:#c0946f +iyr:2011 byr:1926 pid:727347794 + +iyr:2012 +byr:1974 hcl:#866857 +eyr:2025 +pid:933155590 hgt:167cm +ecl:grn + +iyr:2015 ecl:gry eyr:2029 +byr:1967 hcl:#f9f576 hgt:170cm pid:439696954 cid:173 + +eyr:2029 byr:1935 ecl:brn pid:165587982 +hcl:#6b5442 +iyr:2020 + +eyr:2029 ecl:hzl hcl:#866857 byr:1994 +pid:308548232 hgt:162cm iyr:2012 + +byr:1924 cid:274 +pid:028266367 eyr:2025 iyr:2017 hgt:169cm +hcl:#cfa07d ecl:gry + +eyr:2025 byr:1995 +ecl:brn +hgt:160cm +pid:819047484 +hcl:#602927 iyr:2011 + +pid:660383456 +iyr:2016 eyr:2022 hgt:158cm byr:1942 ecl:amb cid:334 hcl:#efcc98 + +hcl:#6b5442 iyr:2024 cid:180 ecl:grn pid:167cm hgt:169 + +eyr:2024 iyr:2017 hgt:165cm hcl:#7d3b0c byr:1920 +ecl:amb pid:236377188 + +pid:063113952 +ecl:grn hcl:#341e13 hgt:166cm +byr:1977 iyr:2017 + +ecl:amb hgt:174cm +eyr:2028 byr:2002 +hcl:#7d3b0c +pid:428826816 iyr:2017 + +byr:2025 ecl:dne hgt:167in pid:706379338 +iyr:2019 hcl:240e75 eyr:1971 + +eyr:2021 +hcl:#efcc98 iyr:2014 +pid:358236477 +byr:1923 cid:73 hgt:165cm ecl:amb + +eyr:2030 cid:267 +ecl:brn +pid:282023612 hcl:#c0946f iyr:2018 byr:1989 +hgt:72cm + +ecl:utc hcl:ea4b34 byr:2013 +pid:#d58d54 +hgt:107 iyr:2027 cid:296 eyr:2038 + +byr:1946 eyr:2024 iyr:2012 +hcl:#341e13 +pid:765835791 hgt:159cm + +hcl:#341e13 byr:1927 +ecl:grn iyr:2011 +hgt:175cm eyr:2023 pid:638808763 cid:339 + +eyr:2030 cid:160 byr:1994 hgt:163cm ecl:hzl iyr:2016 hcl:#623a2f pid:569304871 + +byr:1965 +eyr:2020 hgt:157cm hcl:#a97842 +cid:271 iyr:2014 pid:326802068 ecl:#a16571 + +byr:1965 +ecl:hzl eyr:2029 iyr:2010 hgt:157cm +hcl:#7d3b0c pid:617693914 + +pid:547158528 byr:1956 +ecl:gry hgt:189cm +eyr:2029 +hcl:#602927 +iyr:2011 + +hcl:#efcc98 +ecl:#1ecd0e pid:160cm eyr:2027 hgt:183cm byr:2027 iyr:1963 + +hcl:#fffffd eyr:2021 iyr:2014 byr:1959 ecl:amb +pid:102521439 hgt:190cm + +cid:112 hcl:#fffffd byr:2025 +pid:016603375 +eyr:1942 hgt:145 +iyr:1994 + +ecl:xry +pid:#5be367 +hgt:171cm cid:144 iyr:1946 eyr:2034 hcl:z byr:2022 + +ecl:oth +iyr:2014 hcl:#7d3b0c +cid:316 +byr:1936 pid:088295340 +eyr:2029 + +iyr:2019 +hgt:183cm ecl:brn hcl:#efcc98 pid:821190245 cid:251 eyr:2023 +byr:1993 + +ecl:oth iyr:2018 +cid:131 +hcl:#524e2e byr:1981 hgt:183cm eyr:2022 pid:037981572 + +hcl:#18171d byr:1934 eyr:2020 hgt:62in +cid:64 +ecl:oth pid:343039563 iyr:2010 + +hcl:#733820 pid:374199356 +hgt:169cm eyr:2026 byr:1994 iyr:2015 ecl:brn + +pid:394267581 +hcl:#a97842 iyr:2010 byr:1988 +hgt:185cm ecl:amb +eyr:2022 + +ecl:#be3b70 iyr:2025 +hcl:z +eyr:2010 +byr:2023 +hgt:65 cid:220 pid:#d6af49 + +eyr:2029 +hcl:#a97842 ecl:amb hgt:159cm +cid:228 byr:1946 iyr:2012 +pid:805319194 + +hcl:#c0946f eyr:2020 hgt:171cm ecl:oth iyr:2010 byr:1958 pid:276122958 + +iyr:2017 +hcl:#da47a1 byr:2007 ecl:utc +eyr:1945 cid:327 hgt:192cm pid:549704477 + +iyr:1923 hgt:174in hcl:z byr:1974 +eyr:2026 +ecl:xry pid:158cm + +iyr:2022 +ecl:#ae10f9 +hgt:108 +eyr:2035 hcl:z byr:2019 pid:#1f4f7c + +eyr:2021 pid:959352732 cid:306 hgt:178cm ecl:amb +iyr:2012 +byr:1953 + +byr:2016 ecl:lzr eyr:2021 hcl:z iyr:1977 hgt:181cm cid:164 + +cid:242 byr:2008 hcl:#866857 hgt:172cm iyr:2011 +ecl:blu eyr:2026 pid:350658669 + +hgt:67in eyr:2030 +ecl:gry pid:156329184 iyr:2010 byr:1936 hcl:#efcc98 + +cid:110 hgt:76in iyr:2018 +eyr:2029 pid:474249956 byr:2002 hcl:#866857 +ecl:oth + +iyr:2016 hgt:193cm eyr:2029 +byr:1934 hcl:#b6652a pid:901756621 +ecl:brn + +eyr:2017 hcl:z pid:#2f9848 iyr:2024 +hgt:170cm + +hgt:60in eyr:2026 byr:1922 hcl:#18171d iyr:2016 +pid:921038878 diff --git a/day-4/src/main.rs b/day-4/src/main.rs new file mode 100644 index 0000000..f1f268e --- /dev/null +++ b/day-4/src/main.rs @@ -0,0 +1,80 @@ +use std::collections::HashMap; +use std::fs; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("input")?; + let passports = parse_passports(&input)?; + println!("{}", validate_passports(&passports)); + + Ok(()) +} + +fn parse_passports(input: &str) -> Result<Vec<HashMap<&str, &str>>, &str> { + input + .split("\n\n") + .map(|passport| { + passport + .trim() + .split(|c| c == ' ' || c == '\n') + .map(|field| { + let split = field + .find(':') + .ok_or("Invalid passport entry; no separator")?; + let item = field.split_at(split); + + let key = item.0; + let value = item + .1 + .strip_prefix(":") + .expect("We've already checked the separator exists"); + + Ok((key, value)) + }) + .collect() + }) + .collect() +} + +fn validate_passports(passports: &Vec<HashMap<&str, &str>>) -> usize { + let required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]; + + passports + .iter() + .filter(|passport| { + required_fields + .iter() + .all(|field| passport.contains_key(field)) + }) + .count() +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_simple() -> Result<(), String> { + let example = indoc!( + "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 + " + ); + + let passports = parse_passports(example)?; + assert_eq!(validate_passports(&passports), 2); + + Ok(()) + } +} From 1eed1d2f85303f07440ff59c09f2e5cbbcf70d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Fri, 4 Dec 2020 21:34:49 +0000 Subject: [PATCH 2/7] Complete day 4.2 --- day-4/src/main.rs | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/day-4/src/main.rs b/day-4/src/main.rs index f1f268e..1e5dfd9 100644 --- a/day-4/src/main.rs +++ b/day-4/src/main.rs @@ -37,13 +37,55 @@ fn parse_passports(input: &str) -> Result<Vec<HashMap<&str, &str>>, &str> { fn validate_passports(passports: &Vec<HashMap<&str, &str>>) -> usize { let required_fields = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"]; + let rules = [ + |year: &str| match year.parse() { + Ok(1920..=2002) => true, + _ => false, + }, + |year: &str| match year.parse() { + Ok(2010..=2020) => true, + _ => false, + }, + |year: &str| match year.parse() { + Ok(2020..=2030) => true, + _ => false, + }, + |height: &str| match height.split_at(height.chars().count() - 2) { + (height, "cm") => match height.parse() { + Ok(150..=193) => true, + _ => false, + }, + (height, "in") => match height.parse() { + Ok(59..=76) => true, + _ => false, + }, + _ => false, + }, + |color: &str| match color.split_at(1) { + ("#", code) => code.chars().all(|a| char::is_ascii_hexdigit(&a)), + _ => false, + }, + |color: &str| { + ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"] + .iter() + .any(|c| c == &color) + }, + |pid: &str| pid.chars().count() == 9 && pid.chars().all(char::is_numeric), + ]; passports .iter() .filter(|passport| { required_fields .iter() - .all(|field| passport.contains_key(field)) + .zip(rules.iter()) + .all(|(field, rule)| { + if let Some(value) = passport.get(field) { + rule(value) + } else { + false + } + }) }) .count() } From cab4e2974dfb386b9c67912f9bf61ea0aea3f64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Sun, 6 Dec 2020 21:00:40 +0000 Subject: [PATCH 3/7] Complete day 6 --- day-6/.gitignore | 1 + day-6/Cargo.lock | 78 ++ day-6/Cargo.toml | 10 + day-6/input | 2087 +++++++++++++++++++++++++++++++++++++++++++++ day-6/src/main.rs | 137 +++ 5 files changed, 2313 insertions(+) create mode 100644 day-6/.gitignore create mode 100644 day-6/Cargo.lock create mode 100644 day-6/Cargo.toml create mode 100644 day-6/input create mode 100644 day-6/src/main.rs diff --git a/day-6/.gitignore b/day-6/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/day-6/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/day-6/Cargo.lock b/day-6/Cargo.lock new file mode 100644 index 0000000..e508f5f --- /dev/null +++ b/day-6/Cargo.lock @@ -0,0 +1,78 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-6" +version = "0.1.0" +dependencies = [ + "indoc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-6/Cargo.toml b/day-6/Cargo.toml new file mode 100644 index 0000000..a253da5 --- /dev/null +++ b/day-6/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day-6" +version = "0.1.0" +authors = ["Tristan Daniël Maat <tm@tlater.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indoc = "0.3" diff --git a/day-6/input b/day-6/input new file mode 100644 index 0000000..9745c0b --- /dev/null +++ b/day-6/input @@ -0,0 +1,2087 @@ +v +vx +v +vx +nclmbv + +odgpnwqxhbits +pqwsnxihogdbt +pogiwxdhqbsnt + +q +o + +apulnqresohvktxcymzibdwg +sigdvakmlyxhetopnubwzrqc +iushndtclbeyowxpqmkgzavr + +ow +wo + +phegq +eqgph +hgpque + +xispjzq +sqkzcupi +ikspqyzue + +hgfesyvn +dnsvtkhglea +heygnqbcvs + +qmrpy +pmrck +vcprum +mrkcp +mrp + +kgjx +jghk +kjgu +enlgdwzqkjr +vjgk + +ungsdozkphlxy +nbkgzaifsovjpdt +geoskuyznpcd + +qw +qw + +x +r +sl +v +s + +kxcn +kxn +wxtkn +xkcn +xkn + +peionmzqyda +apdinomqzey +npmqoiedzay +dmpzoyqiane + +gpaedw +mwda +daw +awbd + +fyxeptlrmisjhdzquv +xfqydzruvmjepsilth +sipulvdzmftqeyhrxj + +kzofrcamenxyvwgpq +zqkrapxwomvycgnef +ywxvpazgcenrqkfmo +kgcvezmfqwrpnxaoy + +zhf +zegfhd +fhz +hfz + +iqspn +bytmd +sq +gwx + +begosk +gnbskz +sgkb + +ok +ek +ek +k + +hbucsatqvdryfojxlz +tufzxjvbrwasemg + +d +ef +k + +p +mrp + +kuywroetvjnf +wjvtkreufyn +frkyjwevntu +frtewnkjvuy + +iu +wzi +axbcgpldyi +seoiz + +ekjmbsuwglftpvya +esmwuftgpvyjalkb +vflbtyekmjupasgw +tepmwgksulybavjf +psawvbtgjfelmyuk + +jsmoydnvkiql +lqdojsvnik + +ayrtxivjlpeuzohnk +whjitnkfyealoguxprzc +bzjiruohtlakxnedypm +pmyxeizqjhkntoarul + +vnrcwouidfb +bufrwnociv +unrvefbcwo +cvnswubfro + +hmnoazwvtcrigqsujldpk +qeflzdwyongvtjishpacumr + +ytwpgkvceaolhrz +agyepkhwlzvctr +yvpkwcgerzhtaq +pcaeygktzwhrv +rgvpkwtylzhcea + +io +oi +io +ito + +ckmfawyb +glvfiymobadc +jnsfbmapcy +jfysmathnbc + +uxbfdygqwpom +sxmuwbdporyvqh +rbuqmwxydpo +ncpuyowqildjxebmk +wxuysoqhvbampd + +keo +oz +jdorxbia +lo +ok + +zk +zco + +bhwmscnrqeou +rlqenzswohbmu + +synmfzljkdebq +cmdyzlfekjbns +nkgzsmvlydpjobfute +lsfjkmnzdeby + +xshlzwcndtjefi +wcnljfditsexzh +ehtsjwidflcznx + +zry +vyqz + +owfcybsdipnqlthavu +psdiqfhwctrzvaybon +ybmpdciqhvtsfawon +givjcetkhwbdyponfsaq +cvotsnhqfywplidab + +cibwptjnu +ncruhi +hnuic + +apzjqbdlwyicfgxv +apxodvwlzyfbgqcij +pcdxjvzwqfliyagb +rixjaclsdpvyzgwqmbfe + +timpsox +poxsm + +fres +refs +fersq + +w +z +r +w +r + +xz +x +x +x + +ciyhkpjswqvxz +xyskvphmowjzcia +kywsxihpc +wtpnflcsekhbgxud + +qrtweigjlbucfxnkos +iwlbgmnosuxfetkrqc +sfbwxcotierqukldn +euroqfdxywclsitkbn +qelfbarchnwuxtsiok + +gj +woh +g +jr + +lpcdqf +qdfupwzcl +dpcqgtl + +zlnkeyroq +rtyoleqnkz +leykztqnor +ahoukcelrxjqynpz + +twxjdbuhclzgnop +fgeqkcbvziwtludop + +ylukhwtcf +aikdrxfov + +ucbklojiyxmz +ulkjco +kroljuch + +rfhyj +fhy + +cmtedvxioy +infmacweshtuo +tpoimecz + +kylduhw +yublkhd +kdulyh +dyuhlrk +zhfgkudly + +laoemdcgpyhtnb +ygclebodtmpnha +zomgnqpalhebxwtcd + +bmogrnztvyil +vlotrzngbmiy +lvyogrzbimtn + +zjcgheblotdramsn +mlgbshrzotcnjawd +otgsjdnmbrchlza +dbazlpfkhgtmsvocnjqr +sgrazcjondmlhbt + +ryhifaxpemsgcdubvtjzwnol +bduiojqhcsvlyrxefntpgwma +pvebfwitculrgyjshkdxmaon + +lqmopgwbesjhk +mgbkhqejlswop +wqklaeogsdxhfbmjp +sjgphokmqewlb +kesrghbmpjlowq + +tu +rp +r +rgh + +tfeyhjbnpaqwz +rxuefvgiaybzqth + +pwx +lk +iahyv +jr +p + +ezsghqtdnjbfox +dsucq +sduqp +cusvdqy +dslwqm + +dm +gf +g +xtg + +mfihn +mhyifot + +iabeswqrzlcxvkpmtnug +qexctgrkwbpusazinmv +riztmgqsewunxbapkcvj +avbuxqizmrkeswtpncg + +ozrwipdmgajlkfuxcnhtyveqs +fntcigalzdxmyuesjkqwo +dtfyeqklgjmwxunosizca +efclkowaujqzigbtymdxsn + +jkiupmatwxqhdrs +midjhwutq +dmhujzqwyit +dwuqhymtji + +ziqfh +hnboqe +qhktzdfp + +qohbywgtlucajf +ltahuywfjbmc + +arfpqdcbtnw +kfzonycewxbghvr + +tdxqelwnu +luenxdtqw +udlteqxnw +wxendqlut + +pvkrgaushqidfmnjz +eajzrkhndfitsqvmwugyp +sgohxqcvrzunapjfdmki +vinodpkazgfrmcushjq +jmufirnszpdqoahgkv + +uvcmgfrk +fugmrvck +kfuvrmcg +cmrfgkuv +kcvumfgr + +kmrb +krbm +rkb +bekrt +rbmk + +mzbrfsnxgjpywavcohuqlkitde +xpekistdzlrgmcawnvuqfohjby + +vrjew +rvj + +qlefnd +fdleo +pxcehwdfy + +amftbpvo + +ljcyn +cynosjum +jync +yrqbwjzc +jcy + +tmdcuk +ckudm +mucdk +cdkum + +icsvhmefaztoxkgndq +sbyqivkrdplwjemou + +jtrhafpkbwzdox +hbrwpzajokfx +jbkfaphxzcrwon + +bqg +qgb +bgq +qbg +qgb + +ljte +jle + +tvhjx +hvjwxrt +vtjxh +dtjvhx +vjxht + +zsdejcrvab +kbjzrscaedv + +oehivmku +igfhuxozy + +x +xs +x +x +x + +klqnrzftv +iqgfaupt +fdqgswyjt + +opjeslcx +psohecjxl +yxelsjoc +lescojvx +molnextcsj + +sf +cps +fos + +crxbjzkivydsgfpehmq +wnhfgljeptzrmikcy + +bghydvqxicsfunlzpart +rsyugqcxtvdzanpblihf + +v +gnvw +lv +v +lv + +mpzvdjqhxnuocr +chidrnuvxmkjqpt +suhdxgvbcnrpmj + +ewpfugobznrqydsj +ivgxtjludcm + +enytuvzoqmljfwd +satbgwcrndzyk + +fuzl +ful +lu +lpuxy + +qrhltkesazpmo +puaedmzsqhot + +vcktz +zqtjsbuiaomwf +ygzkthx + +zt +tdz + +fvpjlcarqdukio +luotiqzkjfrwahcdvm +rcykufoadqxilvj + +kfpuwxi +wpfxuik + +xjzpf +cyqsouwf +xzf +zf +bifpj + +q +cw +n +nu +q + +lscdtzvhajkqpm +vdpklhqscm +pvcdqskljh +hcjdqklsyvp +eqshcdklvp + +muyldxobakfq +ecjvfm + +jkas +ws +s +ws + +qbjzcolnuy +jyulobzncq +izqlnycoubj + +yvsoztedn +eotvydz +yzetodv +edvoyczt + +tcfqkxrib +fozbtnlwucq +qvagfdebtc +qcpftbk + +amlcyk +acempy +aymcv +cayml + +gsybwf +ybsfgw +bsgywf +bfwygs +fsygbw + +hypxicwobt +pciytbxwh +xhycspitbw +pcibytrhxw +yckhxtebwpi + +olneqtcpzfiahbj +oitbqejcahpnfmzl +bpnjyhfkqmlczteoai +hlpjefoaqznbtci +jdwtzsfcviaqnobhpxel + +mkflqourwyh +kqmylohfu +lyohqumfk +fyhukomplq + +cfegzaprw +prvbgiymj + +besuka +hsnkua +slaguxky + +smwuovdpnjfyl +mcjvguors +qjvsmiou +abotmkxujvs +uhmoqsvje + +udrmcxqay +dqyhumca +mfwcujskglbedqt + +xewpyrsjzktgbaochuni +xjaohuwligysztekpnc +tfghodxyjsnapmquwcziekv + +fxypwlo +wpsxleyfo +ylmpxfzwo + +ok +rspbkt +mauyxcw +rqdkz + +fsehripoyjawt +styheviwfrn + +onxrvplyuzqcj +vlzuyrcpxoqjn +nuoqyrzjcpvxl +ljyuoqvnzprcx + +o +ac +c +c + +hwxmesjuzo +hylvoxzpfbntsr +shoquzx + +pidfxg +igrxm + +gshkfbcujpyztoevxdlmaw +kzvmejbygdpaxufhlcotws +hfgamkstbwjoyxlczupevd + +p +p +ltf + +iufdzosnagkhtw +dzkhlgvsitucoa +adtgzokhsviuc + +jywe +wy +yw +wzy +yw + +ghvadykiscnfxo +noxckgivyhdaf +gfxmtodbwvnkhipaqy + +ifsp +xnivluaq +fioe +wisydc +siw + +jxbmclnevwztqug +keptqcrmzufglhi +tleqgyvjbumzdc +xzdmslqcutge + +ogdxpnjbti +ipgnotx +ipehgonkcxrtfa +ntdiygpox + +wxhcjtredknifvulymp +vgksmwqzctybidjofha + +lxmficysbt +jslmrn + +pcoxigrdtkul +sjmhtbxulyord +uxlcpdktoarv + +crgundohktjfasebzvxl +gdsvcufrnljazotkxehb +onbgcjfeirxkhzvudtsla +njcheafbokgzvsxrudlt +ekgvfruchstjldoxzabn + +wmkivpgfqdrsl +wmcjvofkhnz +kfwbuvam +jtmwhfkvz + +thy +hy +yhe +yh +dqbyh + +xtbhkovsjcga +xqkoeavjsch +xacvkjhds +mcjuwskavnrixyh + +lhfwqr +ypkruwqs +xcgdwmj + +eyiwrundqsflgcavxk +fejmwtyulodkhrzbp + +yvz +expa + +aohj +ejoai +ldypfnejoa +dcxpjoatv + +vuinj +prv +v +vlr + +sqpdmrnlwa +nlgasrpqomd +padlqsmrn + +r +pjd +d +azbhs + +hfotieypnlwdkjzv +jlfveimtdckongwzpy + +af +zaf +afn +abf + +csjx +scrk +ucws +csj +sjc + +juwtder +dtjrwe +werjdt +djreywut +rceoqjwdt + +nazufjeomxpkc +xmeopajcunkzf +pfcuazejknmxo +nkzceomfapxju + +epiykxforjz +fylzbxjeoipg +ahfyxvpmsujiedzon +eoyxcqwpikjzfg + +umfrlqhakzdn +mshjfdkqungrzv + +opxjdgemsvailruzfbcq +ozmgbdirxelyfsqpjvuc +iqbucpflxsvzdoetjrm +ysiqolmberzvjnctdxgufp +bxfemdhcukplzrijsqvo + +yocg +g +uqg +rzy +vjbmw + +vljzumo +ujzvmo +vujomz +vjzomu +zmjuov + +srwagukx +ahjroqmxy + +cgkj +jcgknvs +jgkyc +kcjgy +jrgck + +ugcwvx +gfuzaxw + +n +o +n +n +n + +vsmd +mcdvbs +cdmxy +tadr + +znsokugwejfylica +iwpnfyolqzkcuaegdsj + +azuver +remzau +arezu +zerau + +wevbmlq +bwalcodevx +ewtuxlbv +zivypeswlb +ebwvaln + +qjrdgxmc +hrcozqdxj + +mpcogjzyrhisuxlv +mskpazxdfvqc + +xtzyl +lxyt +xytl +xlyt +oxslyt + +jrteqswkcazlbfhog +tsqafcbgrelzokhjw + +fjqlibpwukcoznavyrtd +bzdtupklrqivanwyojfc +lvjarpkyubndzqiwoftc +bdrcniwvktylpajoqzuf +uycprvalqdiwonbjztkf + +lwga +dgswz +zgwy +nwugcrik +gwsy + +gwmvxakicou +avugcmowixk +ckxugomwvia +ukwacxogmiv +xiwavcgmkou + +znvgeymhb +rztconyiq +lwzayn +jswnuzyk +fnwuxlypz + +etkdwlgscmzyuafvhbo +vhctfgkmwouaylesbzd +vfcetldzsyobghmuwka +tsgzmkufeajlvwcyodbh +gazdhmkotswlfuvbcey + +zdsjweg +sezjgd +dsgzei + +zi +z + +tbg +fbtg + +g +g +g +g + +rid +jvi +inxo +id + +dbrjtfupcyvzlqmwei +zqbwfmljvcdirtyepu + +jmhubvclsdprw +cpswbmldjrveu +rpbsvucmdfjlw + +qk +ekniz + +kvlmhegzcryd +zrlmdgvefyhc +zhgvrqueymdca +remdfyhzcgv + +zxhiaqs +hxiqsa + +sumrbd +qgrbuw +ubqgr + +dkmqsebjznylwucxot +ewyqhjrlpcfotbis + +ti +kxi + +dvgmlyepfnhscui +isbvmudynplf +nzqldwmfyuvtpi +finlydpourvme +dulnypvsrafmik + +zemctnsralu +trnaelzmsuc +azrstumnecl +mltrceasnuz +rtazlucenms + +aydgxnwehomujpv +nedjuaxhopwvmg +dvgwhfojpanmuxe +wjaenpdvmohugx +vanuomdxjehgwp + +xchjblnwmogv +coxlngbwjmhv +mjbwoclgxvnh + +br +rohb + +knpclsvozb +slcvbznk +klcbnvzs +lsvbkncz + +cehpgtzmawkjndufrlixb +anrtxfdbhiwmcjzplkeug +rkmwtcunzxhjpgbafdeil + +rqlstcwxkmoz +thsvxzkueymrlqw +rqlskomwzpaxt +wcxrzmptqkls + +tshv +hfzdlpij +hmces + +kfjmaedcoqltuwp +jrngliqdohsce +bgclzdhjqxyero + +urndaqxz +fyw +wzqua +ehglomjvbk + +guhfvqlnkydpiz +ljgyoiqarzksuwet + +yutebcorzh +slxcdkqnhjga + +fivxqukh +kixqzvu +vqxuki +xnpiuqvk +kvqfxudie + +rpsfdkmc +cdefrksmp +khmsfrdpc +pdmkrcfs + +hwn +whn + +rxhbzyedclofgwmuktsp +xlmozsbgkcfeyurthdw +psgtkcfazdwomblhyerxu +ytvfsxukgwmlrzdhobec + +nrvyx +vytxn +xyvn +nxvy +xnyv + +qct +cqt +tcq + +y +dy +lcwtunshbmy +fy +ry + +cnboedgyxatrk +ktdbeocgnay +wbkgtecnyahmodq +nxbtgzcsyeukrado +ydagcekbfont + +jytulh +yhtlz +fwtrkhly +bylht + +huigqrok +ikhrong +bighkwor +kgxrhosi + +zbkrpelxtsohdaw +ewzkvcxrdtboas +rabkdwoxyneszt +axhkbzrwdteos +rtbowkelsxzad + +aonplewqryh +euyqrfncsovkld +byalnwiezroq +enobxrlqy +pmgzeryonql + +akxpsmecuj +kfgsexjm +oxqfeskjm +yervixmdktlshbj + +r +r +r +r +r + +rdghefnubpzkma +dhubafromtpekzgn +knmhfjduebpgraz +zpekdbfamrnihug + +ybcgsmlwhovidfezp +omfpzqugycwrhbs + +x +x + +vjahspyncxzmie +zmpu +krpmzog +tfpmkz + +morafxw +xyckafoqwjm +ialpowmf +xhrsmwokbfjazu +anmfowdbq + +gdpblscxazjrmikoyth +exrolqfahdbymcwpksjt +gtmadncysrlhpojvxkib + +nxdilkwregfbaoqp +exnjrbsifwypkqovag +fgrotinqbwpkxae +flndzeoxkwgrcptibqa + +sidjln +mjslodni +ztdoxjnise +odnsehfjti +dnsyij + +qx +wmxtj +wxzmtucqy +godkvenhxpb +xrztj + +xofhvkjytqus +ytdqjkufimvx +uwyqntcvfpxkj + +rdtqukinob +wzufpcolmskynvteh + +vnab +kouvrfe +ljvcd +wqbdpvsy +bighvnmx + +frgsavwjel +fjlrwsaveg +afeljgrwsv +jlvsrewafg +kvfesjlwgra + +ygdszflehmwcnbopiatxju +jdnupgzmilsywaechoft + +da +rzfvailh +bhorq +ctgujpmsw + +ymbnzldsi +ltvsfm +mgcsl +emslgw + +taqecxvdypifblzgk +cekxfvgplrnqbty +vejogtfwqbyknlrpxc + +souwzdkcbqf +awzqgvbscukdpxn +bcszjdfkuimwq +sdbcuzqkw + +avrlf +kerlgmuahvc +wavfibznrol + +upnkam +xmjt +milex + +rxotufwczkpvia +pajkvhwtme +gpnektwljasv +pknaqwtvey +wpadktnlvjb + +kpfj +syurwad +asyvld + +p +bpz +po + +s +u +s + +ksvbeno +uyfivq +kbjodvh +czptrmawg + +xtiqze +xtisdz + +pylbdvkncjurmgh +yhbdoltvrpiknmjucg +vbmlhynrcugjpdk + +byoavnixtlzepjds +sapxunqeizdvblyho +qvlmeoisanzyhdxpb + +ifykcw +iyckw + +u +p +s +s + +f +f +f +f + +fvbjxaiklos +ufqnvcgxikdpalobt +bixlarfkvo + +ygpsxce +cpdsfygaxueb +ycgsxep +epcxsgty +pctxesgy + +meawzoqnidgh +hodmagqnzew +mwhzndaqgjoe +cdhseoqauwngzmx +oawmeqfdnhzg + +yrlvejxocsh +hvjrsmloyne +nsrvyojlhe + +zhufxvrkcdmwqlsa +lergvwdqnaosxtzchukbj + +xbvyt +ybvndgxt +gzxtonyb +xbcuwtyp + +creoxajkgvq +vgljkrexacwmhq + +wckjovuftgmb +boktfjuvgmwc + +cguaojyvre +ohiknuqags +lcazjyguor + +inhyfk +kify + +uhtqci +tfoqacim +srvcjytkqgx +hqctz +qmctahizn + +vekplqxuhrm +kmeuprlvqxh +vhlrkmpxuqe + +at +tagexyi +mpt +yxta + +uezmyjqvbgspirlc +fydbljgwmzxquecop +zptrgeybcqmluj +pelzjcugymtbvq + +fakguojpbsic +ubcfgyjakpiso +bliusctfvkampjog +fybsicjawkupog + +kmxerqlautij +zxidayte + +imbngcehtvs +oipfmkrqusnwxdzyl +imasjvn + +pek +e +ei +ep +ex + +yuw +uyw +wdysu + +omikta +zjvatmw +txsma +cm +lndgqmry + +cwazbkolvys +liyoveacbswj +siwokbavleyc +rocsyndufablvwx +aylbvcojesw + +nazfjsrouhgtv +zgsprothnufav + +ptmshxwqk +sebqodwi +euqsw +zwousq + +uqltjsikhpvefdawycbzg +plyhvtieubakzswqcfjgd +wehjvikyfpcsgaqtlbuzd +sfibzvquyljekgthpwcda +cgbtvdolizaeqypfksxjuhw + +izeqstg +sgiqzet + +fqbmpoxscydhrtljzga +cfqodxevmajhbrplzt +oecfrzvbpdaqhtjlxm +adfbxrmqlctzpjho + +dsmewbhpvrfuknj +opcvhwtrqkue +rwvkguhpzoe +vxpghreuiwqk + +fjzi +ftmizn + +xumjz +ujxymg +zumjx +ujmx + +n +l +l +x + +ghwfslriojz +rfzliwoe +flrziobw +ifcpozlrw + +smvfnglxaeczqwukojhbi +uieagsoqbhvlmjcfxwknz +nxoacfwemhijsgqvzbkul +qanmsiwvflcjbxzoeugkh + +pzciwneljbghoufdvymtqar +exlhrjvkpnmdoqbtzusiwcgf + +uxjwpobgcflndqairke +oktwumrzjlyedagxbinsfp + +oibhmyeguqkxjrcpawzfvds +vhsauyxdrobwcjmkzqepgif +gxhiwozfkbsecamrypudvjq +mxywofehvsczapkbuidqjgr +xsmvybwqdgrzeucfahpojik + +gdtlkuomn +ytkueoglh + +xgimja +gjxibma +mjbagix +xaiojmg +mgjaxi + +sgnfdiz +dto + +yhkvqrzw +hyknjrzvq +xtrhdsvkzoqy +ykqvzhr +zkqyhanegrv + +tzqrhavysuodmjp +abvpofyzhmrjqdt +yzopriuqnvmtahjd +atmryjpzhovqgd + +cyljrwofasq +afoqswrjclu +carljswfkoq +ljwsfocqyra +xjolqcwfars + +r +o +ak +xdje + +lfyjxpoeau +yhlgcftszpr +pkylfomw + +lunijqekwg +vafgdsjqeklniw +yeglwqkjin +leqgjkniyw + +mpvlijnfbz +jzmfbplnvih +jqdlpvbmnzif + +tk +tk +qkst +kt +tk + +mdowpcnxgbvuytqezljsk +tbnzcduipewvxlkqrsmjyga + +ilumzjpqotcv +fgtmowyx +gdsotkrm + +yncslevbgrqmizwu +brclynqgzvuewisfm +lgbzcesuvqnrwmyi + +bjmzopcdiqlyueh +olyupebiqcmzjhd + +eubsjrvwmyinzkaqdgcf +icqzjksbyregauvfdwnm +jugdnbsczwqfarvkyiem +benyrimfwzaqvukdscjg +ndcuvaziekbwyjrqgsfm + +g +c +c + +gvyfqupnxtswb +uvtykbjxgifcqz +lhvobuxgqfetmy + +dpzgaulb +plqugbrdmac + +htr +kgrt +rt +tr +trg + +o +qv +lr +m +l + +qotxnerijpfbkcagylh +nilhcfrpkjgboxaqey +ognqxipefrbjhlkacy +kojtilqxyrhbpancgfe +qjilgekcfsnhxapomrby + +fes +feoijn +ef +ef +ef + +dlzga +tlsidg +gdl +lpdgh + +onysxwkqlcgdemhup +mzlscwgkdnouexyp +kzdubeoyslgnpcxm +dymulpowksnegxc +kpusvxldgyaonemrci + +xh +e + +utbirhymae +yzehmoukq + +ijvulcmbrgkyxao +uvrajglcbomkxiy + +xo +zo +o +xo +o + +mbghatcenlifqjdkp +ejscikpgvtomhnxqzf + +stpvo +cjvpthsl +spvdnyrt +qvypftsx + +obrxaqyudvinmk +qlimnvosubahydgkecrx +yrftzoxkjqvbaidm +kvqaxdmboirwy + +dxj +xdj +jxd +jxd +djx + +hfjeucmkrvnwxs +nxujekrqmsbofhc + +ezarol +lebz +bzel + +jgmzcl +jlzcmg +cmlzjg +jmclzg +gmcjzl + +o +u + +bdfqljiuacptzvgrxoe +pauvztlihdqrjofgx +xtrjvzuaipfldgoq +jzrdtxqlwiavungfpo + +cjurgpeyvlzhafx +aurhsfbvpeyxgjzc +gzvhejlkpxyfocura + +rvyfbicazduolwtgqk +qklnrgyaofdzvciwut + +qsw +qs + +nrfgxpujobhk +rxmpnokdgbjfi +lxbngkrfyjvcoz + +e +e +zegkx +e +e + +kon +k +k + +ekvi +iekv +ekvi +ivek + +jfbyxwhrne +nxjhrfbdwy +bewhryfjtnx +mfhoxyjbrsnw + +bn +n +sxv +d + +egrzknhbxfvqtdcu +edhrioxvjgnzbf + +yjoskmhw +kdtqfehazbyu + +zq +zq +qz +uqz + +ilbpcz +ibcqplz +gczbpil + +nikychwgab +caibgwklndy +ckbenqwuafyg + +qubikjdz +jkiuzdb + +gwmavrpfsdnkyizuelt +yuqnvjmlogpizcfetx + +tnsf +thnfs +tfsn +sntf +nstf + +vflagunhs +aiwvlhjfsunxg +ulvhgfsna + +yajtfdwh +hzdpalftjb + +nazpqismug +pznuismgq +mgiqnupwsz +mgptzusniq +boifzpmsuqgn + +ohu +ht +hpygo +ijkdfhcb +uhno + +kfzmrhyjvw +hzgxpjbkwvyr +zykmfrvwshj + +yqsezgcojbw +zjsgcoeqby +jgfsbozqyec +czsgoyfbjqe + +fjywktd +yjktfwd + +nwvrodtpqy +xtrvnosihzgq + +gdwcmlxiqtynsjozapeur +xwlgsjatqzycnodprmue +adxtgqujrcopnlwsmezy + +snep +shwz + +unvpgc +guncvp + +suctpbxogra +kcxvgteayu +ztgxuacy + +pewbhlvjtg +omskldnz +iafryucxq + +zoucjefxpdta +xbfijrelpucsot +ktoexjpcauf +jtezoxkpfhcduw + +xiaszncr +asxnircz +xzncrsai +rixseuzanc +nzaicrsx + +owtvxqcizrapl +alqxivcprzowt + +ltrhdykufvwex +ekxvfldwuhrt +ervktduwlhfjax + +ylvgpjthiex +snmbgjfzduxqearikc + +eml +bkhyl +rzsoitwqn +dacupjev +fldc + +uqigoj +ojui + +zgbsumeycaxvontwdkij +jbtelqcxnumsoakiwyvg +waseyvijugnkobptcmx +atesbkmjuhcvfngxywoi + +pc +pc +ikyp + +xtgvlenosarwubmfihz +txganvweourhbqslfmiz +lientrsuwghobfmvxaz +taluorneizhswmbxgvf +zginuholscexmftrbwva + +xjkv +xtouw +tywx +oxwt + +zk +cz +bz + +qcp +qpc + +ogptyeunzsqmarjc +jrvlopzynes +xoszpnjryle +zbrnypsoej + +nuigyflbxs +yxunspgj +vnuscztymqowgxr +ixnyshgu + +pdn +cyskxdp + +ewlkgbdxqtiz +eqgxitldbzkw +kbdexzgitwql + +c +p +t +v +gqh + +uvigbjqk +ibvugq +vbuiqg + +wzdca +dzawc +cawzyd + +mfaigwlu +pygxjmufwal +ugfwlam +glmafuw + +bewfkxsvl +yxdqnmaturov + +fdrbt +mxjnfdqpc +wdltfo +adwletfr + +t +pgo +e +tiabc + +zbthk +zbkhatr +zbhtk + +flxwhbzkei +lwkhxfezbi +xelfwbzhik +bhzefxkliw +klizhwbfxe + +btmwkoqs +bstomkqw +wskomtbqi +kswtbmqo +kqbswotm + +kdfbzj +bfdzjm + +bf +ef +f +fut +bf + +bvl +lvu + +kezwynmfrgahlbqsjtdxiovpu +wmaukoqsldvheztxrgjpifbny +qgkrwvaiznhpmtlxjubesdoyf +osverdamnxjufcybpkztqighwl + +nza +anz + +wfjsdaq +iwlrou +ykwftq + +zgtuvqxmljwyaifcbp +pcgytlqjvbaxwzimf +cmqzwaljvbufyigptx +sxgvcbweymiflqajtkpz +fhgmjpwclzibtvaqxy + +rohqjmnvlsdaigywbxe +xmhiarjdogqwbvnlsey + +jhz +jhz +jzh + +oemyvhgznpblsq +hpsvzycebqlmng +elhnwqdpbsgzyvm +cenomgyzhqlsbvp + +gdnc +wncd + +tnlprwbcsaygzqxuoev +rxqdasecgwbzmfvntpl + +jtucglizkohrafs +ebjhogu +hdugoj + +ncyvqk +oulfaxqnerid +ptmsynbvkwq + +mxihwyzetlbnkpfs +ksqwhxtzbenfpim +nqbtxwsepfmkih +khixywsmbnetpfl +peikctmafswhnbx + +phylqxrdtg +yxtapqni +nkiwytuveqxp + +lhqrfys +sqdfly +ysfhlq +sylfq + +sqpjuobilhmtvrxaz +kuwgncfdv + +dqzke +qezkd +kqezd +zkqed +kdqez + +lio +iol +loi +lio +oil + +hvpwi +rhvp +fpysmvd +tpvrl +vph + +idjeoxvyqaufgpnlc +xnplcqjvdyigsaef + +y +qw + +rhb +fpqsiadrjkl + +hinvdck +kvcahnid +fhcupntkvdqijmy +dvnchik +aivcnhxkd + +xqugmnktofslbpevzd +yaqztjnicrwd + +biadvoeznswx +iaxszcdwboj +isbdkxzwoanve +gikqxzorsadfwb +asozrwidqxvb + +bvotgwrxe +xbhryeov +ojrvxebi +vxeorb + +fb +rqwl +qlrjyfp +nkhgmov + +zexjvfbwro +wzvxorfjbe +vorwzexbjtf +xeovwfjbzr + +owfmx +uxomf +mfo +cfkmo + +atwsbvcn +mijkzngueoy + +twqprciyaxkb +barckwiptqyx +iabyqwtcrkxp +rqbkipctxywa + +vmhzjek +tx +aix +dsa + +byzxqpgureth +gbxryhptqiezuc +lqrzjwythegxubp +hqruytzegbxp +tepughsrqzybx + +hwydxbeflai +yhewcfbaixd +yhwadxfeib + +hi +h +h +h + +mhket +mtkh + +loacixzmfy +fmxlzaoyci +ylifaxopczm +czyafoxmli + +ymrfxiwbse +ihpqjuaczd + +ealixkwz +gocmqyfthp + +gedjwnt +wtdezgn +hgcuwrtnped +zjngtdlexw + +jk +jk +kj +jk +jk + +gkxldasfhqncbiyu +hnpfbycsgqkuldex +hquxfksigydlcnab +cxauqgdiyfbnkshl + +niahryvlxbekt +dyhknvbaleirtx +tknljyvrihbzxe +seyxknvihrcbtl +bxrhukldytvneiw + +vuq +cfawvlt +rhnvzu + +wxlhvnmispbot +whvbcxmolntips +snhtmbpwifulxov +itswhupmncvolbx +rhtlsdpiwonbkqvxm + +ojmyc +kfzuehvirps + +mk +km +km + +fjyx +jitrevpfy +yjs +jyxmiect +dykgjnzbl + +rbwpjflnoegkqt +hwxceyimsdzntvu + +golf +fzgol +dlxfomg +lfozg +floag + +dfbmcyi +yvzpkrbc +icybu + +mcbditlrfgeaoh +camdhrfbvoglei +riagefbmclvokqz +dbfogjmeacrpl +lwuogecanfxsbrmy + +lgsnwuockhmpxibedqzaf +cvmiepdsubkgwzhf +bsvipdjwcfkmezugh +wgfzicsmubpdkeh + +iyeorgvpmutnhqcwxj +jqoguadpnmrk +nmpquzglaorsj + +apjqhruongvztmiywecl +padwbieyshonfrtxqcukzglv +yolrhezqicgpmvtaunw +mljzahrwcpqygvonuite + +szhjetf +sdtozreuhmfp + +f +f +mf +f + +gnjqcad +idlhjay +rejbwamoud +danxj +zjkdia + +lupiwyqntjgekvsr +gwqupjykitrlnsbo + +ojcxmuqsrhyv +lgcovdyhnifsp + +wphvcu +lznsm + +wpq +qpw +wqp +pwq +fqwhp + +nyzx +ubpx +xwi +wtxhe + +vkujyxtido +tvouidyjxk +vidkjuoxty +uxtoivdkjy +yvukijdoxt + +fpuboyiwdktvc +hsqnzuagr + +swabt +mwsb +sbwm +bws + +idlshcnf +ficnd +tdfcin +nicdf + +ajodwgmsy +wmjvoygd +ojdwmyg +dovgwjmy + +yemtzisjpxchanuovwdkr +evxtomkyhrupwsnizac +ytevcsimkwrnzoauhpx + +whley +dhyetlqf + +fqx +xf +bfxz + +ipwvb +vdnb +rcvnf +chvr +xjtvyez + +sdpuoewx +wfqrphkdelosbvgyum +pudzioesnw +idatsupewo + +knfheau +kanehuf +unekfa +klcsnemaufy + +yhuvigcrp +rivgypcuh +urphgvciy +iyhrcvupg +vuphryicg + +flozkyvhnwxr +fvpsybhlwrz +hzqvmfgrl +irholckaveszf + +gypwufz +agspwqmuyz +yogwpzu + +c +oc diff --git a/day-6/src/main.rs b/day-6/src/main.rs new file mode 100644 index 0000000..9035577 --- /dev/null +++ b/day-6/src/main.rs @@ -0,0 +1,137 @@ +use std::collections::HashSet; +use std::fs; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("input")?; + + // Part 1 + let groups = parse_groups(&input)?; + println!("{}", count_answers(&groups)); + + // Part 2 + let groups = parse_group_individuals(&input)?; + println!("{}", count_individual_answers(&groups)); + + Ok(()) +} + +fn parse_groups(input: &str) -> Result<Vec<HashSet<char>>, String> { + input + .split("\n\n") + .map(|group| { + group + .chars() + .filter(|c| *c != '\n') + .map(|c| { + if c.is_alphabetic() { + Ok(c) + } else { + Err(format!("Invalid answer: {}", c)) + } + }) + .collect() + }) + .collect() +} + +fn count_answers(groups: &Vec<HashSet<char>>) -> usize { + groups.iter().map(|group| group.iter().count()).sum() +} + +fn parse_group_individuals(input: &str) -> Result<Vec<Vec<HashSet<char>>>, String> { + input + .split("\n\n") + .map(|group| { + group + .lines() + .map(|individual| { + individual + .chars() + .map(|c| { + if c.is_alphabetic() { + Ok(c) + } else { + Err(format!("Invalid answer: {}", c)) + } + }) + .collect() + }) + .collect() + }) + .collect() +} + +fn count_individual_answers(groups: &Vec<Vec<HashSet<char>>>) -> usize { + groups + .iter() + .map(|group| { + let mut iter = group.into_iter().cloned(); + let first = iter.next().expect("Must have at least one element"); + + iter.fold(first, |cumulative, entry| { + cumulative.intersection(&entry).copied().collect() + }) + .len() + }) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_simple() -> Result<(), Box<dyn std::error::Error>> { + let input = indoc!( + "abc + + a + b + c + + ab + ac + + a + a + a + a + + b + " + ); + + let groups = parse_groups(input)?; + let counts = count_answers(&groups); + assert_eq!(counts, 11); + Ok(()) + } + + #[test] + fn test_simple2() -> Result<(), Box<dyn std::error::Error>> { + let input = indoc!( + "abc + + a + b + c + + ab + ac + + a + a + a + a + + b + " + ); + + let groups = parse_group_individuals(input)?; + let counts = count_individual_answers(&groups); + assert_eq!(counts, 6); + Ok(()) + } +} From 0c61772aa026a1be39a2e1f284b27e14a077a94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Thu, 3 Dec 2020 20:41:18 +0000 Subject: [PATCH 4/7] Complete day 3 --- day-3/.gitignore | 1 + day-3/Cargo.lock | 78 +++++++++++ day-3/Cargo.toml | 10 ++ day-3/input | 323 ++++++++++++++++++++++++++++++++++++++++++++++ day-3/src/main.rs | 91 +++++++++++++ 5 files changed, 503 insertions(+) create mode 100644 day-3/.gitignore create mode 100644 day-3/Cargo.lock create mode 100644 day-3/Cargo.toml create mode 100644 day-3/input create mode 100644 day-3/src/main.rs diff --git a/day-3/.gitignore b/day-3/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/day-3/.gitignore @@ -0,0 +1 @@ +/target diff --git a/day-3/Cargo.lock b/day-3/Cargo.lock new file mode 100644 index 0000000..d0411da --- /dev/null +++ b/day-3/Cargo.lock @@ -0,0 +1,78 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-3" +version = "0.1.0" +dependencies = [ + "indoc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-3/Cargo.toml b/day-3/Cargo.toml new file mode 100644 index 0000000..d861f49 --- /dev/null +++ b/day-3/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day-3" +version = "0.1.0" +authors = ["Tristan Daniël Maat <tm@tlater.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indoc = "0.3" diff --git a/day-3/input b/day-3/input new file mode 100644 index 0000000..b4223c3 --- /dev/null +++ b/day-3/input @@ -0,0 +1,323 @@ +...#...#..#....#..#...#..##..#. +.#..#.....#.#............###... +.#...###....#.............##..# +...##...##....#.....##..#.##... +.....###.#.###..##.#.##.......# +#...##.....#..........#..#.#.#. +......##.......##..#....#.#.... +....#.###.##..#.#..##.##....#.# +.......#.......###.#.#.##.....# +.........#.#....#..........#.#. +.#...##.....##.........#..#.... +.##....#.#.#...##......#....... +##.#.#..#....#....#....#...#.#. +##....#.#..##......#....##...#. +....#..#..##..#.###.......#.#.. +.....##....###...........#.#.## +#.....##.........#....##......# +........###.#..#....#....#..... +...#.......#.##..#.###......#.. +...............#..#....#.##.... +..#..###..#.#..#.........##..#. +####..#..####.................. +#...####...#.......#.#.#...#... +......###.....#......#..#..#... +#...#.....##.....#.#..##...#.#. +#...........##.......#......... +.#..#.........#.#..##....#..... +........##...#................# +........#.###.#.###.#.#.##..##. +.#....##.....#...##.#..#.#..... +..#..#.....###....##.#....#.#.# +#......##.##...##..#.........#. +#..#..#.....#.....#.........#.. +#....#.#...###.........#...#... +.#.#.....##......#.#......#.... +..##......##...#.#.#.#......... +..#......#.....##.###.#.#..#... +....#..#.......#..#..#.....#... +.#.#.....#...#..........#...... +#.#..#...........#.#.##.#...#.# +..#.#....###...#...#.....#.#... +....##.#.###....####.......#... +.....##....#.......#..#..#....# +...##..#.#.#.#......#......#... +...##...#....#...#......###...# +........#..#.#.....#.###....... +..#..##.#....#.#.........#...#. +.....#.####....#.##.........#.. +......#...#...#.....#......###. +.##.....#....#..#.#....#.....#. +...........#...#....##..#...#.. +.....#....#.....#...##..#...#.# +.#...#.........#.......#...#..# +...#..#...#........#......#.... +..#..#####.#.....#.#....#...#.# +...#.......#.#....#...##..#..#. +####..#.#.###.#.#.............. +.##........#...#.#....#..#..... +..#..............#.#..##...#.## +.###.#.....#.#.....##.#......## +....###.....#...#...#.#..#..... +....###.#.##.......#....#...#.. +#..#...#......##..#.....#.#...# +....#.#.........#.............. +#.##.##...#..#.#.#.....#...#.## +#...#...#......#...........##.. +#.#.#......#............#.#.... +.#.#..######...#.#.........#.## +..#.#..#...#......#............ +....#.....#......##..#.....#... +.##............#....##..#...... +.#.#.#...#.##.............###.# +#.#...#...#.....#....#.#.#..... +........#..#......##.##.#.....# +.....#.....#.#####...#....#.... +.#...#......#.........#.#...... +...#...#..##.....##....#..#.... +....#....##..#.........#....... +..#........##..#.#........#.... +...#...##...........#...#....#. +.....##.........#..#....#..#.#. +#..#....##..#...##.....#..##.#. +..#.#.#.#...#...#.....#.#....#. +.......#.###...#.#.......#.#... +....#..#..#.###.#.....###..#.#. +.#..##......#..#..#....#.####.. +..##...........#...#.........#. +......#..#...#..........#...... +....#..........#......##...#... +....#..#.##........#.#...##.#.. +#.##......#........##.#...#...# +#..#....#.....###........##.... +...........##.....##..#....#.## +..#....#..#..#......#.#.....#.. +#....#.##....#.....##.......#.. +.#.....#.#..............#.##..# +.#..#..#...#...#....#.#.....#.. +...###...##.#...#..#........#.. +#...#.##.#.....#.#....#..#..... +#.....###.#.......#.#..#.#..##. +....#..#..##.......###.#...#... +.#...####...............#.....# +.#.##.#.....#.....#.#......##.# +#...........#.##....###.##....# +...............#..........#.... +.....#..#.##.###.#............. +...##.............#.....#.#..#. +....#.#...#.#..#..#..#....#.... +..#.......#..........#...#...#. +...............#.#.#...###....# +....#...#.##....#..##....#..... +........#.#.##.........##.##.## +#.....###.......#.#....#..#..## +.#..#...#......#.#..##.......#. +#.....#.#........#.##..#..#.... +.###..##.#.......#......###.... +.#...###.....#.....#....###...# +........##.##......#.#....#...# +.#....#..#.........#..##...##.. +.......#.......##.#..#..##..... +#..##..##......#.#......#.##... +..#..###..#...#....#..#...#.... +#.............#.####.........## +..#..................#...#..#.. +..#......#........##.......#.#. +.#.#.#.#..###.....#....#.#..... +...#.##.###.......#....#....... +................##...#.....#... +..#.###.#...#.####....#..#..#.. +..#....###....##..#.#.........# +.#..#.#.....#........#....##... +.....#..#......#..#..##.#.#.... +.#..#.........##....##......#.. +.....#.#...#...#.#...#.#...#.#. +..#..#...#...#...##.#..###..... +..#..##......#..##.#...##...... +.......#..##....##.#......#..#. +..#......#.#.....#.##....##.... +..#....#......#......##........ +....##.#.#....#.......#.##..... +#.....#...###....#....#...#.... +............#.#..#...#...#..#.. +..##.............##....#....... +.#.......#.##.#......#....##... +...##............#....#..#...#. +.##.####.....#.#..###.#....#.## +....##.#........#..#...#....... +...#...###.##...........##..#.. +..##..##....#...#..#..........# +..#.........#.#...##..........# +.......##....#.#...##.....#..#. +.............#.....#.#.......#. +#.......#..##..##...##.#....... +..............#.....#.#..#...## +........##..#.....#...#...#.#.. +###.#.................#........ +...#........#...#.#######..#..# +...#.##...##.#.#..######...#... +#.......#..#....#..#.##.....#.. +#..#....##....#.##.......#....# +#...#..#.#.#...#..#.##..#...... +....#..##....#..#.#...........# +.##..#.#.............###....... +#....##......#..#..#.....###... +..#..........#...###.#......... +.####......#....#......#.#....# +..#....#.#.#......#....#....... +.....#.....#....#....#####....# +.##..........#...#.###....#.... +....##.....##......#...#.#..... +.#...#...#..#.#.#...#####...... +...#.##..####.##.##.......##... +............#.......#.......... +.#..##.#..#####........#..#...# +#......##..##..##.........##... +....#....#.............#.#....# +###..#.....#.....#.#...#..#.### +#...#.......##......#....#.#.#. +...#......#..#...#....#...###.# +....#....##.......#....#......# +............#......##.##.....#. +...#.........#......#....##..## +.....##....##...#..###...#..#.. +.......##.#..........#.##.##... +....##...........#.#..#..#.##.# +#...#..##.##.#....#....#.#..... +...##.#.....#..#..#..###....##. +#.##.#..#..#.#.............#... +..#.#.............###.....#.... +...#..#....#..#.....#.#..#..#.. +...#.....##.#...........#..##.# +.........#.#.##..#..#.#...#.... +...#..##..#...#...###.##.#..#.. +.#..##...##......##..##........ +......##....##.#.##.#.#........ +...#..................#.....#.. +.##................#.#..#..###. +.##.##.....#................#.. +.....#.#..........#...#..#.#..# +.............#......#..#.#..#.. +...#...##..#........#....#..... +#......#........##.##...##..... +##..#..##....#...#............# +..##..##.##....##..##........#. +...#....#.#.#.#....#.#...##.... +....#...##..##.#.##...#..#...#. +#..#....##.#.....#.......#...## +##.#....#.............#..#..... +.##..#..#.#.....#.......#.#..#. +.......#..#...##...#...###..#.. +..........#...#.#..##.....#...# +..#....#...........#####....#.. +#....#..#.......##............. +.........##..#####.......##.... +#..#..........#.....###...#..#. +.#.#.#..#...#.......##...#####. +.....#....#.###...#.......#.... +#.#.....##...###....###....#... +.#.....#..#.#.#........#...#... +.##.#.#.#......#....###....#... +.#..##..####......###......#... +......#.#.#.#.#...#...####.##.. +.#........##..#.....#....#....# +.....###......##..#....#....... +#.#.##...#.#......###.......... +........#.#...#..#......#....#. +..##...##.........#.......#.#.. +..#.##....#...##.....#.###..... +.........#..#.#....#....#.#.##. +#.........#......#..#.......#.. +...#...##.......#.........#.... +............#......#........... +##.....#.....#.#...#.....#..... +..#.#...#..#...#.#...........#. +#.#.#..#..#...##.#...#.#.....#. +.#..###.#..##.#.....#.....#.... +##....##....#.......##..##..... +.#..#...........###..........#. +.#..#..#..........###..#....... +#..###......#............##...# +#......#........#..#..#..#.#... +.......#.###...#.##............ +.##....#.......#.#...##.....#.# +....#..#.#.......#.#........... +##....#.###.#....#.#..##.#....# +..#..#..#....#...#........##... +...#...##....#..#.#...#..#..... +......#..#......#....#.......#. +#.#..............#...###...#..# +...#....#..#..........#.#...#.. +#.....##..##.....#........#.... +.#...##..#.#..............#.... +##.#....#..##...#..#.####.#..#. +.....#.......#.#.#.#..#.....### +...#.##....#.#........##....... +#...#.#...#.#..###..##.##...#.# +###..............#.#.###....... +...###..#.#..#....##...###.#... +......##...........#...#..#...# +.#..#.........##.......#..#...# +.#.......###......##...#...#... +.#......##...#........#.......# +.#..#.....#.........#.#........ +#...#.#.....#...#..##.........# +......##.#......##.#..##.#..... +...............#.#..#....#....# +#....#..#..#..#.#.....##...##.. +#.#......#.###......#..#...#### +.#.#..#...#...#.#..#.##.##.#.#. +.....#.#...###...#.#.....##.... +...#..#.#..........##.#....#.#. +...#..#.#.##.....###.##.#....#. +..........#..###......#..#.#... +###.....#..###..#...#..###.#... +..#..#.....##.#.#..###.......#. +....#....##........##.......... +.......#..........#...#......#. +.#........#.#.#.#.#.......#.... +.#..#.......##..##....#.#...#.. +.#.#.#.......#..#.............. +#.#....#.#...#.#.#.....#.#...## +.....#..........##..#.......#.. +.##......#.#....#.#.......#.... +..#.##....#.##.#...#........... +...##......##..##.............# +..........##.#.#..#..........#. +.##....#..#..#.#....##.#...#.#. +...........#....#.....#.#..#... +.#.....#....##..#.........#.... +.....#.....#...#....#...#.###.# +..#....#....#.....#...#......#. +.....##..#.............#...#... +........#..#.......#.#.......#. +#...###..#.##.#...###...##..##. +....##..#.......#...#.#........ +.#...#.#.##....####........#..# +.#...#.#.####.##.#............. +#..##...#....#...#.#.#.#.##..#. +.#.......#........#.....###.... +#.#.....#....#..#....#..#....#. +...#..#...#.....#.........##... +.#....#......###...#....#.#.#.. +#.#........#......#...#....##.. +.....#..#......#..#..#......#.. +.#.....#..#.##.#.#.#...#......# +##........#..#.#..#...#.####... +..........##....#.#..#.#....#.. +#.##..#..#....#..#....##..#.#.# +..#......#.......#...##..#..... +##...#.........#......#......#. +.#.....................#..#.##. +.#.......#........#.#.#..##.#.. +..#..........#........#..##.#.. +.#...#...#.........##.#.#.#.... +....#....#.###.#....###....#.## +....##......##........##.#.##.. +....#.#......#.##.#...#.##..... +....#....#..#.#..###.#.#....... +....#......#..#.#.......#..##.. +.....#..#.#.##.##..##.....#.#.. +...#....................##..... +#.....#...##...#.#............. +..#.#...#.#.#.....##..#....#... diff --git a/day-3/src/main.rs b/day-3/src/main.rs new file mode 100644 index 0000000..b5c2d85 --- /dev/null +++ b/day-3/src/main.rs @@ -0,0 +1,91 @@ +use std::fs; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("input")?; + let slope = parse_slope(&input)?; + + // Part 1 + let encounters = count_encounters(&slope, (1, 3)); + println!("{}", encounters); + + // Part 2 + let encounters: usize = [(1, 1), (1, 3), (1, 5), (1, 7), (2, 1)] + .iter() + .map(|angle| count_encounters(&slope, *angle)) + .product(); + println!("{}", encounters); + + Ok(()) +} + +fn parse_slope(input: &str) -> Result<Vec<Vec<usize>>, String> { + input + .lines() + .map(|line| { + line.chars() + .map(|c| match c { + '.' => Ok(0), + '#' => Ok(1), + other => Err(format!("Invalid slope; contains character: {}", other)), + }) + .collect() + }) + .collect() +} + +fn count_encounters(input: &Vec<Vec<usize>>, angle: (usize, usize)) -> usize { + input + .iter() + .enumerate() + .step_by(angle.0) + .map(|(i, row)| row[(i * angle.1 / angle.0) % row.len()]) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_simple() -> Result<(), Box<dyn std::error::Error>> { + let example = indoc!( + "..##....... + #...#...#.. + .#....#..#. + ..#.#...#.# + .#...##..#. + ..#.##..... + .#.#.#....# + .#........# + #.##...#... + #...##....# + .#..#...#.#" + ); + + let parsed = parse_slope(example)?; + assert_eq!(count_encounters(&parsed, (1, 3)), 7); + Ok(()) + } + + #[test] + fn test_simple2() -> Result<(), Box<dyn std::error::Error>> { + let example = indoc!( + "..##....... + #...#...#.. + .#....#..#. + ..#.#...#.# + .#...##..#. + ..#.##..... + .#.#.#....# + .#........# + #.##...#... + #...##....# + .#..#...#.#" + ); + + let parsed = parse_slope(example)?; + assert_eq!(count_encounters(&parsed, (2, 1)), 2); + Ok(()) + } +} From ab79670185461cc91747489b771f55c97108c99e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Sat, 5 Dec 2020 20:42:17 +0000 Subject: [PATCH 5/7] Complete day 5.1 --- day-5/.gitignore | 1 + day-5/Cargo.lock | 78 +++++ day-5/Cargo.toml | 10 + day-5/input | 815 ++++++++++++++++++++++++++++++++++++++++++++++ day-5/src/main.rs | 94 ++++++ 5 files changed, 998 insertions(+) create mode 100644 day-5/.gitignore create mode 100644 day-5/Cargo.lock create mode 100644 day-5/Cargo.toml create mode 100644 day-5/input create mode 100644 day-5/src/main.rs diff --git a/day-5/.gitignore b/day-5/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/day-5/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/day-5/Cargo.lock b/day-5/Cargo.lock new file mode 100644 index 0000000..80f8ea6 --- /dev/null +++ b/day-5/Cargo.lock @@ -0,0 +1,78 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-5" +version = "0.1.0" +dependencies = [ + "indoc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-5/Cargo.toml b/day-5/Cargo.toml new file mode 100644 index 0000000..f161c8d --- /dev/null +++ b/day-5/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day-5" +version = "0.1.0" +authors = ["Tristan Daniël Maat <tm@tlater.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indoc = "0.3" diff --git a/day-5/input b/day-5/input new file mode 100644 index 0000000..8699311 --- /dev/null +++ b/day-5/input @@ -0,0 +1,815 @@ +BFBBFFFLRR +FFBFBBBLLL +FBFBFBFLLL +BBFFFBFLLR +FBFFBBFLRR +BBFBFFFLLL +FFBBFFFRLL +BFBFBBBRRR +FBFFBFFRLR +FBBBBBBLLL +BBFBBBBLLL +BFFFBBBLLL +FFBFFFBRLR +BFFFFBFLLR +FFBBBFBLRL +BFFBFBBRRL +FBFBFBBRRR +FBFFFBBRRL +FBFBBBFRLR +BFFFFFBRRL +BBFFFBBLRR +FFBBBBBRRR +FFBBBBBLLL +BBFBFFBRLR +FBFFBFBRRR +FFFBBBBRLL +BBFBFFBLLR +BFBFFFBRLL +FFBFBFFLLR +FBFBBFBRLL +FBFFBBBLLL +FBFBBBFRLL +FBFBFBBRLL +BFFFFBBRLL +FFFBBFFLLR +FFBFFFBLRL +FFBFBBFLLL +BFBBFBBLLL +BFFFFBBRRL +FFBFFFBRLL +BFBBFFFRRR +FFBBFFFLRL +FFBFBFBRLL +BFBFBBBLLL +BBFBBFFLRL +BFFFFBBLLR +FFBFBBFRLR +FFBBFBBLLR +FBFFBBFLLL +BFBFBFBLLL +BFFBFBBLLR +FBBBBFFRLR +FBBBFBFRLL +FBBBBFFLRR +BFFBBBBLRL +FBFFBBFLRL +BBFFFBBLLR +FBFBFFFRLL +FBBBFBBRRL +FFBBBFBLLR +BFFBBBFLLR +BFFFFBFRLR +BBFFFFBLLR +FBBFFFBRRL +BFFFBFBRRR +FBFBFFFRRR +BBBFFFBLRL +BFBFBFBLLR +BFBBBBBLRL +FFBBFBBRRR +FBBFFFBRRR +FFBFBFBRRR +BBFFFFBRRL +BFBBBBBLLL +BFBFBFFRLL +BFBFBFBRRL +BFBFFFFLRL +FFBBBBBLLR +FBBFBFFRLL +FBBFFBBLLL +BFFFFFFLRL +FFFBBFFLRL +FFFBBFFRLL +FFBFFFBLLL +FBBFBFBLRL +BBFFFFBRLR +FBBFBBBRLR +FFBBFFBLLL +FFBFFFBRRR +FBFBFBFRRL +FFBBBFBRRL +BBFFBFFLRR +FBFFFFFRRR +FBBFFFBRLL +FFBBFBBRRL +FFBBFFFLLR +FBFBBFBLLL +BFFFBBFLRR +BFBFBFFLRR +BFFFFBFRRR +BBFBBFFRLL +BFBBBBBLRR +BFBBBBFLLL +BBFBBBBLLR +FFBBBFFRRR +BBFFBFBLRR +FFFBBBFRLR +BFBFFFBLRR +BFFFBBFLLL +FBBBBFFLRL +FBBFFFFRRL +FFBFFBBRRL +BFBBBBBRLR +FBBFFBBLRL +BBFBFBBRLL +FBFFBFBRLR +FBBBBFFLLR +FBBFBBFRRL +FBFBBBBRLL +BFFBFBFRLL +FFBFBBFRRL +FBFFFBFRRL +FBFFBBFRRL +FFBFBBFRLL +BBFBBBBLRL +BFFFBBBRRL +FFBFFFBLRR +FFBBFBBLRL +BFBFBBFRRR +BFFFFFFRRL +FBBBBBBRRR +FBFBBFBLRR +FBFFFFFRLR +BFFBBBFLRR +BFBBFFBLLL +FBFFFFBLRL +FFBBBBBLRL +FFFBBBFRLL +FFBBFBFRLL +FBFBBBFLRL +FFBBBFBRLL +BBFBBFBLRL +FFBFBFFRLR +BBFBBBBLRR +FFFBBBBRRR +FBBBFBFLLL +BFFFBFBRLR +FBBFBBFRRR +FBFFBBBRLR +FBFBBFBRLR +FBBBFBBLLL +BBFBFBFLLL +FFBBFBBRLL +FBBFBBBLRR +BFFFBBFRRL +BFBFFBFLRR +BBFBBBFLLL +BFFFBBFRLR +BFBBFBFLRL +FBBBBBFRRR +FBFFFBBRRR +BBFFFFBLRR +FBFBFBFLRL +BBFFBBBRLL +FFBBBFFLRR +FFBBBBFLRR +FBFBFBBRRL +BBFBFFBRRL +FBBBFFBLLL +BFBFFFFLLR +FFBFFBFLRR +BFBBFFFLLR +BBFBBFFLRR +BFFFFFFLLR +BBFFBFBRRL +FBBBFBBRLL +BFBBBFBLLR +BFBBFFBRLR +FBFBBBFRRR +BFBBBBBRRR +FFBBFBBRLR +FBBFBBFRLR +BFFBBFBRLR +FBFFFFFLLL +FBBFFBFRLL +FBBBBFFRRL +FBFBBBBLRL +FFFBBFBLRR +FFBFFBBLRR +FFBBBBBLRR +FBBFFBFRRR +FBBBFBFRRR +FBBFBBBLLR +BFFFFBFLLL +FFBFFFFRRL +BFBFFBBLRL +FFBFFFFRLR +FBFBFBFRLL +BBFBFBBRRL +FFBFBBFLLR +BFBBFFBLLR +FBFFBFFLLL +BFFBBFBRRR +FBFFFBBRLL +BBFBBFFRRR +FBFBBFBLRL +FBFBFBBLRL +FBFFBBFRRR +FBFFBBBLRL +FFBFBBBRRR +BFBBBFFLLR +FFBBFFFRRL +FFBBBBBRRL +FFBFFBBRLL +FFBBFBFLLR +FBBBFBFLLR +BFFFBFFRLL +FFBBBFBLRR +BFFBBBFRRR +BFBBFBBRRR +BBFBFFFRRR +FBBFFFBLRL +BBFBBBFLLR +BBFFFBBLRL +FBBFFFFLRR +BFFBFFFRRL +FFBFBBBRLL +BBFBBFBRLL +FBFFFBBLRR +BFBFBBFRLL +FBFBBBBRRL +FFFBBBFLLR +FBFFFFBRRR +FBBBBBBRLR +BBFBFBFRRR +BFBFFBFRLL +BFBBBFFLLL +BFBBBFBLLL +FBFFBFBLRL +FFBFFFFLLR +FBBBBBFLLL +BBFFBFBLLR +BBFBBBFLRR +BFFFFFFRRR +BFFBFFBRRR +BFFBBFFLLL +FFFBBBFLLL +BFFBBFFRRR +BBFBBBBRRL +FBFBBFFLRR +BFBFFBBLLR +BFBFFBBRRL +BFBBFFFLLL +BFBFFBBRRR +BFBBFBFRRL +FBFBFFFLLR +BFBFBFFLLR +BFBBBBFRRL +BFFFBFFLRR +FBBFBBBRRL +BBFFFBBRLL +FFBFBBBLRR +FFBBFFBRLL +FBBBFBFRRL +FFBFFFFLRL +BFFFBBBRLL +BFBBBFFRRR +FFBFFBBRRR +BFBFFFBLLR +FBFFFBFLLR +FBFBBFFRRL +FFBFFBBLLL +BBFBBBFLRL +BFBFBBFRRL +BFFFBFFLLL +FBBBFFFRLL +BBBFFFFLLR +BFFBFFBLRL +BBFFBBBLLL +BFFBFFBLLR +BBFFBBBLRL +FBBFFBBLLR +FFBFBBFRRR +FBFBBFBRRR +BFBFFBFRLR +BFBBBFBRLL +FFBBBBFLRL +BFFBFBFLLR +BFBBFFFRLL +BBFBFBBLRR +FBBFBFFLLL +FBBFFFFLRL +FBBBBFBRRL +FFBBBFFRLL +FBBFBFFRRL +FBBBFBFRLR +FBBBFFBLRR +BBFFBBBLRR +FBBFFBFLLL +FBFBBFFRLL +FFBFBFFRLL +BFBFBBBRRL +FBFBBBFRRL +FFBFBBBLLR +BFFBFFFRLR +FFBFBFFRRL +BBFFFFFLRL +FBFFBFFLRL +BBFFFBFLLL +BFFBBFBLRR +BFBBFBFLLR +FBFBFBFLRR +BBFFBBFRLL +BBFBFBFRLL +BBFFFBFRLR +BFFBFBFRRL +BFFBFBBLRL +FFFBBBFLRL +FBBBFFFRRL +FFBFBBFLRR +FBBFBFBRLR +FFFBBFFRRR +FBBBBBBLRL +BBFFBBFRRR +FFBFFBFLLL +BFFFBBFLRL +FBFBBBFLRR +BBFFBFBLLL +FBFFBBFRLR +BFFBFBBLLL +BFBBFFBLRR +FFBBBFFLLR +FBFBFFFRRL +BFBBFBBRLL +BBFBBFBLRR +FBBFFFFLLR +BFFFBBFRRR +BBFFFBFRRR +BBFBBFFLLL +BBFFBFBRLL +BBBFFFFRLR +BFFFFBFRLL +FFBBBFFRRL +BFFBBBFLRL +BBFBBBFRLL +FBFFFFBRLL +BFBFFBFLRL +FFBFFBBLRL +FBBBBBBLRR +BBFFFBFRLL +BFBFFBBRLR +BBFBFFBLLL +BFFFBFFRRR +FFBFFBFLRL +FBBFBFFLRR +BBFBFFBRRR +BBFBFFBLRL +FBBBBFBLRR +BBFFBBBRRR +BBFFBFFLLR +FBBBFFBRLL +BFBFFBBLLL +FBBFBBBLLL +FFBBFBBLRR +FBBBBFFLLL +BFBFBBFLRL +BFBBBFBRRL +BFBBBBFRLL +FFBBFFFRLR +BBFBBBFRLR +BFBBFBBRLR +FFFBBBBLLL +BFFFFFBLRL +FBFBFFBRLL +FBBFBBBRLL +FBBFBBFRLL +BFBFBBFLLR +FFBBFBFLRL +FBBBFFBRRL +FFBFFBFRRR +BBFFFFBRLL +FBBFFBFRRL +BBFFFFFRLR +FBFBFFBLRR +BFFBBFBRLL +BBFFFFFLRR +BBFFBBBRRL +BBFFBFFRLR +FFBBFFBLLR +FBBFFFBLRR +BFFBBBBRLL +FBFBFBBLRR +FBBFBFBRLL +FBBBFFFRRR +FBBFFBBRLL +FFBFFFFRLL +FFBBBFBLLL +FBFFBBBLRR +FFBBFFBRRR +FFFBBFBRRR +FBFBFFBRRR +FFBFFBFRLR +BFFFFFFLLL +FFBFFBFRRL +BFBFBFFLLL +BFFBBBBRRR +BFFBBFBRRL +BBFFBBBRLR +BBFFBFFRRR +BBFBFBFRLR +FFBBFBFLRR +FBFFBFBLRR +BBFBBBBRLL +BBFFFFFLLL +FBFFBFFLRR +BBBFFFBRRL +BFFBFFBRRL +BFBBBFBRRR +FFFBBFBRLL +BFFBBFBLLR +BFBBBBFRLR +BFFFFBFLRL +FBBFBFBRRR +BFFBFBBLRR +BBFBBFBLLL +FBFBFFBRLR +FFBBBBFRLL +BFBFFBBRLL +BBFBBBBRLR +FFFBBBBLRL +FFFBBFBLLR +BFBBFBFLRR +FFFBBFBLRL +FBBBBBFLLR +FBFFBFBRLL +BFBFBBBRLL +BFBBBBFRRR +FBBFBFBRRL +BBFFBBFRLR +FFFBBBBRLR +BFBFBBBLRR +FBBBBFBRLR +BBFBFBBLRL +FFBBBFFRLR +BFBBBFFLRR +FBFBBBBLRR +FBBFFFBRLR +BFFFFFBLRR +BFFBBBBRLR +FBBBFFFRLR +BBBFFFFLRR +BFBFBFBRRR +FFBFFBFRLL +BBFBFBFLRR +BFBBFBBLLR +FFBBBBBRLL +FFFBBBBLRR +FBBFBBFLRL +BFFFBFBLLL +BFBFFFFRLL +FBFFFBFLRL +BBFFFFFRRR +FBBFBBFLLL +FBBFBFFRLR +FFFBBFFLRR +BFBBFFFRRL +FBFFFBBRLR +BBFBFFFRLL +FBBFFBBRRL +BBBFFFFRLL +BFBBBBBRLL +FFFBBFFRRL +FBBFFFBLLR +BFFFBFFLLR +FFBFFBFLLR +FBBFFBBRRR +BFFFFFBRLL +BFFFBFFRRL +BBFBBBFRRR +BFFBFBFLRR +FBFBBFFRLR +BBFFFBFLRR +BBFBFBFLLR +BFFBBBFLLL +FBFBFBBLLR +FBBBBBBRLL +FBFBFFFLRL +FFBBFFBRLR +BBFBBFBRRL +BBFBBFBRLR +BFFBBFFLRR +BFFBFFFLRR +BFBFBFFRRL +BBFBBBBRRR +FBFFFFFLLR +BBFFBBFLLR +BFFFBBBRLR +FBBBBFFRLL +BBFBBFFRRL +BBFFBFFRLL +BFBFBFBLRL +BFBFFFBLLL +BBFBFFFRLR +FBBBFFFLRL +FFFBBBBLLR +FFBFFFFLRR +BBFBFBFRRL +FBFFBBBRLL +FBBBFBBLRL +BBBFFFFLLL +FFBFBBBRRL +FBFBFFBLLR +FBFFFFFLRL +BFBFBBBLRL +BFFBBFFRLR +BFBFFBBLRR +BFFBFBBRLR +FBBFBFBLRR +FFBBBFFLRL +BBFFBBFLRR +FBBBFBBRRR +BFFFBBBLLR +BFBFBBBRLR +BFFBFBFLLL +BBBFFFBRRR +BBBFFFBRLR +FBFBBFFLLL +BFFBBFFLLR +FFBBFFBLRR +FBBBBBFRLR +BFBBFFBRRL +FBBBFFFLRR +FBFFFFFRLL +FFBFFFBLLR +BFFBFFFRLL +BFBFBFBRLL +BFFFFBBLRR +FBBFFBBLRR +BFBBBFBLRL +BBFBFBBLLR +BFBBBFBLRR +FBFFFBFLLL +BFBBBBBLLR +BFBFFFBRLR +BFBFBBFLLL +BBBFFFFRRR +FBBFFBBRLR +BBBFFFFLRL +FBBFBBBRRR +FFBBFBFRRL +BFFFBBBRRR +FFBFBFFRRR +BBFBFFFLRR +FFBFBBBLRL +BFBFBFFRLR +FFBBFFFRRR +FBFFBFBLLL +FBFFBFBLLR +BBFBBFFLLR +BFBBBFFRLR +BFFFFBBLLL +BFFBFFBRLL +FBBFFFFRLL +FFBFBFBLRR +FBBBBFBLLL +BFBFBFBRLR +FBBFBBBLRL +BFBFFBFRRL +FBBFBFBLLL +BFFFBFBLRL +BBFFBFFLLL +BBFFFBFLRL +FFFBBBFRRL +FBBFFFBLLL +BFFFFFBLLR +FBBBBFBRLL +BFFFFBBRRR +BFFFFBBLRL +FBBFFBFRLR +BBFFFFBRRR +FBFFFFBLLL +FFBFBFBRLR +BFFFBBBLRL +BFFFFFFRLL +BFBFFBFLLR +BBFFFBBRLR +FBBBBFBLRL +FBBBBFBRRR +BFFBFFFLLL +BFFBBBFRLL +BFBFBBFRLR +BBFFBFBRLR +FBBBBBFLRR +BFBBFBFRLR +FFBBFBFRLR +BFFFFFBRRR +BFFBBFFLRL +FBFFBFFRRL +BFBBFFFLRL +FBFFFBBLRL +BFFFBFFRLR +BFFFBFBRRL +FBBBBBFLRL +BBFFBBFLLL +FFBBFBBLLL +FFBFBFFLLL +BBBFFFBLLL +BFBFBBBLLR +FBBFFBFLRL +FBBBBFFRRR +BFBBBBFLLR +FFBFFFFRRR +BBFFBBFLRL +FBFBFBBRLR +BFBBFFBLRL +FBFBFFBLLL +BBFFBFFLRL +FBFBFFFLRR +FFBFBFBLRL +BFFBFBBRRR +FFBFBBBRLR +BFBBFFFRLR +BFBFFFFRLR +FFFBBFFLLL +BFBFFFFLLL +FFBFFBBRLR +FFBFBFFLRR +BFFBBFFRLL +BBFFBBBLLR +BFBBBBBRRL +FBFBBBBRRR +FBBFFFFRRR +FFBBBFBRLR +FFBFBFBLLL +BFFBFFFLLR +FBFBFBFRRR +BFFBBBBLLL +BFFFFBBRLR +FBFBBFFLRL +FFBFBFFLRL +FBBBFFBLLR +FBBFBFFLRL +FFBFBBFLRL +BBBFFFFRRL +FFBBFBFLLL +FFBBBBFRRL +BBFFFFBLLL +FFBBFBFRRR +FBFFFFFLRR +BFFBBBBRRL +BFBBFBBRRL +BBFBFBBRLR +FFBFFFFLLL +FBBFBFBLLR +FBFBFFBLRL +BBFBFBBRRR +BFFBBFBLRL +FFBBBFFLLL +FBBBFFFLLL +BFFFBFBLLR +FFBBFFFLLL +BFFBFFBLRR +FFBBFFFLRR +BFFBFBBRLL +FFBFBFBLLR +FBBBBBBLLR +FBFFFFBRLR +BFBBBFFRLL +FFBBBBFRLR +FFBFFBBLLR +BBFFFFFLLR +FBFFFBFRLR +BFBFFFFRRL +FBFFFBBLLL +BBFFFBBLLL +BFFBFBFLRL +BBFFFBFRRL +FBFFBBBRRR +FBFFFBBLLR +FFFBBFBRRL +BBFBFFFLRL +BFBFFFBRRL +BFBBBFBRLR +BFFFBBBLRR +FBBFBFFLLR +FBFBBBBRLR +BBFBBBFRRL +FFFBBFBRLR +BFFBFFFLRL +FBBBBBBRRL +BFFBFFBLLL +BFFBBFFRRL +FBBFBBFLLR +BFFBBBBLLR +BFBBBFFLRL +BFBFFBFRRR +BBFFFBBRRL +BFBFBFFLRL +BFBBFFBRLL +BFFFFFFLRR +FFFBBBFLRR +FBBFFFFLLL +FFBBFFBRRL +BFBFFBFLLL +FBFBBBFLLR +FFBBBBBRLR +BBFBFFBRLL +FBFBBFBRRL +FBBFFBFLRR +BFFFFFBRLR +FBFBBFBLLR +FBBBFFFLLR +BFFFFBFRRL +FBFFFFFRRL +FBFBFFFRLR +FBFBBBFLLL +BBFBFFBLRR +BFBBBFFRRL +BFBBFBFRRR +BBFFFFFRLL +FBFBFBFRLR +FBBBBBFRLL +BBFFBFBLRL +BBFFBBFRRL +BFBFFFFLRR +FBFFBBBRRL +FFFBBFFRLR +BBFFBFFRRL +BBFBBFBLLR +FBBFFBFLLR +FBFFFFBLLR +FFBFBFBRRL +FBFFFFBLRR +BFFBFFFRRR +FFFBBBFRRR +BFBFBFBLRR +FBFBBBBLLR +BBFFFFBLRL +BFBBFBFLLL +FBBBFFBLRL +BBFBFFFRRL +BBBFFFBRLL +FBBFBBFLRR +FBFBFFFLLL +FBBFFFFRLR +BFFBBBFRRL +BBFFFBBRRR +FBBBFFBRLR +FFBFFFBRRL +BFFFFFBLLL +FBFFFBFRLL +BBFFBFBRRR +BFFFFBFLRR +FFBBBBFLLR +BFBFBBFLRR +FBFBFBBLLL +BFFFBFBLRR +BBFBBFBRRR +BFBBFBBLRL +BBFBFBBLLL +FBBBFBFLRL +BFFFBBFRLL +FBBBBBFRRL +BFFBFFBRLR +BFFBBBBLRR +FFFBBFBLLL +BFBBBBFLRL +FBBBFBFLRR +FBFFFBFLRR +BFBFFFBRRR +FBFFBFFLLR +BFBFBFFRRR +BFFBFBFRLR +FBFFFFBRRL +BFFFBFBRLL +FBBBFBBLRR +BFBBFFBRRR +BFBFFFFRRR +BFFBFBFRRR +FFBBFFBLRL +BFBBBBFLRR +FBFFBBBLLR +FBFBBFFLLR +FBFFFBFRRR +FBFBBBBLLL +BFBBFBBLRR +BFBFFFBLRL +BFFBBFBLLL +FBFFBBFLLR +BBFBFFFLLR +BBFFFFFRRL +FBFBBFFRRR +BFFFBFFLRL +FBFBFBFLLR +BFFFFFFRLR +FFBBBBFRRR +BBFBFBFLRL +FBBBFFBRRR +FBFFBFFRRR +FBBBBFBLLR +BBBFFFBLLR +FBFFBFBRRL +FBBBFBBRLR +FBFFBBFRLL +BBBFFFBLRR +BFFFBBFLLR +FBFFBFFRLL +FFBBBBFLLL +FFBBBFBRRR +BBFBBFFRLR +FBBBFBBLLR +FBBFBFFRRR +BFBBFBFRLL +FFFBBBBRRL +FBFBFFBRRL diff --git a/day-5/src/main.rs b/day-5/src/main.rs new file mode 100644 index 0000000..62208ce --- /dev/null +++ b/day-5/src/main.rs @@ -0,0 +1,94 @@ +use std::fs; + +type SeatCode = [char; 10]; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("input")?; + + // Part 1 + let max_id: Result<usize, String> = input + .lines() + .map(|code| { + let (row, col) = find_seat(parse_seatcode(code)?); + Ok(row * 8 + col) + }) + .max() + .ok_or("No seat codes set")?; + + println!("{}", max_id?); + + Ok(()) +} + +fn parse_seatcode(input: &str) -> Result<SeatCode, String> { + let mut output = ['0'; 10]; + + for (i, c) in input.chars().enumerate() { + if i > 10 { + Err(format!("Seat code too long: '{}'", input))?; + } + + if !['F', 'B', 'L', 'R'].iter().any(|valid| &c != valid) { + Err(format!("Invalid character in seat code: '{}'", input))?; + } + + output[i] = c; + } + + Ok(output) +} + +fn find_seat(code: SeatCode) -> (usize, usize) { + let midpoint = |(start, end): (usize, usize)| (start + end) / 2; + let binary_follow = |range: (usize, usize), direction: &char| match direction { + 'F' | 'L' => (range.0, midpoint(range)), + 'B' | 'R' => (midpoint(range) + 1, range.1), + _ => unreachable!("We already checked all characters are valid"), + }; + + let row = code[..7].iter().fold((0, 127), binary_follow).0; + let col = code[7..].iter().fold((0, 7), binary_follow).0; + + (row, col) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_simple() -> Result<(), Box<dyn std::error::Error>> { + let input = "FBFBBFFRLR"; + let seat = find_seat(parse_seatcode(input)?); + + assert_eq!(seat, (44, 5)); + Ok(()) + } + + #[test] + fn test_simple2() -> Result<(), Box<dyn std::error::Error>> { + let input = "BFFFBBFRRR"; + let seat = find_seat(parse_seatcode(input)?); + + assert_eq!(seat, (70, 7)); + Ok(()) + } + + #[test] + fn test_simple3() -> Result<(), Box<dyn std::error::Error>> { + let input = "FFFBBBFRRR"; + let seat = find_seat(parse_seatcode(input)?); + + assert_eq!(seat, (14, 7)); + Ok(()) + } + + #[test] + fn test_simple4() -> Result<(), Box<dyn std::error::Error>> { + let input = "BBFFBBFRLL"; + let seat = find_seat(parse_seatcode(input)?); + + assert_eq!(seat, (102, 4)); + Ok(()) + } +} From 361285e23de7cb623ee225c7a6c07c835c17a4af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Sat, 5 Dec 2020 21:11:41 +0000 Subject: [PATCH 6/7] Complete day 5.2 --- day-5/src/main.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/day-5/src/main.rs b/day-5/src/main.rs index 62208ce..81f9d27 100644 --- a/day-5/src/main.rs +++ b/day-5/src/main.rs @@ -17,6 +17,26 @@ fn main() -> Result<(), Box<dyn std::error::Error>> { println!("{}", max_id?); + // Part 2 + let mut ids = input + .lines() + .map(|code| { + let (row, col) = find_seat(parse_seatcode(code)?); + Ok(row * 8 + col) + }) + .collect::<Result<Vec<usize>, String>>()?; + ids.sort(); + + let mut previous = ids[0]; + for id in &ids[1..] { + if id - 1 != previous { + println!("{}", id); + break; + } else { + previous = *id; + } + } + Ok(()) } From cc2bc308c3774b0f15f86d524fd92342f6827e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= <tm@tlater.net> Date: Sun, 6 Dec 2020 21:00:40 +0000 Subject: [PATCH 7/7] Complete day 6 --- day-6/.gitignore | 1 + day-6/Cargo.lock | 78 ++ day-6/Cargo.toml | 10 + day-6/input | 2087 +++++++++++++++++++++++++++++++++++++++++++++ day-6/src/main.rs | 137 +++ 5 files changed, 2313 insertions(+) create mode 100644 day-6/.gitignore create mode 100644 day-6/Cargo.lock create mode 100644 day-6/Cargo.toml create mode 100644 day-6/input create mode 100644 day-6/src/main.rs diff --git a/day-6/.gitignore b/day-6/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/day-6/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/day-6/Cargo.lock b/day-6/Cargo.lock new file mode 100644 index 0000000..e508f5f --- /dev/null +++ b/day-6/Cargo.lock @@ -0,0 +1,78 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-6" +version = "0.1.0" +dependencies = [ + "indoc", +] + +[[package]] +name = "indoc" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" +dependencies = [ + "indoc-impl", + "proc-macro-hack", +] + +[[package]] +name = "indoc-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", + "unindent", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" diff --git a/day-6/Cargo.toml b/day-6/Cargo.toml new file mode 100644 index 0000000..a253da5 --- /dev/null +++ b/day-6/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "day-6" +version = "0.1.0" +authors = ["Tristan Daniël Maat <tm@tlater.net>"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +indoc = "0.3" diff --git a/day-6/input b/day-6/input new file mode 100644 index 0000000..9745c0b --- /dev/null +++ b/day-6/input @@ -0,0 +1,2087 @@ +v +vx +v +vx +nclmbv + +odgpnwqxhbits +pqwsnxihogdbt +pogiwxdhqbsnt + +q +o + +apulnqresohvktxcymzibdwg +sigdvakmlyxhetopnubwzrqc +iushndtclbeyowxpqmkgzavr + +ow +wo + +phegq +eqgph +hgpque + +xispjzq +sqkzcupi +ikspqyzue + +hgfesyvn +dnsvtkhglea +heygnqbcvs + +qmrpy +pmrck +vcprum +mrkcp +mrp + +kgjx +jghk +kjgu +enlgdwzqkjr +vjgk + +ungsdozkphlxy +nbkgzaifsovjpdt +geoskuyznpcd + +qw +qw + +x +r +sl +v +s + +kxcn +kxn +wxtkn +xkcn +xkn + +peionmzqyda +apdinomqzey +npmqoiedzay +dmpzoyqiane + +gpaedw +mwda +daw +awbd + +fyxeptlrmisjhdzquv +xfqydzruvmjepsilth +sipulvdzmftqeyhrxj + +kzofrcamenxyvwgpq +zqkrapxwomvycgnef +ywxvpazgcenrqkfmo +kgcvezmfqwrpnxaoy + +zhf +zegfhd +fhz +hfz + +iqspn +bytmd +sq +gwx + +begosk +gnbskz +sgkb + +ok +ek +ek +k + +hbucsatqvdryfojxlz +tufzxjvbrwasemg + +d +ef +k + +p +mrp + +kuywroetvjnf +wjvtkreufyn +frkyjwevntu +frtewnkjvuy + +iu +wzi +axbcgpldyi +seoiz + +ekjmbsuwglftpvya +esmwuftgpvyjalkb +vflbtyekmjupasgw +tepmwgksulybavjf +psawvbtgjfelmyuk + +jsmoydnvkiql +lqdojsvnik + +ayrtxivjlpeuzohnk +whjitnkfyealoguxprzc +bzjiruohtlakxnedypm +pmyxeizqjhkntoarul + +vnrcwouidfb +bufrwnociv +unrvefbcwo +cvnswubfro + +hmnoazwvtcrigqsujldpk +qeflzdwyongvtjishpacumr + +ytwpgkvceaolhrz +agyepkhwlzvctr +yvpkwcgerzhtaq +pcaeygktzwhrv +rgvpkwtylzhcea + +io +oi +io +ito + +ckmfawyb +glvfiymobadc +jnsfbmapcy +jfysmathnbc + +uxbfdygqwpom +sxmuwbdporyvqh +rbuqmwxydpo +ncpuyowqildjxebmk +wxuysoqhvbampd + +keo +oz +jdorxbia +lo +ok + +zk +zco + +bhwmscnrqeou +rlqenzswohbmu + +synmfzljkdebq +cmdyzlfekjbns +nkgzsmvlydpjobfute +lsfjkmnzdeby + +xshlzwcndtjefi +wcnljfditsexzh +ehtsjwidflcznx + +zry +vyqz + +owfcybsdipnqlthavu +psdiqfhwctrzvaybon +ybmpdciqhvtsfawon +givjcetkhwbdyponfsaq +cvotsnhqfywplidab + +cibwptjnu +ncruhi +hnuic + +apzjqbdlwyicfgxv +apxodvwlzyfbgqcij +pcdxjvzwqfliyagb +rixjaclsdpvyzgwqmbfe + +timpsox +poxsm + +fres +refs +fersq + +w +z +r +w +r + +xz +x +x +x + +ciyhkpjswqvxz +xyskvphmowjzcia +kywsxihpc +wtpnflcsekhbgxud + +qrtweigjlbucfxnkos +iwlbgmnosuxfetkrqc +sfbwxcotierqukldn +euroqfdxywclsitkbn +qelfbarchnwuxtsiok + +gj +woh +g +jr + +lpcdqf +qdfupwzcl +dpcqgtl + +zlnkeyroq +rtyoleqnkz +leykztqnor +ahoukcelrxjqynpz + +twxjdbuhclzgnop +fgeqkcbvziwtludop + +ylukhwtcf +aikdrxfov + +ucbklojiyxmz +ulkjco +kroljuch + +rfhyj +fhy + +cmtedvxioy +infmacweshtuo +tpoimecz + +kylduhw +yublkhd +kdulyh +dyuhlrk +zhfgkudly + +laoemdcgpyhtnb +ygclebodtmpnha +zomgnqpalhebxwtcd + +bmogrnztvyil +vlotrzngbmiy +lvyogrzbimtn + +zjcgheblotdramsn +mlgbshrzotcnjawd +otgsjdnmbrchlza +dbazlpfkhgtmsvocnjqr +sgrazcjondmlhbt + +ryhifaxpemsgcdubvtjzwnol +bduiojqhcsvlyrxefntpgwma +pvebfwitculrgyjshkdxmaon + +lqmopgwbesjhk +mgbkhqejlswop +wqklaeogsdxhfbmjp +sjgphokmqewlb +kesrghbmpjlowq + +tu +rp +r +rgh + +tfeyhjbnpaqwz +rxuefvgiaybzqth + +pwx +lk +iahyv +jr +p + +ezsghqtdnjbfox +dsucq +sduqp +cusvdqy +dslwqm + +dm +gf +g +xtg + +mfihn +mhyifot + +iabeswqrzlcxvkpmtnug +qexctgrkwbpusazinmv +riztmgqsewunxbapkcvj +avbuxqizmrkeswtpncg + +ozrwipdmgajlkfuxcnhtyveqs +fntcigalzdxmyuesjkqwo +dtfyeqklgjmwxunosizca +efclkowaujqzigbtymdxsn + +jkiupmatwxqhdrs +midjhwutq +dmhujzqwyit +dwuqhymtji + +ziqfh +hnboqe +qhktzdfp + +qohbywgtlucajf +ltahuywfjbmc + +arfpqdcbtnw +kfzonycewxbghvr + +tdxqelwnu +luenxdtqw +udlteqxnw +wxendqlut + +pvkrgaushqidfmnjz +eajzrkhndfitsqvmwugyp +sgohxqcvrzunapjfdmki +vinodpkazgfrmcushjq +jmufirnszpdqoahgkv + +uvcmgfrk +fugmrvck +kfuvrmcg +cmrfgkuv +kcvumfgr + +kmrb +krbm +rkb +bekrt +rbmk + +mzbrfsnxgjpywavcohuqlkitde +xpekistdzlrgmcawnvuqfohjby + +vrjew +rvj + +qlefnd +fdleo +pxcehwdfy + +amftbpvo + +ljcyn +cynosjum +jync +yrqbwjzc +jcy + +tmdcuk +ckudm +mucdk +cdkum + +icsvhmefaztoxkgndq +sbyqivkrdplwjemou + +jtrhafpkbwzdox +hbrwpzajokfx +jbkfaphxzcrwon + +bqg +qgb +bgq +qbg +qgb + +ljte +jle + +tvhjx +hvjwxrt +vtjxh +dtjvhx +vjxht + +zsdejcrvab +kbjzrscaedv + +oehivmku +igfhuxozy + +x +xs +x +x +x + +klqnrzftv +iqgfaupt +fdqgswyjt + +opjeslcx +psohecjxl +yxelsjoc +lescojvx +molnextcsj + +sf +cps +fos + +crxbjzkivydsgfpehmq +wnhfgljeptzrmikcy + +bghydvqxicsfunlzpart +rsyugqcxtvdzanpblihf + +v +gnvw +lv +v +lv + +mpzvdjqhxnuocr +chidrnuvxmkjqpt +suhdxgvbcnrpmj + +ewpfugobznrqydsj +ivgxtjludcm + +enytuvzoqmljfwd +satbgwcrndzyk + +fuzl +ful +lu +lpuxy + +qrhltkesazpmo +puaedmzsqhot + +vcktz +zqtjsbuiaomwf +ygzkthx + +zt +tdz + +fvpjlcarqdukio +luotiqzkjfrwahcdvm +rcykufoadqxilvj + +kfpuwxi +wpfxuik + +xjzpf +cyqsouwf +xzf +zf +bifpj + +q +cw +n +nu +q + +lscdtzvhajkqpm +vdpklhqscm +pvcdqskljh +hcjdqklsyvp +eqshcdklvp + +muyldxobakfq +ecjvfm + +jkas +ws +s +ws + +qbjzcolnuy +jyulobzncq +izqlnycoubj + +yvsoztedn +eotvydz +yzetodv +edvoyczt + +tcfqkxrib +fozbtnlwucq +qvagfdebtc +qcpftbk + +amlcyk +acempy +aymcv +cayml + +gsybwf +ybsfgw +bsgywf +bfwygs +fsygbw + +hypxicwobt +pciytbxwh +xhycspitbw +pcibytrhxw +yckhxtebwpi + +olneqtcpzfiahbj +oitbqejcahpnfmzl +bpnjyhfkqmlczteoai +hlpjefoaqznbtci +jdwtzsfcviaqnobhpxel + +mkflqourwyh +kqmylohfu +lyohqumfk +fyhukomplq + +cfegzaprw +prvbgiymj + +besuka +hsnkua +slaguxky + +smwuovdpnjfyl +mcjvguors +qjvsmiou +abotmkxujvs +uhmoqsvje + +udrmcxqay +dqyhumca +mfwcujskglbedqt + +xewpyrsjzktgbaochuni +xjaohuwligysztekpnc +tfghodxyjsnapmquwcziekv + +fxypwlo +wpsxleyfo +ylmpxfzwo + +ok +rspbkt +mauyxcw +rqdkz + +fsehripoyjawt +styheviwfrn + +onxrvplyuzqcj +vlzuyrcpxoqjn +nuoqyrzjcpvxl +ljyuoqvnzprcx + +o +ac +c +c + +hwxmesjuzo +hylvoxzpfbntsr +shoquzx + +pidfxg +igrxm + +gshkfbcujpyztoevxdlmaw +kzvmejbygdpaxufhlcotws +hfgamkstbwjoyxlczupevd + +p +p +ltf + +iufdzosnagkhtw +dzkhlgvsitucoa +adtgzokhsviuc + +jywe +wy +yw +wzy +yw + +ghvadykiscnfxo +noxckgivyhdaf +gfxmtodbwvnkhipaqy + +ifsp +xnivluaq +fioe +wisydc +siw + +jxbmclnevwztqug +keptqcrmzufglhi +tleqgyvjbumzdc +xzdmslqcutge + +ogdxpnjbti +ipgnotx +ipehgonkcxrtfa +ntdiygpox + +wxhcjtredknifvulymp +vgksmwqzctybidjofha + +lxmficysbt +jslmrn + +pcoxigrdtkul +sjmhtbxulyord +uxlcpdktoarv + +crgundohktjfasebzvxl +gdsvcufrnljazotkxehb +onbgcjfeirxkhzvudtsla +njcheafbokgzvsxrudlt +ekgvfruchstjldoxzabn + +wmkivpgfqdrsl +wmcjvofkhnz +kfwbuvam +jtmwhfkvz + +thy +hy +yhe +yh +dqbyh + +xtbhkovsjcga +xqkoeavjsch +xacvkjhds +mcjuwskavnrixyh + +lhfwqr +ypkruwqs +xcgdwmj + +eyiwrundqsflgcavxk +fejmwtyulodkhrzbp + +yvz +expa + +aohj +ejoai +ldypfnejoa +dcxpjoatv + +vuinj +prv +v +vlr + +sqpdmrnlwa +nlgasrpqomd +padlqsmrn + +r +pjd +d +azbhs + +hfotieypnlwdkjzv +jlfveimtdckongwzpy + +af +zaf +afn +abf + +csjx +scrk +ucws +csj +sjc + +juwtder +dtjrwe +werjdt +djreywut +rceoqjwdt + +nazufjeomxpkc +xmeopajcunkzf +pfcuazejknmxo +nkzceomfapxju + +epiykxforjz +fylzbxjeoipg +ahfyxvpmsujiedzon +eoyxcqwpikjzfg + +umfrlqhakzdn +mshjfdkqungrzv + +opxjdgemsvailruzfbcq +ozmgbdirxelyfsqpjvuc +iqbucpflxsvzdoetjrm +ysiqolmberzvjnctdxgufp +bxfemdhcukplzrijsqvo + +yocg +g +uqg +rzy +vjbmw + +vljzumo +ujzvmo +vujomz +vjzomu +zmjuov + +srwagukx +ahjroqmxy + +cgkj +jcgknvs +jgkyc +kcjgy +jrgck + +ugcwvx +gfuzaxw + +n +o +n +n +n + +vsmd +mcdvbs +cdmxy +tadr + +znsokugwejfylica +iwpnfyolqzkcuaegdsj + +azuver +remzau +arezu +zerau + +wevbmlq +bwalcodevx +ewtuxlbv +zivypeswlb +ebwvaln + +qjrdgxmc +hrcozqdxj + +mpcogjzyrhisuxlv +mskpazxdfvqc + +xtzyl +lxyt +xytl +xlyt +oxslyt + +jrteqswkcazlbfhog +tsqafcbgrelzokhjw + +fjqlibpwukcoznavyrtd +bzdtupklrqivanwyojfc +lvjarpkyubndzqiwoftc +bdrcniwvktylpajoqzuf +uycprvalqdiwonbjztkf + +lwga +dgswz +zgwy +nwugcrik +gwsy + +gwmvxakicou +avugcmowixk +ckxugomwvia +ukwacxogmiv +xiwavcgmkou + +znvgeymhb +rztconyiq +lwzayn +jswnuzyk +fnwuxlypz + +etkdwlgscmzyuafvhbo +vhctfgkmwouaylesbzd +vfcetldzsyobghmuwka +tsgzmkufeajlvwcyodbh +gazdhmkotswlfuvbcey + +zdsjweg +sezjgd +dsgzei + +zi +z + +tbg +fbtg + +g +g +g +g + +rid +jvi +inxo +id + +dbrjtfupcyvzlqmwei +zqbwfmljvcdirtyepu + +jmhubvclsdprw +cpswbmldjrveu +rpbsvucmdfjlw + +qk +ekniz + +kvlmhegzcryd +zrlmdgvefyhc +zhgvrqueymdca +remdfyhzcgv + +zxhiaqs +hxiqsa + +sumrbd +qgrbuw +ubqgr + +dkmqsebjznylwucxot +ewyqhjrlpcfotbis + +ti +kxi + +dvgmlyepfnhscui +isbvmudynplf +nzqldwmfyuvtpi +finlydpourvme +dulnypvsrafmik + +zemctnsralu +trnaelzmsuc +azrstumnecl +mltrceasnuz +rtazlucenms + +aydgxnwehomujpv +nedjuaxhopwvmg +dvgwhfojpanmuxe +wjaenpdvmohugx +vanuomdxjehgwp + +xchjblnwmogv +coxlngbwjmhv +mjbwoclgxvnh + +br +rohb + +knpclsvozb +slcvbznk +klcbnvzs +lsvbkncz + +cehpgtzmawkjndufrlixb +anrtxfdbhiwmcjzplkeug +rkmwtcunzxhjpgbafdeil + +rqlstcwxkmoz +thsvxzkueymrlqw +rqlskomwzpaxt +wcxrzmptqkls + +tshv +hfzdlpij +hmces + +kfjmaedcoqltuwp +jrngliqdohsce +bgclzdhjqxyero + +urndaqxz +fyw +wzqua +ehglomjvbk + +guhfvqlnkydpiz +ljgyoiqarzksuwet + +yutebcorzh +slxcdkqnhjga + +fivxqukh +kixqzvu +vqxuki +xnpiuqvk +kvqfxudie + +rpsfdkmc +cdefrksmp +khmsfrdpc +pdmkrcfs + +hwn +whn + +rxhbzyedclofgwmuktsp +xlmozsbgkcfeyurthdw +psgtkcfazdwomblhyerxu +ytvfsxukgwmlrzdhobec + +nrvyx +vytxn +xyvn +nxvy +xnyv + +qct +cqt +tcq + +y +dy +lcwtunshbmy +fy +ry + +cnboedgyxatrk +ktdbeocgnay +wbkgtecnyahmodq +nxbtgzcsyeukrado +ydagcekbfont + +jytulh +yhtlz +fwtrkhly +bylht + +huigqrok +ikhrong +bighkwor +kgxrhosi + +zbkrpelxtsohdaw +ewzkvcxrdtboas +rabkdwoxyneszt +axhkbzrwdteos +rtbowkelsxzad + +aonplewqryh +euyqrfncsovkld +byalnwiezroq +enobxrlqy +pmgzeryonql + +akxpsmecuj +kfgsexjm +oxqfeskjm +yervixmdktlshbj + +r +r +r +r +r + +rdghefnubpzkma +dhubafromtpekzgn +knmhfjduebpgraz +zpekdbfamrnihug + +ybcgsmlwhovidfezp +omfpzqugycwrhbs + +x +x + +vjahspyncxzmie +zmpu +krpmzog +tfpmkz + +morafxw +xyckafoqwjm +ialpowmf +xhrsmwokbfjazu +anmfowdbq + +gdpblscxazjrmikoyth +exrolqfahdbymcwpksjt +gtmadncysrlhpojvxkib + +nxdilkwregfbaoqp +exnjrbsifwypkqovag +fgrotinqbwpkxae +flndzeoxkwgrcptibqa + +sidjln +mjslodni +ztdoxjnise +odnsehfjti +dnsyij + +qx +wmxtj +wxzmtucqy +godkvenhxpb +xrztj + +xofhvkjytqus +ytdqjkufimvx +uwyqntcvfpxkj + +rdtqukinob +wzufpcolmskynvteh + +vnab +kouvrfe +ljvcd +wqbdpvsy +bighvnmx + +frgsavwjel +fjlrwsaveg +afeljgrwsv +jlvsrewafg +kvfesjlwgra + +ygdszflehmwcnbopiatxju +jdnupgzmilsywaechoft + +da +rzfvailh +bhorq +ctgujpmsw + +ymbnzldsi +ltvsfm +mgcsl +emslgw + +taqecxvdypifblzgk +cekxfvgplrnqbty +vejogtfwqbyknlrpxc + +souwzdkcbqf +awzqgvbscukdpxn +bcszjdfkuimwq +sdbcuzqkw + +avrlf +kerlgmuahvc +wavfibznrol + +upnkam +xmjt +milex + +rxotufwczkpvia +pajkvhwtme +gpnektwljasv +pknaqwtvey +wpadktnlvjb + +kpfj +syurwad +asyvld + +p +bpz +po + +s +u +s + +ksvbeno +uyfivq +kbjodvh +czptrmawg + +xtiqze +xtisdz + +pylbdvkncjurmgh +yhbdoltvrpiknmjucg +vbmlhynrcugjpdk + +byoavnixtlzepjds +sapxunqeizdvblyho +qvlmeoisanzyhdxpb + +ifykcw +iyckw + +u +p +s +s + +f +f +f +f + +fvbjxaiklos +ufqnvcgxikdpalobt +bixlarfkvo + +ygpsxce +cpdsfygaxueb +ycgsxep +epcxsgty +pctxesgy + +meawzoqnidgh +hodmagqnzew +mwhzndaqgjoe +cdhseoqauwngzmx +oawmeqfdnhzg + +yrlvejxocsh +hvjrsmloyne +nsrvyojlhe + +zhufxvrkcdmwqlsa +lergvwdqnaosxtzchukbj + +xbvyt +ybvndgxt +gzxtonyb +xbcuwtyp + +creoxajkgvq +vgljkrexacwmhq + +wckjovuftgmb +boktfjuvgmwc + +cguaojyvre +ohiknuqags +lcazjyguor + +inhyfk +kify + +uhtqci +tfoqacim +srvcjytkqgx +hqctz +qmctahizn + +vekplqxuhrm +kmeuprlvqxh +vhlrkmpxuqe + +at +tagexyi +mpt +yxta + +uezmyjqvbgspirlc +fydbljgwmzxquecop +zptrgeybcqmluj +pelzjcugymtbvq + +fakguojpbsic +ubcfgyjakpiso +bliusctfvkampjog +fybsicjawkupog + +kmxerqlautij +zxidayte + +imbngcehtvs +oipfmkrqusnwxdzyl +imasjvn + +pek +e +ei +ep +ex + +yuw +uyw +wdysu + +omikta +zjvatmw +txsma +cm +lndgqmry + +cwazbkolvys +liyoveacbswj +siwokbavleyc +rocsyndufablvwx +aylbvcojesw + +nazfjsrouhgtv +zgsprothnufav + +ptmshxwqk +sebqodwi +euqsw +zwousq + +uqltjsikhpvefdawycbzg +plyhvtieubakzswqcfjgd +wehjvikyfpcsgaqtlbuzd +sfibzvquyljekgthpwcda +cgbtvdolizaeqypfksxjuhw + +izeqstg +sgiqzet + +fqbmpoxscydhrtljzga +cfqodxevmajhbrplzt +oecfrzvbpdaqhtjlxm +adfbxrmqlctzpjho + +dsmewbhpvrfuknj +opcvhwtrqkue +rwvkguhpzoe +vxpghreuiwqk + +fjzi +ftmizn + +xumjz +ujxymg +zumjx +ujmx + +n +l +l +x + +ghwfslriojz +rfzliwoe +flrziobw +ifcpozlrw + +smvfnglxaeczqwukojhbi +uieagsoqbhvlmjcfxwknz +nxoacfwemhijsgqvzbkul +qanmsiwvflcjbxzoeugkh + +pzciwneljbghoufdvymtqar +exlhrjvkpnmdoqbtzusiwcgf + +uxjwpobgcflndqairke +oktwumrzjlyedagxbinsfp + +oibhmyeguqkxjrcpawzfvds +vhsauyxdrobwcjmkzqepgif +gxhiwozfkbsecamrypudvjq +mxywofehvsczapkbuidqjgr +xsmvybwqdgrzeucfahpojik + +gdtlkuomn +ytkueoglh + +xgimja +gjxibma +mjbagix +xaiojmg +mgjaxi + +sgnfdiz +dto + +yhkvqrzw +hyknjrzvq +xtrhdsvkzoqy +ykqvzhr +zkqyhanegrv + +tzqrhavysuodmjp +abvpofyzhmrjqdt +yzopriuqnvmtahjd +atmryjpzhovqgd + +cyljrwofasq +afoqswrjclu +carljswfkoq +ljwsfocqyra +xjolqcwfars + +r +o +ak +xdje + +lfyjxpoeau +yhlgcftszpr +pkylfomw + +lunijqekwg +vafgdsjqeklniw +yeglwqkjin +leqgjkniyw + +mpvlijnfbz +jzmfbplnvih +jqdlpvbmnzif + +tk +tk +qkst +kt +tk + +mdowpcnxgbvuytqezljsk +tbnzcduipewvxlkqrsmjyga + +ilumzjpqotcv +fgtmowyx +gdsotkrm + +yncslevbgrqmizwu +brclynqgzvuewisfm +lgbzcesuvqnrwmyi + +bjmzopcdiqlyueh +olyupebiqcmzjhd + +eubsjrvwmyinzkaqdgcf +icqzjksbyregauvfdwnm +jugdnbsczwqfarvkyiem +benyrimfwzaqvukdscjg +ndcuvaziekbwyjrqgsfm + +g +c +c + +gvyfqupnxtswb +uvtykbjxgifcqz +lhvobuxgqfetmy + +dpzgaulb +plqugbrdmac + +htr +kgrt +rt +tr +trg + +o +qv +lr +m +l + +qotxnerijpfbkcagylh +nilhcfrpkjgboxaqey +ognqxipefrbjhlkacy +kojtilqxyrhbpancgfe +qjilgekcfsnhxapomrby + +fes +feoijn +ef +ef +ef + +dlzga +tlsidg +gdl +lpdgh + +onysxwkqlcgdemhup +mzlscwgkdnouexyp +kzdubeoyslgnpcxm +dymulpowksnegxc +kpusvxldgyaonemrci + +xh +e + +utbirhymae +yzehmoukq + +ijvulcmbrgkyxao +uvrajglcbomkxiy + +xo +zo +o +xo +o + +mbghatcenlifqjdkp +ejscikpgvtomhnxqzf + +stpvo +cjvpthsl +spvdnyrt +qvypftsx + +obrxaqyudvinmk +qlimnvosubahydgkecrx +yrftzoxkjqvbaidm +kvqaxdmboirwy + +dxj +xdj +jxd +jxd +djx + +hfjeucmkrvnwxs +nxujekrqmsbofhc + +ezarol +lebz +bzel + +jgmzcl +jlzcmg +cmlzjg +jmclzg +gmcjzl + +o +u + +bdfqljiuacptzvgrxoe +pauvztlihdqrjofgx +xtrjvzuaipfldgoq +jzrdtxqlwiavungfpo + +cjurgpeyvlzhafx +aurhsfbvpeyxgjzc +gzvhejlkpxyfocura + +rvyfbicazduolwtgqk +qklnrgyaofdzvciwut + +qsw +qs + +nrfgxpujobhk +rxmpnokdgbjfi +lxbngkrfyjvcoz + +e +e +zegkx +e +e + +kon +k +k + +ekvi +iekv +ekvi +ivek + +jfbyxwhrne +nxjhrfbdwy +bewhryfjtnx +mfhoxyjbrsnw + +bn +n +sxv +d + +egrzknhbxfvqtdcu +edhrioxvjgnzbf + +yjoskmhw +kdtqfehazbyu + +zq +zq +qz +uqz + +ilbpcz +ibcqplz +gczbpil + +nikychwgab +caibgwklndy +ckbenqwuafyg + +qubikjdz +jkiuzdb + +gwmavrpfsdnkyizuelt +yuqnvjmlogpizcfetx + +tnsf +thnfs +tfsn +sntf +nstf + +vflagunhs +aiwvlhjfsunxg +ulvhgfsna + +yajtfdwh +hzdpalftjb + +nazpqismug +pznuismgq +mgiqnupwsz +mgptzusniq +boifzpmsuqgn + +ohu +ht +hpygo +ijkdfhcb +uhno + +kfzmrhyjvw +hzgxpjbkwvyr +zykmfrvwshj + +yqsezgcojbw +zjsgcoeqby +jgfsbozqyec +czsgoyfbjqe + +fjywktd +yjktfwd + +nwvrodtpqy +xtrvnosihzgq + +gdwcmlxiqtynsjozapeur +xwlgsjatqzycnodprmue +adxtgqujrcopnlwsmezy + +snep +shwz + +unvpgc +guncvp + +suctpbxogra +kcxvgteayu +ztgxuacy + +pewbhlvjtg +omskldnz +iafryucxq + +zoucjefxpdta +xbfijrelpucsot +ktoexjpcauf +jtezoxkpfhcduw + +xiaszncr +asxnircz +xzncrsai +rixseuzanc +nzaicrsx + +owtvxqcizrapl +alqxivcprzowt + +ltrhdykufvwex +ekxvfldwuhrt +ervktduwlhfjax + +ylvgpjthiex +snmbgjfzduxqearikc + +eml +bkhyl +rzsoitwqn +dacupjev +fldc + +uqigoj +ojui + +zgbsumeycaxvontwdkij +jbtelqcxnumsoakiwyvg +waseyvijugnkobptcmx +atesbkmjuhcvfngxywoi + +pc +pc +ikyp + +xtgvlenosarwubmfihz +txganvweourhbqslfmiz +lientrsuwghobfmvxaz +taluorneizhswmbxgvf +zginuholscexmftrbwva + +xjkv +xtouw +tywx +oxwt + +zk +cz +bz + +qcp +qpc + +ogptyeunzsqmarjc +jrvlopzynes +xoszpnjryle +zbrnypsoej + +nuigyflbxs +yxunspgj +vnuscztymqowgxr +ixnyshgu + +pdn +cyskxdp + +ewlkgbdxqtiz +eqgxitldbzkw +kbdexzgitwql + +c +p +t +v +gqh + +uvigbjqk +ibvugq +vbuiqg + +wzdca +dzawc +cawzyd + +mfaigwlu +pygxjmufwal +ugfwlam +glmafuw + +bewfkxsvl +yxdqnmaturov + +fdrbt +mxjnfdqpc +wdltfo +adwletfr + +t +pgo +e +tiabc + +zbthk +zbkhatr +zbhtk + +flxwhbzkei +lwkhxfezbi +xelfwbzhik +bhzefxkliw +klizhwbfxe + +btmwkoqs +bstomkqw +wskomtbqi +kswtbmqo +kqbswotm + +kdfbzj +bfdzjm + +bf +ef +f +fut +bf + +bvl +lvu + +kezwynmfrgahlbqsjtdxiovpu +wmaukoqsldvheztxrgjpifbny +qgkrwvaiznhpmtlxjubesdoyf +osverdamnxjufcybpkztqighwl + +nza +anz + +wfjsdaq +iwlrou +ykwftq + +zgtuvqxmljwyaifcbp +pcgytlqjvbaxwzimf +cmqzwaljvbufyigptx +sxgvcbweymiflqajtkpz +fhgmjpwclzibtvaqxy + +rohqjmnvlsdaigywbxe +xmhiarjdogqwbvnlsey + +jhz +jhz +jzh + +oemyvhgznpblsq +hpsvzycebqlmng +elhnwqdpbsgzyvm +cenomgyzhqlsbvp + +gdnc +wncd + +tnlprwbcsaygzqxuoev +rxqdasecgwbzmfvntpl + +jtucglizkohrafs +ebjhogu +hdugoj + +ncyvqk +oulfaxqnerid +ptmsynbvkwq + +mxihwyzetlbnkpfs +ksqwhxtzbenfpim +nqbtxwsepfmkih +khixywsmbnetpfl +peikctmafswhnbx + +phylqxrdtg +yxtapqni +nkiwytuveqxp + +lhqrfys +sqdfly +ysfhlq +sylfq + +sqpjuobilhmtvrxaz +kuwgncfdv + +dqzke +qezkd +kqezd +zkqed +kdqez + +lio +iol +loi +lio +oil + +hvpwi +rhvp +fpysmvd +tpvrl +vph + +idjeoxvyqaufgpnlc +xnplcqjvdyigsaef + +y +qw + +rhb +fpqsiadrjkl + +hinvdck +kvcahnid +fhcupntkvdqijmy +dvnchik +aivcnhxkd + +xqugmnktofslbpevzd +yaqztjnicrwd + +biadvoeznswx +iaxszcdwboj +isbdkxzwoanve +gikqxzorsadfwb +asozrwidqxvb + +bvotgwrxe +xbhryeov +ojrvxebi +vxeorb + +fb +rqwl +qlrjyfp +nkhgmov + +zexjvfbwro +wzvxorfjbe +vorwzexbjtf +xeovwfjbzr + +owfmx +uxomf +mfo +cfkmo + +atwsbvcn +mijkzngueoy + +twqprciyaxkb +barckwiptqyx +iabyqwtcrkxp +rqbkipctxywa + +vmhzjek +tx +aix +dsa + +byzxqpgureth +gbxryhptqiezuc +lqrzjwythegxubp +hqruytzegbxp +tepughsrqzybx + +hwydxbeflai +yhewcfbaixd +yhwadxfeib + +hi +h +h +h + +mhket +mtkh + +loacixzmfy +fmxlzaoyci +ylifaxopczm +czyafoxmli + +ymrfxiwbse +ihpqjuaczd + +ealixkwz +gocmqyfthp + +gedjwnt +wtdezgn +hgcuwrtnped +zjngtdlexw + +jk +jk +kj +jk +jk + +gkxldasfhqncbiyu +hnpfbycsgqkuldex +hquxfksigydlcnab +cxauqgdiyfbnkshl + +niahryvlxbekt +dyhknvbaleirtx +tknljyvrihbzxe +seyxknvihrcbtl +bxrhukldytvneiw + +vuq +cfawvlt +rhnvzu + +wxlhvnmispbot +whvbcxmolntips +snhtmbpwifulxov +itswhupmncvolbx +rhtlsdpiwonbkqvxm + +ojmyc +kfzuehvirps + +mk +km +km + +fjyx +jitrevpfy +yjs +jyxmiect +dykgjnzbl + +rbwpjflnoegkqt +hwxceyimsdzntvu + +golf +fzgol +dlxfomg +lfozg +floag + +dfbmcyi +yvzpkrbc +icybu + +mcbditlrfgeaoh +camdhrfbvoglei +riagefbmclvokqz +dbfogjmeacrpl +lwuogecanfxsbrmy + +lgsnwuockhmpxibedqzaf +cvmiepdsubkgwzhf +bsvipdjwcfkmezugh +wgfzicsmubpdkeh + +iyeorgvpmutnhqcwxj +jqoguadpnmrk +nmpquzglaorsj + +apjqhruongvztmiywecl +padwbieyshonfrtxqcukzglv +yolrhezqicgpmvtaunw +mljzahrwcpqygvonuite + +szhjetf +sdtozreuhmfp + +f +f +mf +f + +gnjqcad +idlhjay +rejbwamoud +danxj +zjkdia + +lupiwyqntjgekvsr +gwqupjykitrlnsbo + +ojcxmuqsrhyv +lgcovdyhnifsp + +wphvcu +lznsm + +wpq +qpw +wqp +pwq +fqwhp + +nyzx +ubpx +xwi +wtxhe + +vkujyxtido +tvouidyjxk +vidkjuoxty +uxtoivdkjy +yvukijdoxt + +fpuboyiwdktvc +hsqnzuagr + +swabt +mwsb +sbwm +bws + +idlshcnf +ficnd +tdfcin +nicdf + +ajodwgmsy +wmjvoygd +ojdwmyg +dovgwjmy + +yemtzisjpxchanuovwdkr +evxtomkyhrupwsnizac +ytevcsimkwrnzoauhpx + +whley +dhyetlqf + +fqx +xf +bfxz + +ipwvb +vdnb +rcvnf +chvr +xjtvyez + +sdpuoewx +wfqrphkdelosbvgyum +pudzioesnw +idatsupewo + +knfheau +kanehuf +unekfa +klcsnemaufy + +yhuvigcrp +rivgypcuh +urphgvciy +iyhrcvupg +vuphryicg + +flozkyvhnwxr +fvpsybhlwrz +hzqvmfgrl +irholckaveszf + +gypwufz +agspwqmuyz +yogwpzu + +c +oc diff --git a/day-6/src/main.rs b/day-6/src/main.rs new file mode 100644 index 0000000..9035577 --- /dev/null +++ b/day-6/src/main.rs @@ -0,0 +1,137 @@ +use std::collections::HashSet; +use std::fs; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("input")?; + + // Part 1 + let groups = parse_groups(&input)?; + println!("{}", count_answers(&groups)); + + // Part 2 + let groups = parse_group_individuals(&input)?; + println!("{}", count_individual_answers(&groups)); + + Ok(()) +} + +fn parse_groups(input: &str) -> Result<Vec<HashSet<char>>, String> { + input + .split("\n\n") + .map(|group| { + group + .chars() + .filter(|c| *c != '\n') + .map(|c| { + if c.is_alphabetic() { + Ok(c) + } else { + Err(format!("Invalid answer: {}", c)) + } + }) + .collect() + }) + .collect() +} + +fn count_answers(groups: &Vec<HashSet<char>>) -> usize { + groups.iter().map(|group| group.iter().count()).sum() +} + +fn parse_group_individuals(input: &str) -> Result<Vec<Vec<HashSet<char>>>, String> { + input + .split("\n\n") + .map(|group| { + group + .lines() + .map(|individual| { + individual + .chars() + .map(|c| { + if c.is_alphabetic() { + Ok(c) + } else { + Err(format!("Invalid answer: {}", c)) + } + }) + .collect() + }) + .collect() + }) + .collect() +} + +fn count_individual_answers(groups: &Vec<Vec<HashSet<char>>>) -> usize { + groups + .iter() + .map(|group| { + let mut iter = group.into_iter().cloned(); + let first = iter.next().expect("Must have at least one element"); + + iter.fold(first, |cumulative, entry| { + cumulative.intersection(&entry).copied().collect() + }) + .len() + }) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + use indoc::indoc; + + #[test] + fn test_simple() -> Result<(), Box<dyn std::error::Error>> { + let input = indoc!( + "abc + + a + b + c + + ab + ac + + a + a + a + a + + b + " + ); + + let groups = parse_groups(input)?; + let counts = count_answers(&groups); + assert_eq!(counts, 11); + Ok(()) + } + + #[test] + fn test_simple2() -> Result<(), Box<dyn std::error::Error>> { + let input = indoc!( + "abc + + a + b + c + + ab + ac + + a + a + a + a + + b + " + ); + + let groups = parse_group_individuals(input)?; + let counts = count_individual_answers(&groups); + assert_eq!(counts, 6); + Ok(()) + } +}