diff --git a/7/solution.hs b/7/solution.hs index 40d27e2..b6cbab1 100644 --- a/7/solution.hs +++ b/7/solution.hs @@ -1,22 +1,18 @@ +import Data.List import Data.List.Split +import Debug.Trace main :: IO () main = do input <- readFile "7/input.txt" - let x = parse input + let x = sort $ parse input -- Problem 1 print $ f x -- Problem 2 print $ g x where - f x = solve distance [ minimum x .. maximum x ] x - g x | length x >= 100 = solve triangle [ sum x `div` length x ] x - | otherwise = solve triangle [ minimum x .. maximum x ] x - --- NOTE for part 2 (`g`): --- Just testing against the mean value of `x` only gives accurate results if the --- sample is large enough. Here, lists of size 100 or larger are deemed "large enough", --- but that's pretty arbitrary. + f = solve distance + g = solve triangle -- | Split on comma and interpret each element as an integer parse :: String -> [Int] @@ -26,13 +22,19 @@ parse = map read . wordsBy (== ',') -- | each element is the total amount of fuel needed for each crab to reach -- | that position. solve :: (Int -> Int -> Int) -- ^ Fuel calculation to get between two points - -> [Int] -- ^ List of possible target positions -> [Int] -- ^ List of initial positions -> Int -solve f a x = minimum $ map g a +solve f x = minimum $ map g (narrow x) where g t = sum $ map (f t) x +-- | Get a slice of numbers around the mean in order to narrow the +-- | range of possible best positions to search. +narrow :: [Int] -> [Int] +narrow x = [ m - n .. m + n ] + where m = sum x `div` length x + n = 5 + -- | Calculate the fuel usage based on the triangle number of the distance -- | between the two numbers. triangle :: Int -> Int -> Int