diff --git a/Day5/Part1.hs b/Day5/Part1.hs index 7db9a27..148a459 100755 --- a/Day5/Part1.hs +++ b/Day5/Part1.hs @@ -1,21 +1,18 @@ #! /usr/bin/env stack -- stack --resolver lts-12.20 --install-ghc script -{-# LANGUAGE FlexibleContexts, LambdaCase #-} +{-# LANGUAGE ViewPatterns #-} module Main where -import Data.Function (fix) import qualified Data.Char as C import qualified Data.List as L main :: IO () -main = interact $ show . react . takeWhile C.isAlpha +main = interact $ show . length . react . takeWhile C.isAlpha -react input = - let scan (x:y:zs) = if x `reactsWith` y then scan zs else (x : scan (y:zs)) - scan zs = zs - input' = scan input - result = (input', length input') - in if input' == input then result else react input' +react [] = [] +react (x:(react -> ys)) + | (y:ys') <- ys, x `reactsWith` y = ys' + | otherwise = x:ys x `reactsWith` y = (C.isUpper x && C.toLower x == y) || (C.isLower x && C.toUpper x == y) diff --git a/Day5/Part2.hs b/Day5/Part2.hs index e68b242..479a2fa 100755 --- a/Day5/Part2.hs +++ b/Day5/Part2.hs @@ -1,6 +1,6 @@ #! /usr/bin/env stack -- stack --resolver lts-12.20 --install-ghc script -{-# LANGUAGE FlexibleContexts, LambdaCase #-} +{-# LANGUAGE ViewPatterns #-} module Main where import Data.Function (fix, on) @@ -9,16 +9,15 @@ import qualified Data.List as L main :: IO () main = interact $ \input -> show $ L.minimumBy (compare `on` snd) $ - [ react $ filter (\c -> C.isAlpha c && c /= r && c /= C.toUpper r) input + [ let rs = react input' in ((rs, r), length rs) | r <- ['a'..'z'] + , let input' = [ c | c <- input, C.isAlpha c, c /= r, c /= C.toUpper r ] ] -react input = - let scan (x:y:zs) = if x `reactsWith` y then scan zs else (x : scan (y:zs)) - scan zs = zs - input' = scan input - result = (input', length input') - in if input' == input then result else react input' +react [] = [] +react (x:(react -> ys)) + | (y:ys') <- ys, x `reactsWith` y = ys' + | otherwise = x:ys x `reactsWith` y = (C.isUpper x && C.toLower x == y) || (C.isLower x && C.toUpper x == y)