Solution for day 9
[?]
Jan 15, 2021, 12:17 AM
CUOTDYHN6R6ZZAH4S2JF65QP5MQ4OZWLXB5JCL4P6RHMP2QRESXACDependencies
- [2]
B527MN66Solve day 1 for 2020
Change contents
- file addition: day9.hs[2.17]
import Control.Monadimport Data.Listimport qualified Data.Set as Simport System.Environmentstretches :: Int -> [a] -> [([a],a)]stretches n l = let(i,z) = splitAt n lgo _ [] = []go p (a:r) = (p,a) : go (drop 1 p ++ [a]) rin go i zvalid p n = not $ null $ do(a:r) <- tails $ sort $ filter (< n) plet t = n - a(_,ge) <- [break (>= t) r](_:_) <- [takeWhile (== t) ge]return ()part1 :: (Num n, Ord n) => [n] -> npart1 = snd . head . filter (not . uncurry valid) . stretches 25stretchesWithSum :: (Num a, Ord a) => a -> [a] -> [[a]]stretchesWithSum t = go 0 [] wherego es e r = case es `compare` t ofLT -> case r of(h:r') -> go (es + h) (e ++ [h]) r'[] -> []EQ -> e : let(d:r') = ein go (es - d) r' rGT -> let(d:r') = ein go (es - d) r' rpart2 :: (Num n, Ord n) => [n] -> n -> npart2 l e = head $ dol'@(_:_:_) <- stretchesWithSum e lJust (MinMax a h) <- pure $ foldMap (Just . minMax) l'return (a + h)data MinMax a = MinMax a ainstance Ord a => Semigroup (MinMax a) whereMinMax l1 h1 <> MinMax l2 h2 = MinMax (min l1 l2) (max h1 h2)minMax :: a -> MinMax aminMax = join MinMaxmain :: IO ()main = do[fn] <- getArgsd <- (map (read :: String -> Integer) . words) <$> readFile fnlet p1 = part1 dprint p1print $ part2 d p1