This commit is contained in:
2023-12-06 07:50:50 +01:00
parent 0ead7dd768
commit 05de161249
5 changed files with 81 additions and 0 deletions

41
day06/Commons.hs Normal file
View File

@@ -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