From 05de16124909e33364ce457e23a1afa082329187 Mon Sep 17 00:00:00 2001 From: RhiobeT Date: Wed, 6 Dec 2023 07:50:50 +0100 Subject: [PATCH] Day 6 --- advent-of-code-2023.cabal | 8 ++++++++ day06/Commons.hs | 41 +++++++++++++++++++++++++++++++++++++++ day06/Main.hs | 12 ++++++++++++ day06/Part1.hs | 7 +++++++ day06/Part2.hs | 13 +++++++++++++ 5 files changed, 81 insertions(+) create mode 100644 day06/Commons.hs create mode 100644 day06/Main.hs create mode 100644 day06/Part1.hs create mode 100644 day06/Part2.hs diff --git a/advent-of-code-2023.cabal b/advent-of-code-2023.cabal index ca694f8..2371589 100644 --- a/advent-of-code-2023.cabal +++ b/advent-of-code-2023.cabal @@ -44,3 +44,11 @@ executable day05 build-depends: base ^>=4.15.1.0, MissingH hs-source-dirs: day05 default-language: Haskell2010 + +executable day06 + main-is: Main.hs + other-modules: Commons Part1 Part2 + + build-depends: base ^>=4.15.1.0, MissingH + hs-source-dirs: day06 + default-language: Haskell2010 diff --git a/day06/Commons.hs b/day06/Commons.hs new file mode 100644 index 0000000..907d0a5 --- /dev/null +++ b/day06/Commons.hs @@ -0,0 +1,41 @@ +module Commons where + +import Data.List.Utils (split) + + +data Race = Race { time :: Int, distance :: Int } deriving Show + + +parseRaces :: [Int] -> [Int] -> [Race] +parseRaces (th: tt) (dh: dt) = Race {time = th, distance = dh}: parseRaces tt dt +parseRaces [] [] = [] + +parseTimes :: [String] -> [Int] +parseTimes (('T': _): t) = parseTimes t +parseTimes ([]: t) = parseTimes t +parseTimes (h: t) = read h: parseTimes t +parseTimes [] = [] + +parseDistances :: [String] -> [Int] +parseDistances (('D': _): t) = parseDistances t +parseDistances ([]: t) = parseDistances t +parseDistances (h: t) = read h: parseDistances t +parseDistances [] = [] + +parse :: IO [Race] +parse = do rawTimes <- getLine + let times = parseTimes $ split " " rawTimes + rawDistances <- getLine + let distances = parseDistances $ split " " rawDistances + return $ parseRaces times distances + + +getDistance :: Int -> Int -> Int +getDistance holdTime totalTime = (totalTime - holdTime) * holdTime + +getMinimalHoldTime :: Race -> Int -> Int +getMinimalHoldTime race holdTime | getDistance holdTime (time race) > distance race = holdTime + | otherwise = getMinimalHoldTime race (holdTime + 1) + +getRaceRange :: Race -> Int +getRaceRange race = time race + 1 - 2 * getMinimalHoldTime race 0 diff --git a/day06/Main.hs b/day06/Main.hs new file mode 100644 index 0000000..0245858 --- /dev/null +++ b/day06/Main.hs @@ -0,0 +1,12 @@ +module Main where + +import Commons +import qualified Part1 +import qualified Part2 + + +main = do races <- parse + let part1Res = product $ Part1.getRanges races + print part1Res + let part2Res = Part2.getRange races + print part2Res diff --git a/day06/Part1.hs b/day06/Part1.hs new file mode 100644 index 0000000..d32e5e4 --- /dev/null +++ b/day06/Part1.hs @@ -0,0 +1,7 @@ +module Part1 where + +import Commons + + +getRanges :: [Race] -> [Int] +getRanges = map getRaceRange diff --git a/day06/Part2.hs b/day06/Part2.hs new file mode 100644 index 0000000..67a3907 --- /dev/null +++ b/day06/Part2.hs @@ -0,0 +1,13 @@ +module Part2 where + +import Commons + + +getSingleRace :: [Race] -> Race +getSingleRace [race] = race +getSingleRace (rh: t) = let otherRace = getSingleRace t + in Race {time = read $ show (time rh) ++ show (time otherRace), + distance = read $ show (distance rh) ++ show (distance otherRace)} + +getRange :: [Race] -> Int +getRange = getRaceRange . getSingleRace