feat: complete day 3

main
sgoudham 2 years ago
parent 313225e083
commit ba9b283d11
Signed by: hammy
GPG Key ID: 44E818FD5457EEA4

@ -11,7 +11,7 @@ build-type: Simple
common common
default-language: GHC2021
ghc-options: -Wall
default-extensions: RecordWildCards
default-extensions: RecordWildCards, OverloadedStrings
executable runner
import: common

@ -1,16 +1,39 @@
module Days.Day03 (day03) where
module Days.Day03 (day03, splitInto, commonItem) where
import AOC (Solution (..))
import qualified Data.Text as T
import Data.List
import Data.Maybe
import Debug.Trace
day03 :: Solution
day03 = Solution parseInput part1 part2
parseInput :: T.Text -> a
parseInput = error "parseInput not defined for day 03"
parseInput :: T.Text -> [[String]]
parseInput input = go [] allLines
where
go acc [] = reverse acc
go acc xs = go (take 3 xs : acc) (drop 3 xs)
allLines = map T.unpack $ T.lines input
part1 :: a -> Int
part1 = error "part1 not defined for day 03"
priority :: Char -> Int
priority = (+1) . fromJust . flip elemIndex (['a'..'z'] ++ ['A'..'Z'])
part2 :: a -> Int
part2 = error "part2 not defined for day 03"
splitInto :: Int -> [a] -> [[a]]
splitInto s xs = go [] xs
where
go acc [] = reverse acc
go acc xs' = go (take takeInt xs' : acc) (drop takeInt xs')
takeInt = round $ (fromIntegral $ length xs) / (fromIntegral s)
commonItem :: Eq a => [[a]] -> [a]
commonItem [] = []
commonItem xs = foldl1' intersect xs
part1 :: [[String]] -> Int
part1 input = sum $ map (priority . head . commonItem . splitInto 2) (concat input)
part2 :: [[String]] -> Int
part2 input = sum $ map (priority . head . commonItem) input
-- part2 input = sum $ map (sum . map (priority . head . commonItem . splitInto 2)) (traceShowId input)
-- part2 input = traceShowId input

Loading…
Cancel
Save