X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent09%2FMain.hs;h=b232293e93b10a5c6971ed1ec91e69ebf184c940;hb=c1074a1a5457ba49fc3257add6e2159309badb75;hp=9352f5de9256d523f9aca4fc9944a3b9f6185e6e;hpb=2459965153387b33710844ede8083651751dc087;p=advent-of-code-23.git diff --git a/advent09/Main.hs b/advent09/Main.hs index 9352f5d..b232293 100644 --- a/advent09/Main.hs +++ b/advent09/Main.hs @@ -2,8 +2,9 @@ import AoC import Data.List +import Prelude hiding (seq) -newtype Sequence = Sequence [[Int]] deriving (Show, Eq) +type Sequence = [[Int]] main :: IO () main = @@ -11,12 +12,12 @@ main = text <- readFile dataFileName let histories = readInput text -- print histories - let seqs = fmap (expand . Sequence . pure) histories + let seqs = fmap expand histories -- print seqs -- let seqs' = fmap extend seqs -- print seqs' print $ part1 seqs - let rseqs = fmap (expand . Sequence . pure . reverse) histories + let rseqs = fmap (expand . reverse) histories print $ part1 rseqs part1 :: [Sequence] -> Int @@ -26,20 +27,21 @@ part1 = sum . fmap (evaluate . extend) readInput :: String -> [[Int]] readInput = fmap (fmap read . words) . lines -expand :: Sequence -> Sequence -expand (Sequence xss) - | all (== 0) $ last xss = Sequence xss - | otherwise = expand $ Sequence $ xss ++ [differences $ last xss] +expand :: [Int] -> Sequence +expand seq = unfoldr go seq + where go xs + | all (== 0) xs = Nothing + | otherwise = Just (xs, differences xs) differences :: [Int] -> [Int] differences xs = zipWith (-) (tail xs) xs extend :: Sequence -> Sequence -extend (Sequence xss) = Sequence $ fst $ foldr extendRow ([], 0) xss +extend = fst . foldr extendRow ([], 0) extendRow :: [Int] -> ([[Int]], Int) -> ([[Int]], Int) extendRow row (seq, n) = ((row ++ [n']) : seq, n') where n' = last row + n evaluate :: Sequence -> Int -evaluate (Sequence xss) = last $ head xss +evaluate = last . head