day10: cleanup
- use elem instad of a massive chain of || - add explicit error cases
This commit is contained in:
parent
ffe10097c3
commit
832c62bef4
|
|
@ -2,18 +2,21 @@ module Day10 where
|
||||||
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.List (sort)
|
import Data.List (sort)
|
||||||
|
import Control.Monad (foldM)
|
||||||
|
|
||||||
closing :: Char -> Char
|
closing :: Char -> Char
|
||||||
closing '(' = ')'
|
closing '(' = ')'
|
||||||
closing '[' = ']'
|
closing '[' = ']'
|
||||||
closing '{' = '}'
|
closing '{' = '}'
|
||||||
closing '<' = '>'
|
closing '<' = '>'
|
||||||
|
closing _ = error "Not a bracket"
|
||||||
|
|
||||||
score :: Char -> Int
|
score :: Char -> Maybe Int
|
||||||
score ' ' = 0
|
score ')' = Just 3
|
||||||
score ')' = 3
|
score ']' = Just 57
|
||||||
score ']' = 57
|
score '}' = Just 1197
|
||||||
score '}' = 1197
|
score '>' = Just 25137
|
||||||
score '>' = 25137
|
score _ = Nothing
|
||||||
|
|
||||||
closingScore :: Char -> Int
|
closingScore :: Char -> Int
|
||||||
closingScore ')' = 1
|
closingScore ')' = 1
|
||||||
|
|
@ -28,13 +31,13 @@ calcScore xs = foldr (\char score -> score*5 + closingScore char) 0 (reverse xs)
|
||||||
getInvalidChar :: [Char] -> String -> Char
|
getInvalidChar :: [Char] -> String -> Char
|
||||||
getInvalidChar _ [] = ' '
|
getInvalidChar _ [] = ' '
|
||||||
getInvalidChar st (x:xs)
|
getInvalidChar st (x:xs)
|
||||||
| x == '(' || x == '[' || x == '{' || x == '<' = getInvalidChar (x:st) xs
|
| x `elem` "([{<" = getInvalidChar (x:st) xs
|
||||||
| otherwise = if Just x == fmap closing (listToMaybe st) then getInvalidChar (tail st) xs else x
|
| otherwise = if Just x == fmap closing (listToMaybe st) then getInvalidChar (tail st) xs else x
|
||||||
|
|
||||||
getCompletionString :: [Char] -> String -> String
|
getCompletionString :: [Char] -> String -> String
|
||||||
getCompletionString st [] = map closing st
|
getCompletionString st [] = map closing st
|
||||||
getCompletionString st (x:xs)
|
getCompletionString st (x:xs)
|
||||||
| x == '(' || x == '[' || x == '{' || x == '<' = getCompletionString (x:st) xs
|
| x `elem` "([{<" = getCompletionString (x:st) xs
|
||||||
| otherwise = if Just x == fmap closing (listToMaybe st) then getCompletionString (tail st) xs else ""
|
| otherwise = if Just x == fmap closing (listToMaybe st) then getCompletionString (tail st) xs else ""
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -43,7 +46,7 @@ main = do
|
||||||
input <- lines <$> getContents
|
input <- lines <$> getContents
|
||||||
|
|
||||||
putStr "part 1: "
|
putStr "part 1: "
|
||||||
let chars = map (score . getInvalidChar []) input
|
let chars = mapMaybe (score . getInvalidChar []) input
|
||||||
print $ sum chars
|
print $ sum chars
|
||||||
|
|
||||||
putStr "part 2: "
|
putStr "part 2: "
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue