From e984a3cc100c31462ef3248e5ff3b741221e44cd Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sat, 8 Dec 2018 00:29:03 -0600 Subject: [PATCH] Day 5, parts 1 & 2: Optimize `reacts` to only use one pass. --- Day5/Part1.hs | 15 ++++++--------- Day5/Part2.hs | 15 +++++++-------- 2 files changed, 13 insertions(+), 17 deletions(-) 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)