From bddc038c016087bfb81a1fd8c79d5ab5d66e2170 Mon Sep 17 00:00:00 2001 From: Julien Moutinho Date: Sat, 5 Dec 2020 03:20:45 +0100 Subject: [PATCH 1/1] add J04 --- .gitignore | 2 + Day04/Main.hs | 140 +++++++ Day04/batch | 1023 +++++++++++++++++++++++++++++++++++++++++++++++++ Day04/example | 13 + aoc2020.cabal | 35 ++ flake.lock | 38 ++ flake.nix | 37 ++ 7 files changed, 1288 insertions(+) create mode 100644 .gitignore create mode 100644 Day04/Main.hs create mode 100644 Day04/batch create mode 100644 Day04/example create mode 100644 aoc2020.cabal create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b23ba7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist-newstyle +result* diff --git a/Day04/Main.hs b/Day04/Main.hs new file mode 100644 index 0000000..4ae862d --- /dev/null +++ b/Day04/Main.hs @@ -0,0 +1,140 @@ +{-# LANGUAGE OverloadedStrings #-} +module Main where +-- Usage: cabal run exe:j04 +-- or: nix run .#j04 + +import Control.Applicative (Alternative((<|>))) +import Control.Monad (guard) +import Data.Maybe (catMaybes) +import Data.Text.Lazy (Text) +import Data.Void (Void) +import Prelude +import qualified Control.Applicative.Permutations as P +import qualified Data.Char as Char +import qualified Data.List as List +import qualified Data.Text.Lazy.Encoding as Text +import qualified Text.Megaparsec as P +import qualified Text.Megaparsec.Char as P +import qualified Text.Megaparsec.Debug as P +import qualified Data.ByteString.Lazy as BSL + +data Result = Result + { example1 :: Int + , batch1 :: Int + , example2 :: Int + , batch2 :: Int + } deriving (Show) + +main :: IO () +main = print =<< Result + <$> parsePassports parserPassport "example" + <*> parsePassports parserPassport "batch" + <*> parsePassports parserValidPassport "example" + <*> parsePassports parserValidPassport "batch" + +data Passport = Passport { + pp_byr :: Text, -- Birth Year + pp_iyr :: Text, -- Issue Year + pp_eyr :: Text, -- Expiration Year + pp_hgt :: Text, -- Height + pp_hcl :: Text, -- Hair Color + pp_ecl :: Text, -- Eye Color + pp_pid :: Text, -- Passport ID + pp_cid :: Maybe Text -- Country ID +} deriving (Show) + +type Parser = P.Parsec Void Text + +parserPassportEntry :: Text -> Parser Text +parserPassportEntry key = P.dbg "PassportEntry" $ + P.string key + *> P.char ':' + *> P.takeWhileP (Just "value") (\c -> c /= ' ' && c /= '\n') + +parserPassport :: Parser Passport +parserPassport = P.dbg "Passport" $ + P.intercalateEffect (P.char ' ' <|> P.try (P.char '\n' <* P.notFollowedBy (P.char '\n'))) $ + Passport + <$> P.toPermutation (parserPassportEntry "byr") + <*> P.toPermutation (parserPassportEntry "iyr") + <*> P.toPermutation (parserPassportEntry "eyr") + <*> P.toPermutation (parserPassportEntry "hgt") + <*> P.toPermutation (parserPassportEntry "hcl") + <*> P.toPermutation (parserPassportEntry "ecl") + <*> P.toPermutation (parserPassportEntry "pid") + <*> P.toPermutationWithDefault Nothing (Just <$> parserPassportEntry "cid") + +parserPassports :: Show passport => Parser passport -> Parser [passport] +parserPassports passportParser = (catMaybes <$>) $ + P.dbg "parserPassports" $ + P.sepBy ( + Just <$> P.try (passportParser <* (() <$ P.char '\n' <|> P.eof)) <|> + Nothing <$ P.some (P.takeWhile1P (Just "line") (/= '\n') <* P.char '\n') + ) (P.char '\n') + +parsePassports :: Show passport => Parser passport -> FilePath -> IO Int +parsePassports passportParser input = do + content <- Text.decodeUtf8 <$> BSL.readFile ("Day04/" <> input) + case P.parse (parserPassports passportParser <* P.eof) input content of + Left err -> error (P.errorBundlePretty err) + Right passports -> return $ length passports + +-- byr (Birth Year) - four digits; at least 1920 and at most 2002. +-- iyr (Issue Year) - four digits; at least 2010 and at most 2020. +-- eyr (Expiration Year) - four digits; at least 2020 and at most 2030. +-- hgt (Height) - a number followed by either cm or in: +-- If cm, the number must be at least 150 and at most 193. +-- If in, the number must be at least 59 and at most 76. +-- hcl (Hair Color) - a # followed by exactly six characters 0-9 or a-f. +-- ecl (Eye Color) - exactly one of: amb blu brn gry grn hzl oth. +-- pid (Passport ID) - a nine-digit number, including leading zeroes. +-- cid (Country ID) - ignored, missing or not. +data ValidPassport = ValidPassport { + vpp_byr :: Int, + vpp_iyr :: Int, + vpp_eyr :: Int, + vpp_hgt :: Height, + vpp_hcl :: String, + vpp_ecl :: Eye, + vpp_pid :: Int, + vpp_cid :: Maybe Text +} deriving (Show) +data Height = Cm Int | In Int deriving (Show) +data Eye = Amb | Blu | Brn | Gry | Grn | Hzl | Oth deriving (Show) + +parserValidPassport :: Parser ValidPassport +parserValidPassport = P.dbg "ValidPassport" $ + P.intercalateEffect (P.char ' ' <|> P.try (P.char '\n' <* P.notFollowedBy (P.char '\n'))) $ + ValidPassport + <$> P.toPermutation (mkNum <$ P.string "byr:" <*> P.count 4 P.digitChar >>= \x -> do + guard (1920 <= x && x <= 2002) + return x) + <*> P.toPermutation (mkNum <$ P.string "iyr:" <*> P.count 4 P.digitChar >>= \x -> do + guard (2010 <= x && x <= 2020) + return x) + <*> P.toPermutation (mkNum <$ P.string "eyr:" <*> P.count 4 P.digitChar >>= \x -> do + guard (2020 <= x && x <= 2030) + return x) + <*> P.toPermutation (P.string "hgt:" *> do + x <- mkNum <$> P.some P.digitChar + P.choice + [ Cm <$ P.string "cm" <* guard (150 <= x && x <= 193) <*> pure x + , In <$ P.string "in" <* guard (59 <= x && x <= 76) <*> pure x + ] + ) + <*> P.toPermutation (P.string "hcl:#" *> P.count 6 (P.digitChar <|> P.satisfy (\c -> 'a' <= c && c <= 'f'))) + <*> P.toPermutation (P.string "ecl:" *> P.choice + [ Amb <$ P.string "amb" + , Blu <$ P.string "blu" + , Brn <$ P.string "brn" + , Gry <$ P.string "gry" + , Grn <$ P.string "grn" + , Hzl <$ P.string "hzl" + , Oth <$ P.string "oth" + ]) + <*> P.toPermutation (mkNum <$ P.string "pid:" <*> P.count 9 P.digitChar) + <*> P.toPermutationWithDefault Nothing (Just <$> parserPassportEntry "cid") + where + mkNum :: [Char] -> Int + mkNum = List.foldl' step 0 + where step a c = a * 10 + fromIntegral (Char.digitToInt c) diff --git a/Day04/batch b/Day04/batch new file mode 100644 index 0000000..b17cdcd --- /dev/null +++ b/Day04/batch @@ -0,0 +1,1023 @@ +ecl:#eef340 eyr:2023 hcl:#c0946f pid:244684338 iyr:2020 cid:57 byr:1969 hgt:152cm + +pid:303807545 cid:213 ecl:gry hcl:#fffffd +eyr:2038 byr:1951 +hgt:171cm iyr:2011 + +hcl:#c0946f byr:1933 eyr:2025 pid:517067213 hgt:173cm +ecl:hzl +iyr:2018 + +pid:5253256652 byr:2009 hgt:152cm iyr:1989 eyr:1968 hcl:64cb63 ecl:hzl + +iyr:2013 +pid:862607211 eyr:2020 +hgt:174cm +byr:1990 +ecl:blu hcl:#888785 + +ecl:grn byr:1955 +pid:608098408 eyr:2027 iyr:2020 hcl:#b6652a cid:264 +hgt:181cm + +byr:1998 ecl:hzl eyr:2021 +hcl:#866857 hgt:189cm iyr:2030 +pid:013735467 + +pid:075417314 hcl:#b6652a byr:1957 +iyr:2011 +hgt:154cm +eyr:2025 +ecl:amb + +iyr:1993 hgt:74cm eyr:1960 +byr:2029 +hcl:293244 ecl:#3cb5e5 pid:4861232363 + +hgt:153cm hcl:#6b5442 pid:065240897 byr:1932 +cid:196 ecl:blu eyr:2028 iyr:2019 + +eyr:2024 ecl:amb +hcl:#866857 byr:1922 pid:496904942 hgt:164cm iyr:2020 + +pid:847705161 byr:1951 cid:124 iyr:1991 +eyr:2028 ecl:dne +hcl:6b2d28 hgt:172cm + +byr:2007 iyr:2029 ecl:hzl eyr:2026 hgt:168in +hcl:z +pid:63151612 + +iyr:2027 hgt:172in +cid:174 byr:2014 hcl:z eyr:1921 +ecl:grt pid:#cebdc2 + +ecl:amb hcl:#d09c0f +iyr:2015 hgt:156cm eyr:2026 byr:1962 +pid:086120872 + +cid:125 +pid:837849996 +byr:1958 ecl:brn hgt:166cm hcl:#ceb3a1 eyr:2028 iyr:2012 + +ecl:gry hgt:180cm +pid:939059935 eyr:2023 byr:1977 hcl:#b6652a + +hgt:190in byr:2029 eyr:1984 +ecl:gry hcl:z pid:055092916 iyr:2010 + +hgt:63in ecl:blu byr:1940 iyr:2012 eyr:2029 hcl:#7d3b0c +pid:163033394 + +eyr:2040 pid:181cm +iyr:1928 hgt:76cm hcl:d8aafb byr:1949 cid:275 ecl:xry + +hcl:#cfa07d ecl:oth byr:1948 eyr:2021 +pid:719690182 hgt:179cm iyr:2020 + +byr:1939 cid:266 +eyr:2026 iyr:2017 hcl:#f116d2 +ecl:hzl pid:522421825 +hgt:68in + +hcl:z hgt:61in +cid:115 pid:180cm iyr:2030 byr:2014 eyr:2032 ecl:hzl + +ecl:xry +eyr:2028 pid:191cm iyr:2015 hgt:150cm byr:2029 + +eyr:2027 +hcl:#a97842 pid:997937480 hgt:61in iyr:2019 +byr:1921 +ecl:grn + +hgt:163cm +pid:912318455 iyr:2016 byr:1988 ecl:brn hcl:#a97842 cid:221 eyr:2029 + +cid:333 hcl:#c0946f +hgt:163cm iyr:2018 eyr:2027 ecl:oth + +cid:70 hcl:#c0946f +pid:961507902 byr:1949 ecl:grn iyr:2017 eyr:2029 hgt:69in + +hgt:169cm ecl:amb +iyr:2013 pid:496169901 +byr:1943 eyr:2028 hcl:#ceb3a1 +cid:249 + +ecl:blu cid:343 +iyr:1998 hgt:154in hcl:#efcc98 byr:1972 + +pid:508213120 iyr:2012 eyr:2025 hcl:z hgt:70cm byr:1976 +ecl:brn + +iyr:1924 +eyr:2005 +hcl:z +hgt:167 pid:154cm +byr:2007 + +pid:761333244 hgt:180cm iyr:2017 hcl:#18171d eyr:2021 +byr:1983 +cid:67 ecl:oth + +eyr:1993 +byr:2003 +hcl:#602927 +ecl:grt +cid:84 hgt:178 +pid:1847086637 iyr:2026 + +hcl:#866857 hgt:162cm pid:483774485 iyr:2010 +byr:1946 eyr:2028 ecl:gry + +pid:726639691 eyr:2028 +hgt:171cm hcl:#ff65a6 +iyr:2011 byr:1989 + +hcl:z iyr:2026 ecl:xry +eyr:2037 byr:2005 pid:#f09a0f +hgt:68 cid:156 + +hgt:71in ecl:blu eyr:2026 hcl:#18171d +byr:1981 iyr:2017 +pid:698636544 + +eyr:2021 +byr:1957 ecl:brn pid:365378126 cid:93 iyr:2019 hcl:#18171d hgt:179cm + +byr:1996 iyr:2014 hgt:64cm +eyr:2034 +hcl:z + +pid:629486472 cid:140 +hgt:192cm eyr:2020 hcl:#b6652a iyr:1988 byr:2021 ecl:brn + +byr:1955 iyr:2015 eyr:2030 +ecl:gry hcl:z pid:6550198754 +hgt:158cm cid:305 + +ecl:gry hcl:#a97842 +hgt:176cm eyr:2022 pid:810146585 iyr:2020 + +byr:2027 hcl:#cfa07d +iyr:2011 ecl:#f07598 +cid:293 +hgt:150cm pid:#fa948d eyr:2029 + +eyr:2028 iyr:2013 hgt:69in ecl:gry pid:317170371 +cid:147 hcl:#bfe1f1 + +byr:1976 +pid:059341891 hgt:174cm +ecl:oth +eyr:2029 iyr:2017 hcl:#733820 + +iyr:2018 hcl:#ceb3a1 hgt:188cm cid:308 +pid:792826885 byr:1948 ecl:blu eyr:2028 + +iyr:2017 cid:94 hcl:#95c7dc +pid:231757803 eyr:2022 +byr:1992 hgt:153cm ecl:amb + +eyr:2027 +iyr:2011 hgt:186cm +ecl:brn pid:996347346 hcl:#866857 +byr:1960 + +eyr:2025 byr:2001 +ecl:blu pid:755715478 iyr:2019 hgt:61in + +ecl:gry +eyr:2038 +hgt:81 hcl:z iyr:2028 +cid:214 byr:1965 + +pid:412744447 byr:1979 hcl:#cfa07d ecl:blu +eyr:2029 cid:157 +hgt:180in iyr:1948 + +hgt:170cm +pid:623557081 byr:1924 eyr:2024 hcl:98d623 iyr:2012 ecl:amb + +cid:311 ecl:grn +iyr:2011 byr:1982 +eyr:2002 hcl:#ef318a +pid:0548169957 +hgt:87 + +eyr:2030 hcl:#733820 iyr:2016 pid:558470391 +byr:1936 ecl:oth hgt:185cm + +iyr:2019 +ecl:amb byr:1949 +pid:376468392 +hgt:178cm + +pid:019195245 +ecl:grn hgt:171cm +byr:1978 iyr:2011 eyr:2022 hcl:#733820 +cid:134 + +hcl:#623a2f hgt:192cm eyr:2026 byr:1977 +ecl:grn cid:308 + +ecl:hzl pid:715816358 hgt:69in iyr:2014 hcl:#623a2f +byr:1996 +eyr:2027 + +iyr:1947 +ecl:#39a697 +hgt:183cm byr:2029 +eyr:2022 pid:7951883913 +hcl:z + +ecl:gry byr:1950 +hcl:#18171d hgt:168cm iyr:2020 pid:677187333 eyr:2027 + +byr:1969 ecl:blu hcl:#18171d iyr:2011 +hgt:162cm +pid:701349891 + +cid:269 byr:1966 +iyr:2011 +pid:905940527 eyr:2023 hgt:190cm +ecl:brn hcl:#ceb3a1 + +eyr:2027 pid:454627395 ecl:brn +hcl:#ceb3a1 cid:302 hgt:184cm +byr:1959 +iyr:2015 + +iyr:2011 +eyr:2028 +hgt:166cm +hcl:#733820 byr:1938 ecl:blu pid:857984986 + +hcl:#c0946f ecl:brn pid:226877822 +hgt:182cm byr:1998 +cid:160 + +hgt:186in pid:26499164 byr:2017 +hcl:z +iyr:1998 eyr:2026 +cid:331 ecl:#236556 + +pid:328866543 +hgt:165cm eyr:2039 iyr:1987 ecl:amb byr:2018 hcl:z + +iyr:2016 eyr:2036 hcl:#888785 byr:1976 pid:160402352 hgt:76cm ecl:blu + +ecl:blu +hcl:#fffffd eyr:2025 hgt:66in pid:979788527 +byr:1957 iyr:2013 + +ecl:grn pid:279357265 iyr:2019 eyr:2021 byr:1953 +hgt:177cm hcl:#c0946f + +ecl:oth hcl:z eyr:2025 byr:1949 hgt:189cm iyr:2020 pid:901383503 + +byr:2019 hcl:#733820 +pid:31022828 eyr:1929 +hgt:75cm iyr:2012 ecl:grn + +pid:080462937 +ecl:blu hcl:#866857 +cid:102 +iyr:2013 eyr:2025 byr:1975 hgt:64in + +iyr:2016 +eyr:2028 +cid:125 +byr:1979 hcl:#866857 +ecl:brn hgt:173cm pid:814947616 + +hcl:z byr:2020 pid:#c3b54b hgt:174in eyr:2038 +iyr:2016 +ecl:gmt + +cid:132 +iyr:1958 +pid:61543452 hcl:z +ecl:zzz eyr:2039 byr:2006 + +cid:55 eyr:2022 byr:1954 iyr:2015 +hgt:188cm hcl:#a97842 pid:49143631 ecl:amb + +hgt:152cm +byr:1982 +iyr:2013 ecl:blu +hcl:#341e13 +eyr:2026 pid:440841976 + +iyr:2019 ecl:blu pid:553456616 hcl:#733820 hgt:160cm byr:1932 eyr:2030 + +byr:1980 hgt:169cm hcl:#7d3b0c cid:312 iyr:2010 +eyr:2026 pid:028550304 ecl:grn + +ecl:amb eyr:2021 iyr:2014 hgt:71in pid:986053283 byr:1981 + +ecl:oth +eyr:2023 hcl:#888785 +byr:1949 +iyr:2016 pid:699325656 + +hgt:63cm cid:297 eyr:2020 pid:990390922 +hcl:#602927 ecl:lzr +iyr:2012 byr:2016 + +hcl:9ea2fa eyr:2023 pid:088680493 +byr:1998 iyr:2017 ecl:utc hgt:170cm cid:175 + +cid:316 iyr:2016 eyr:2026 hcl:#79ff1d hgt:65in +byr:1997 pid:215466710 ecl:oth + +cid:213 byr:1983 hcl:#888785 iyr:2016 pid:767747981 eyr:2025 +ecl:hzl hgt:168cm + +eyr:2030 byr:1972 +cid:282 +ecl:gry hgt:178cm +hcl:#a97842 +iyr:2018 + +hcl:#6b5442 ecl:amb +eyr:2028 cid:104 hgt:159cm pid:446429120 iyr:2012 +byr:1938 + +byr:1940 hgt:178cm ecl:oth +hcl:#ceb3a1 +pid:845683663 iyr:2015 eyr:2024 + +byr:1940 pid:496262233 +hgt:184cm hcl:#b6652a +ecl:grn cid:152 iyr:2012 eyr:2029 + +hgt:185cm pid:455744229 byr:1954 eyr:2022 ecl:gry hcl:#6b5442 iyr:2012 + +hgt:182cm byr:1966 eyr:2028 ecl:#a5b7fc +iyr:2029 + +pid:343591896 +cid:58 +ecl:hzl +eyr:2022 hgt:180in byr:2021 +hcl:#6b5442 + +ecl:utc hcl:#b6652a +pid:635147657 byr:2020 +eyr:2022 hgt:157cm iyr:2018 + +ecl:grt cid:312 iyr:1959 pid:154262836 +hgt:171cm +hcl:#fffffd +eyr:2024 +byr:1982 + +hcl:#7a12b4 pid:223424149 ecl:hzl hgt:175cm +byr:1930 iyr:2010 eyr:2028 + +hcl:#c0946f pid:633476454 eyr:2026 iyr:2011 +byr:1934 +hgt:186cm +cid:289 ecl:gry + +hcl:#fffffd pid:376300524 hgt:155cm byr:1964 iyr:2017 eyr:2021 ecl:grn + +hcl:a5d4dc byr:2006 cid:165 ecl:#db800f iyr:2029 pid:0199789970 eyr:1961 hgt:61cm + +eyr:2027 hgt:170cm iyr:2010 +hcl:#c0946f +ecl:grn pid:415726530 +byr:1985 + +cid:197 byr:1957 hgt:192in hcl:#a97842 ecl:hzl eyr:2029 pid:958973455 iyr:2011 + +iyr:2015 pid:933689314 hgt:162cm ecl:amb +cid:122 eyr:2021 +hcl:#6b5442 byr:1973 + +eyr:2026 hgt:172cm +iyr:2012 +ecl:brn hcl:#733820 pid:004474632 +byr:2000 + +hgt:191cm eyr:2030 byr:1999 pid:9155071477 iyr:2026 hcl:#602927 cid:315 +ecl:grn + +iyr:2010 pid:182884251 hcl:#18171d hgt:154cm +eyr:2020 +byr:1926 ecl:oth + +iyr:2019 eyr:1920 pid:132839546 +cid:283 hgt:188in hcl:#efcc98 byr:2027 + +iyr:2011 hgt:177cm +cid:117 byr:1976 +ecl:gry +hcl:#623a2f eyr:2030 pid:134592046 + +byr:1968 hgt:146 +iyr:2013 hcl:eefdc4 eyr:2028 +ecl:xry pid:722120008 + +iyr:2016 byr:1941 hgt:67cm cid:51 hcl:#b6652a ecl:hzl eyr:2034 pid:994005715 + +hcl:#cfa07d ecl:oth +hgt:182cm eyr:2021 pid:612583941 +byr:1983 +iyr:2019 + +byr:1922 +hcl:#602927 hgt:161cm ecl:gry eyr:2020 pid:190170808 iyr:2013 + +hgt:63cm cid:136 +iyr:1999 +pid:8235748647 hcl:z +byr:2022 eyr:1933 +ecl:#304383 + +cid:273 ecl:blu hcl:z +iyr:2011 byr:2007 +eyr:2020 +pid:942473857 hgt:178in + +ecl:grt byr:2029 hgt:187in eyr:2030 cid:160 +hcl:#efcc98 pid:#39f22b +iyr:1966 + +byr:1978 ecl:oth iyr:2011 hgt:164cm eyr:2027 hcl:#cfa07d + +hgt:75cm hcl:#1e8137 byr:1986 ecl:blu eyr:2022 pid:796688423 +iyr:2012 + +eyr:2026 +ecl:#3013af hcl:z pid:#e8597f hgt:123 iyr:2025 byr:1942 + +hcl:z hgt:177in +iyr:1993 pid:#4c9348 byr:2008 eyr:1989 + +pid:123524366 byr:1935 +hgt:156cm hcl:#7d3b0c +iyr:2020 ecl:brn eyr:2020 + +hcl:z eyr:2038 pid:7663741757 ecl:gmt hgt:174 +byr:2008 iyr:1939 +cid:225 + +hcl:#888785 hgt:172cm +ecl:oth pid:500711541 eyr:2027 +byr:1931 iyr:2012 + +pid:575447108 ecl:amb byr:1943 +hcl:#888785 hgt:173cm eyr:2024 + +eyr:2021 iyr:2010 pid:178773264 hgt:157cm byr:1965 hcl:#bb7bcf ecl:amb + +iyr:2023 ecl:#35bd84 byr:2020 +hgt:72in +eyr:2037 +hcl:#6b5442 +pid:421311669 + +byr:1921 iyr:2011 +pid:146088688 +eyr:2023 hcl:#15ed24 hgt:183cm +ecl:brn + +hcl:#b6652a cid:243 +byr:1993 eyr:2024 +iyr:2014 hgt:172cm +pid:771275594 + +eyr:2024 +hcl:#cfa07d pid:858807920 cid:293 hgt:157cm ecl:hzl iyr:2013 byr:1984 + +ecl:blu hgt:193cm cid:73 hcl:#18171d eyr:2026 +iyr:2016 pid:124151812 byr:1945 + +ecl:amb iyr:2018 +pid:214555737 hgt:157cm +eyr:2028 +byr:1925 hcl:#866857 + +pid:5633250409 +hcl:4ef7d8 +byr:2004 iyr:1958 +hgt:96 +eyr:2038 ecl:xry cid:274 + +byr:1972 pid:401239851 hgt:184in hcl:z iyr:2017 +eyr:2030 ecl:#cb289a cid:140 + +hgt:175cm +byr:1926 hcl:#cfa07d eyr:2029 ecl:gry pid:325039730 iyr:2017 + +cid:101 hgt:166cm byr:1986 ecl:amb +hcl:#7d3b0c iyr:2013 +pid:413769688 eyr:2024 + +hgt:159cm cid:311 +byr:1993 eyr:2028 pid:188cm ecl:oth hcl:#602927 iyr:2013 + +pid:565831038 +ecl:amb +hgt:155cm hcl:#fffffd cid:335 iyr:2016 +eyr:2029 byr:1997 + +hgt:122 +byr:2022 +eyr:2028 ecl:blu iyr:2017 pid:269710626 hcl:#b6652a + +cid:196 +byr:1953 hcl:#6b5442 iyr:2010 +pid:216121215 hgt:188cm ecl:blu + +iyr:2011 hcl:98166c hgt:62cm +byr:2028 +eyr:2024 +pid:792478385 ecl:grn + +hcl:#efcc98 iyr:2012 pid:020039675 eyr:2021 byr:1974 hgt:156cm +ecl:hzl + +cid:123 hcl:#7d3b0c +byr:2026 eyr:2004 iyr:2012 ecl:oth pid:349203133 hgt:160cm + +pid:085461475 +byr:1962 iyr:2020 hcl:#623a2f +eyr:2024 +cid:80 ecl:brn +hgt:154cm + +ecl:oth hgt:156cm iyr:2016 +hcl:#6b5442 +byr:1973 +eyr:2021 pid:539898580 + +iyr:2026 hgt:191cm +hcl:z +byr:1930 pid:#abc2f0 ecl:blu cid:242 eyr:2024 + +cid:167 +hgt:179cm +iyr:2017 eyr:2021 pid:756797571 byr:1949 ecl:brn hcl:#a97842 + +byr:1975 eyr:2030 +ecl:oth hgt:169in pid:4031206183 hcl:#733820 iyr:2017 cid:244 + +ecl:#54cfeb hgt:152cm +iyr:2026 hcl:36b4b9 +byr:2030 +pid:#fa1cb9 eyr:1964 + +byr:1974 cid:99 hcl:9e3296 +eyr:2032 +pid:686747414 +iyr:1995 +ecl:amb + +iyr:2030 ecl:oth hcl:z byr:1979 +pid:114661006 hgt:191cm eyr:1941 + +hcl:#341e13 iyr:2014 byr:1953 +pid:188326193 ecl:gry hgt:189cm cid:283 +eyr:2030 + +byr:1975 +pid:092061576 hgt:73in eyr:2023 +ecl:brn cid:227 hcl:#5e9d91 +iyr:2011 + +hcl:#7d3b0c hgt:167cm cid:141 +eyr:1957 byr:2012 ecl:gmt iyr:2019 pid:#1b7c8a + +hgt:168cm hcl:#c0946f pid:599500784 byr:1930 eyr:2023 ecl:hzl cid:113 +iyr:2013 + +eyr:2030 hcl:#b4cb4f +hgt:68in +ecl:brn byr:1923 pid:699162086 + +iyr:2013 +ecl:dne hcl:z eyr:1971 +pid:#580add byr:2020 +hgt:190cm + +hcl:#ceb3a1 +byr:1976 eyr:2020 +cid:162 iyr:2016 +hgt:168cm +ecl:hzl + +pid:050478613 hgt:59cm +iyr:2017 +ecl:grn byr:2030 hcl:#cfa07d eyr:2025 + +pid:352943968 eyr:2025 byr:1980 iyr:2014 ecl:gry hcl:#c0946f +hgt:193cm + +pid:328621931 cid:310 hgt:170cm +hcl:#733820 byr:1955 +iyr:2016 +eyr:2028 ecl:hzl + +hcl:#866857 +pid:095858739 byr:1956 +iyr:2018 hgt:193cm +ecl:hzl +eyr:2029 + +pid:70973661 eyr:2039 ecl:gry +iyr:2016 +cid:291 +hcl:#623a2f hgt:97 + +hcl:4d51a8 +eyr:1978 +ecl:gmt +byr:2029 iyr:2022 +pid:34507041 hgt:61cm + +byr:1989 ecl:brn pid:769582914 +eyr:2026 cid:218 +iyr:2020 hcl:#866857 hgt:184cm + +ecl:brn +iyr:1998 cid:227 +hgt:162in +byr:2026 +hcl:#602927 eyr:2027 pid:236998728 + +ecl:gry byr:1984 hgt:157 cid:295 +eyr:2020 +iyr:2018 hcl:#733820 +pid:037871534 + +hgt:166cm hcl:#c0946f pid:412146401 +iyr:2011 +eyr:2022 +byr:1938 +ecl:brn + +ecl:brn cid:95 byr:1981 eyr:2030 hcl:#efcc98 pid:777041035 hgt:152cm iyr:2011 + +eyr:2024 hgt:89 pid:3761913749 iyr:1939 byr:1967 hcl:a222f6 cid:165 ecl:#7fe574 + +cid:339 hgt:156cm +ecl:brn iyr:2013 byr:1951 hcl:#efcc98 eyr:2026 +pid:863566946 + +ecl:brn hcl:#6b5442 eyr:2023 +pid:787129723 byr:1949 iyr:2015 + +pid:#7f615a +cid:202 hcl:#6b5442 eyr:2028 +ecl:#a5419c +hgt:75cm +iyr:2011 +byr:2001 + +pid:864001133 +cid:236 +byr:1943 hcl:#733820 ecl:dne eyr:2025 hgt:171cm iyr:1989 + +pid:193073684 ecl:grn byr:1962 iyr:2014 +hcl:#cfa07d hgt:189cm +cid:321 eyr:2029 + +byr:1959 +hcl:#b6652a +eyr:2026 +hgt:159cm pid:815014918 iyr:2011 ecl:amb + +iyr:2017 hgt:182cm +hcl:#a97842 eyr:2023 ecl:grn pid:656177536 +byr:1973 + +eyr:1923 ecl:grn +cid:138 iyr:2020 +hgt:164cm byr:1958 hcl:#c0946f pid:783366277 + +iyr:1932 hgt:172 ecl:blu +hcl:#733820 byr:1962 pid:554221464 + +cid:169 pid:922622614 +byr:1942 hcl:#ceb3a1 hgt:169cm eyr:2024 +ecl:gry iyr:2017 + +cid:219 ecl:grn +hgt:156cm byr:1998 eyr:2021 +iyr:2017 hcl:#ceb3a1 pid:450186263 + +ecl:amb hgt:179cm pid:768428582 iyr:2010 eyr:2023 byr:1952 hcl:#fffffd + +eyr:2024 +hgt:193cm +iyr:2017 pid:469033795 byr:1979 hcl:#18171d cid:67 ecl:amb + +iyr:2016 byr:1937 pid:798267514 hgt:155cm hcl:#866857 eyr:2026 +ecl:oth + +hgt:172cm hcl:#866857 iyr:2018 pid:662186551 +byr:1996 +eyr:2025 ecl:amb + +pid:2854521962 +iyr:2021 +ecl:zzz +hcl:12f1ba eyr:2037 hgt:159cm +byr:1937 + +ecl:oth pid:488050418 byr:1927 hcl:#a97842 hgt:153cm iyr:2013 eyr:2024 + +pid:119536312 ecl:#2036ad +hcl:543178 iyr:2020 +byr:2013 +hgt:177cm +eyr:2022 + +pid:788908662 hcl:#602927 eyr:2029 +ecl:oth byr:1930 +iyr:2020 +hgt:179cm + +byr:1972 +pid:053386972 iyr:2014 ecl:grn hgt:65in hcl:#cfa07d + +pid:9828921035 ecl:blu +hcl:z hgt:152in +eyr:1949 byr:2010 + +cid:157 pid:097910554 byr:1999 +hgt:159cm hcl:#6b5442 ecl:blu eyr:2024 +iyr:2010 + +hcl:#a97842 +eyr:2040 ecl:#f8ad77 +hgt:173cm +byr:2019 iyr:2010 +pid:#d16a6e + +ecl:dne hgt:191cm iyr:2020 hcl:#b6652a +eyr:2021 pid:571971509 byr:1983 + +hcl:#18171d iyr:2016 pid:159074622 +eyr:2027 hgt:163cm byr:1954 +cid:257 + +pid:243560302 cid:58 +hcl:53a4cf byr:2012 +ecl:#fdbfb8 eyr:1920 hgt:179 iyr:2026 + +pid:040606106 eyr:2030 hgt:188cm +byr:1969 +iyr:2012 hcl:#ceb3a1 ecl:amb + +eyr:2022 +hgt:175cm hcl:#b6652a byr:1967 pid:269969031 +iyr:2018 + +hcl:#18171d cid:278 byr:1931 +pid:134809791 +eyr:2035 ecl:#44e6cd iyr:1993 + +hgt:177in +ecl:utc cid:289 +iyr:1923 +hcl:13a67a pid:3045345984 byr:2030 eyr:1944 + +pid:839901650 eyr:2030 +ecl:grn +byr:2015 iyr:2017 hgt:168 hcl:131f4e + +iyr:2015 pid:529736732 ecl:brn hgt:176cm +eyr:2026 byr:1952 hcl:#6b5442 + +hcl:#c0946f +cid:323 pid:303966428 iyr:2019 +eyr:2027 hgt:170cm +byr:2001 +ecl:brn + +pid:193678728 hgt:72in eyr:2027 iyr:2015 byr:1951 ecl:gry hcl:#18171d + +eyr:2026 cid:283 +iyr:1938 pid:687430885 +hgt:186cm +byr:1949 ecl:#521638 hcl:d13b2f + +eyr:2024 hcl:#ceb3a1 iyr:2013 ecl:brn +hgt:168cm pid:792088241 + +hcl:#888785 ecl:amb +byr:2009 iyr:2015 +hgt:151cm +eyr:2020 pid:223927808 + +byr:1926 +pid:717704850 +hcl:#623a2f eyr:2022 hgt:64in iyr:2018 ecl:gry + +eyr:2023 byr:1954 +hgt:169cm +ecl:hzl +iyr:2010 pid:116868997 hcl:#18171d + +ecl:hzl byr:1965 hcl:#a97842 iyr:2011 pid:506354451 hgt:172cm eyr:2029 + +eyr:2022 pid:994565705 +iyr:2013 ecl:brn hcl:#623a2f +byr:1979 + +iyr:2011 +byr:1931 hgt:183cm hcl:#284f26 cid:306 +ecl:amb eyr:2021 +pid:977533079 + +eyr:2027 +iyr:2011 ecl:gry +byr:1993 +pid:272334781 hgt:161cm hcl:#9a35b6 + +eyr:2026 +hcl:#602927 ecl:blu +pid:212300161 byr:1946 +cid:193 iyr:2020 hgt:157cm + +pid:538594567 byr:1976 eyr:2027 hcl:#efcc98 iyr:2011 hgt:154cm ecl:oth + +byr:1949 +hcl:z ecl:#ce67aa +eyr:1942 pid:7978941589 iyr:2025 hgt:161in + +hcl:#c0946f +cid:55 +byr:1963 ecl:blu hgt:161cm +pid:547120453 iyr:2015 eyr:2021 + +hgt:173cm eyr:2022 +iyr:2016 byr:2001 +ecl:hzl pid:239803460 + +hcl:#b6652a ecl:oth eyr:2021 hgt:167cm pid:401266644 iyr:1969 byr:1974 + +eyr:2030 pid:581963885 +hcl:#64cb23 +ecl:blu +byr:1928 hgt:181cm iyr:2018 + +pid:186338247 +ecl:hzl hgt:193cm hcl:#ceb3a1 +eyr:2022 iyr:2010 + +iyr:2015 ecl:gry hgt:159cm eyr:2027 hcl:#ceb3a1 +byr:1925 pid:715902111 cid:149 + +iyr:2018 hcl:#623a2f eyr:2020 hgt:162cm ecl:grn cid:135 +byr:1922 +pid:373216777 + +eyr:2020 pid:749899012 hcl:#888785 ecl:brn +iyr:2010 cid:225 hgt:172cm +byr:1972 + +iyr:2020 hgt:178cm ecl:grn hcl:#18171d pid:613792489 cid:240 +eyr:2028 +byr:1972 + +iyr:2015 byr:1938 eyr:2026 +cid:113 ecl:grn +pid:846231640 hgt:161cm +hcl:#b6652a + +ecl:gry +hcl:#ceb3a1 +byr:1956 cid:338 pid:936012518 +hgt:62in +eyr:2029 iyr:2016 + +pid:730866353 ecl:brn byr:1986 +iyr:2014 +hgt:190cm +eyr:2021 hcl:#a97842 cid:126 + +eyr:2021 +cid:180 pid:958310635 ecl:brn iyr:2015 hgt:189cm hcl:#efcc98 + +hgt:188cm ecl:hzl pid:179001863 iyr:2016 eyr:2029 hcl:#341e13 byr:1932 + +cid:77 eyr:2027 hcl:#623a2f iyr:2016 ecl:brn hgt:170cm +byr:1947 + +hgt:66in pid:617518313 iyr:2013 byr:1977 hcl:#b6652a ecl:brn eyr:2025 + +pid:787861420 +iyr:2014 hcl:#623a2f hgt:61in +ecl:oth cid:78 +eyr:2022 byr:1975 + +ecl:hzl +iyr:2017 eyr:2028 hcl:#602927 +byr:1958 pid:985208714 +hgt:160cm + +byr:2002 +iyr:2013 +hcl:#341e13 pid:188110633 ecl:gry hgt:169cm +eyr:2025 + +byr:1981 +eyr:2028 +hcl:#341e13 ecl:amb hgt:160cm cid:121 +iyr:2015 pid:963848397 + +iyr:2013 hcl:#866857 pid:#db8648 eyr:2021 ecl:gry +byr:1975 +hgt:153cm cid:114 + +hgt:109 +cid:287 hcl:#6b5442 +iyr:2028 byr:1926 eyr:2036 pid:2378208387 +ecl:#245a62 + +pid:857722366 +byr:1975 eyr:2027 +ecl:grn iyr:2019 hcl:#0afad1 +hgt:66in + +byr:1935 hcl:#cfa07d hgt:173cm ecl:brn eyr:2021 iyr:2019 + +cid:66 eyr:2024 hcl:#efcc98 byr:2002 iyr:2010 +hgt:176cm pid:697153153 ecl:amb + +iyr:2019 +hcl:#cfa07d ecl:blu +pid:695914972 +eyr:2024 +hgt:158cm +byr:1943 + +ecl:xry hgt:62in +pid:14733148 cid:148 +iyr:2016 byr:1925 hcl:#6b5442 +eyr:2028 + +iyr:2025 +cid:53 hgt:132 ecl:gmt hcl:159b19 +pid:156cm +byr:2025 eyr:2001 + +hcl:#623a2f ecl:oth byr:1974 iyr:2018 hgt:161cm eyr:2029 pid:6826285172 + +ecl:gry +byr:1956 hcl:#7d3b0c hgt:170cm iyr:2020 + +eyr:2020 +pid:#946a88 hgt:186cm hcl:#733820 byr:1946 ecl:#016645 iyr:2015 + +hgt:181cm hcl:#888785 iyr:2013 pid:634152817 +byr:1982 cid:245 ecl:grn eyr:2021 + +ecl:brn +pid:737531770 iyr:2010 +eyr:2020 +byr:1929 hgt:189cm hcl:#c0946f + +cid:158 iyr:2019 hcl:#341e13 eyr:2027 ecl:amb +byr:1986 pid:834976623 + +pid:976934668 cid:61 eyr:2020 iyr:2020 +hgt:76in byr:1927 ecl:amb +hcl:#e05ee3 + +pid:526042518 iyr:2019 eyr:2027 hcl:#623a2f byr:1976 ecl:amb + +pid:279367290 hcl:#a97842 hgt:158cm +eyr:2027 +byr:1959 +iyr:2020 + +ecl:xry byr:2028 +pid:357216861 hcl:#a97842 eyr:2024 hgt:66cm +iyr:2012 + +hgt:188in +ecl:lzr cid:64 eyr:1958 byr:2014 hcl:z pid:285207570 iyr:2026 + +eyr:1973 iyr:2017 ecl:oth cid:282 pid:695814158 +hcl:z + +iyr:2010 pid:661168409 +hcl:#53c696 +hgt:186cm ecl:amb +byr:1960 +eyr:2029 + +eyr:1982 hgt:169cm +iyr:2002 byr:2025 hcl:327f93 pid:831648100 + +byr:1967 ecl:oth +eyr:2021 +hcl:#602927 iyr:2014 +pid:274974402 hgt:183cm diff --git a/Day04/example b/Day04/example new file mode 100644 index 0000000..0ff208e --- /dev/null +++ b/Day04/example @@ -0,0 +1,13 @@ +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 diff --git a/aoc2020.cabal b/aoc2020.cabal new file mode 100644 index 0000000..9bcb4dc --- /dev/null +++ b/aoc2020.cabal @@ -0,0 +1,35 @@ +name: aoc2020 +version: 0.0.0.0 +synopsis: Advent of Code 2020 +description: +homepage: https://adventofcode.com/2020 +license: BSD3 +license-file: +author: Julien Moutinho +maintainer: Julien Moutinho +copyright: Julien Moutinho +category: Web +build-type: Simple +extra-source-files: +cabal-version: >=1.10 + +source-repository head + type: git + location: git://git.sourcephile.fr/julm/aoc2020 + +executable Day04 + default-language: Haskell2010 + main-is: Main.hs + hs-source-dirs: Day04 + other-modules: + default-extensions: + build-depends: + base, + bytestring, + megaparsec, + parser-combinators, + text + ghc-options: + -Wall + -Wincomplete-uni-patterns + -Wincomplete-record-updates diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..cc1e735 --- /dev/null +++ b/flake.lock @@ -0,0 +1,38 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1605370193, + "narHash": "sha256-YyMTf3URDL/otKdKgtoMChu4vfVL3vCMkRqpGifhUn0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5021eac20303a61fafe17224c087f5519baed54d", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "narHash": "sha256-HMcRJXHaLO/yhC6wAk+Sb/SJS14cEx0LE9K2dUIp5Jg=", + "path": "/nix/store/vavpklfaiwhd6gkqkip7zm6592y2fr5y-nixpkgs-patched", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..904a358 --- /dev/null +++ b/flake.nix @@ -0,0 +1,37 @@ +{ +inputs.nixpkgs.url = "flake:nixpkgs"; +inputs.flake-utils.url = "github:numtide/flake-utils"; +outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: let + pkgs = inputs.nixpkgs.legacyPackages.${system}; + ghc = null; # ghc901 + haskellPackages = + if ghc == null + then pkgs.haskellPackages + else pkgs.haskell.packages.${ghc}; + hs = haskellPackages.extend (with pkgs.haskell.lib; + packageSourceOverrides { + aoc2020 = ./.; + }); + in rec { + defaultPackage = hs.aoc2020; + devShell = hs.shellFor { + packages = p: [ p.aoc2020 ]; + withHoogle = true; + nativeBuildInputs = [ + hs.cabal-install + hs.haskell-language-server + #hs.hpc + ]; + buildInputs = [ + #hs.ghcid + #hs.ormolu + #hs.hlint + #pkgs.nixpkgs-fmt + ]; + }; + apps = { + "Day04" = { type = "app"; program = defaultPackage + "/bin/Day04"; }; + }; + } +); +} -- 2.47.0