From b4855cb88ec82b139900a89f0efc53696b2fbdee Mon Sep 17 00:00:00 2001 From: Gattix Date: Wed, 14 Dec 2022 01:47:09 +0100 Subject: [PATCH] day13 part 2 You can do it the easy way or the hard way. This is the hard way. --- 2022/day13/day13.hs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/2022/day13/day13.hs b/2022/day13/day13.hs index 25365ee..991c496 100644 --- a/2022/day13/day13.hs +++ b/2022/day13/day13.hs @@ -1,5 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} - import Data.List import Data.List.Split import Data.Maybe @@ -7,10 +5,10 @@ import qualified Data.Text as T main :: IO () main = do - input <- map lines . splitOn "\n\n" <$> readFile "input" - let toDigit = T.unpack . T.replace "10" ":" . T.pack + let toDigit = T.unpack . T.replace (T.pack "10") (T.pack ":") . T.pack + input <- map (map toDigit . lines) . splitOn "\n\n" <$> readFile "input" print $ - sum $ zipWith (*) [1 ..] $ map (fromEnum . isOrdered 0 . map toDigit) input + sum $ zipWith (*) [1 ..] $ map (fromEnum . isOrdered 0) input let divider = ["[[6]]", "[[2]]"] let sorted = sortBy mySort (divider ++ concat input) print $ product $ map (+ 1) $ mapMaybe (`elemIndex` sorted) divider @@ -24,8 +22,6 @@ isOrdered n [l:ls, r:rs] | r == ']' = l == ',' && isOrdered (pred n) [l : ls, rs] | l == '[' = r /= ']' && isOrdered (pred n) [ls, r : rs] | r == '[' = l == ']' || isOrdered (succ n) [l : ls, rs] - | l == ',' = False - | r == ',' = True | l > r = False | l < r = True | otherwise = False @@ -33,8 +29,20 @@ isOrdered _ [[], _] = True isOrdered _ [_, []] = False isOrdered _ _ = True +addBrackets :: [String] -> [String] -> [String] +addBrackets [accl,accr] [l:ls,r:rs] + | l == r = addBrackets [l:accl,r:accr] [ls,rs] + | l `elem` ['0'..':'] && r `elem` ['0' .. ':'] = addBrackets [l:accl,r:accr] [ls,rs] + | l == '[' = addBrackets [l:accl,l:accr] [ls,r:rs] + | r == '[' = addBrackets [r:accl,r:accr] [l:ls,rs] + | l == ']' = addBrackets [accl,r:accr] [l:ls,rs] + | r == ']' = addBrackets [l:accl,accr] [ls,r:rs] +addBrackets [accl,accr] ["",rs]= map reverse [accl,reverse rs ++ accr] +addBrackets [accl,accr] [ls,""] = map reverse [reverse ls ++ accl,accr] +addBrackets _ acc = map reverse acc + mySort :: String -> String -> Ordering mySort x y = - if isOrdered 0 [x, y] + if isOrdered 0 (addBrackets ["",""] [x, y]) then LT else GT