Day 6
This commit is contained in:
41
day06/Commons.hs
Normal file
41
day06/Commons.hs
Normal 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
|
||||
Reference in New Issue
Block a user