From 38f3a717b0f8095fb05b9be0bebd158474eb7618 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 15 Dec 2020 19:21:04 +0530 Subject: add day15 --- aoc.cabal | 6 ++++++ execs/Day14.hs | 9 +++++---- execs/Day15.hs | 21 +++++++++++++++++++++ input/15 | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 execs/Day15.hs create mode 100644 input/15 diff --git a/aoc.cabal b/aoc.cabal index ad67f92..2d1d976 100644 --- a/aoc.cabal +++ b/aoc.cabal @@ -105,3 +105,9 @@ executable Day14 build-depends: base, aoc, containers, parsec, strings default-language: Haskell2010 hs-source-dirs: execs + +executable Day15 + main-is: Day15.hs + build-depends: base, aoc, containers, split + default-language: Haskell2010 + hs-source-dirs: execs diff --git a/execs/Day14.hs b/execs/Day14.hs index d82424a..7f4368a 100644 --- a/execs/Day14.hs +++ b/execs/Day14.hs @@ -5,6 +5,7 @@ import Text.ParserCombinators.Parsec import Text.Parsec.Char import Data.Either import Data.Char +import Data.Bifunctor (bimap) import Data.Strings import Numeric (showIntAtBase, readInt) import Data.Map (Map) @@ -15,11 +16,11 @@ data Stmt = Mask String | Mem Int Int deriving Show parseMask :: Parser Stmt parseMask = string "mask = " >> Mask <$> many anyChar +parseNumber :: Parser Int +parseNumber = read <$> many1 digit + parseMem :: Parser Stmt -parseMem = do - one <- string "mem[" >> many1 digit - two <- string "] = " >> many1 digit - return $ Mem (read one) (read two) +parseMem = Mem <$ string "mem[" <*> parseNumber <* string "] = " <*> parseNumber parseLine :: Parser Stmt parseLine = try parseMask <|> parseMem diff --git a/execs/Day15.hs b/execs/Day15.hs new file mode 100644 index 0000000..cd498fb --- /dev/null +++ b/execs/Day15.hs @@ -0,0 +1,21 @@ +module Main where + +import Data.Maybe +import Data.List.Split +import qualified Data.Map as M + +run :: [Int] -> Int -> [Int] -> Int +run ls start input = fst $ foldl fn (start, startMap) ls + where startMap = M.fromList $ zip input [1..] + fn (last, seen) i = (i - last', seen') + where last' = fromMaybe i (M.lookup last seen) + seen' = M.insert last i seen + +main :: IO () +main = do + n <- map read . splitOn "," <$> readFile "input/15" + + -- holy off-by-one errors + print $ run [8..2020 - 1] 0 n + print $ run [8..30000000 - 1] 0 n + diff --git a/input/15 b/input/15 new file mode 100644 index 0000000..134afd4 --- /dev/null +++ b/input/15 @@ -0,0 +1 @@ +0,20,7,16,1,18,15 -- cgit v1.2.3