diff --git a/day06.hs b/day06.hs new file mode 100644 index 0000000..20550de --- /dev/null +++ b/day06.hs @@ -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)