25
day06.hs
Normal file
25
day06.hs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
data Race = Race {time :: Int, distance :: Int} deriving (Show)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
[_ : time', _ : distance'] <- map words . lines <$> readFile "day06.in"
|
||||||
|
|
||||||
|
let races = zipWith (\t d -> Race {time = read t, distance = read d}) time' distance'
|
||||||
|
let bigRace = Race {time = read $ concat time', distance = read $ concat distance'}
|
||||||
|
|
||||||
|
putStr "Q1: "
|
||||||
|
print . product . map race $ races
|
||||||
|
putStr "Q2: "
|
||||||
|
print $ race bigRace
|
||||||
|
|
||||||
|
-- we need (T - a) * a > D or a^2 - T*a + D < 0 i.e, a quadratic inequality
|
||||||
|
race :: Race -> Int
|
||||||
|
race Race {time, distance} =
|
||||||
|
let (x, y) = roots
|
||||||
|
in ceiling (x - 1) - floor (y + 1) + 1
|
||||||
|
where
|
||||||
|
-- roots
|
||||||
|
roots :: (Double, Double)
|
||||||
|
roots =
|
||||||
|
let disc = fromIntegral $ time * time - 4 * distance
|
||||||
|
in ((fromIntegral time + sqrt disc) / 2, (fromIntegral time - sqrt disc) / 2)
|
Reference in New Issue
Block a user