From 1552251e0ecf7915f682464eb3e71974ec41633d Mon Sep 17 00:00:00 2001 From: tzlil Date: Sat, 2 Dec 2023 13:57:02 +0200 Subject: solved day2 --- 2/2.hs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2/2.hs (limited to '2/2.hs') diff --git a/2/2.hs b/2/2.hs new file mode 100644 index 0000000..0d1f855 --- /dev/null +++ b/2/2.hs @@ -0,0 +1,31 @@ +import Text.Parsec.String (Parser) +import Text.Parsec +import System.Environment +import Data.List +import Data.Function +import Data.Maybe +import qualified Data.Map as M +import Control.Monad + +data Color = Red | Green | Blue deriving (Eq,Ord) +type Handful = (Color, Int) +type Set = M.Map Color Int +type Game = (Int, [Set]) + +red = try $ string "red" *> pure Red +green = try $ string "green" *> pure Green +blue = try $ string "blue" *> pure Blue + +color :: Parser Color +color = red <|> green <|> blue + +handful :: Parser Handful +handful = space *> (flip (,) <$> read <$> many1 digit) <* space <*> color + +set = M.fromList <$> (sepBy handful $ string ",") +game = string "Game " *> ((,) <$> read <$> many1 digit) <* string ":" <*> sepBy set (string ";") + +solution :: Game -> Int +solution = product . M.elems . M.unionsWith max . snd + +main = head <$> getArgs >>= readFile >>= print . sum . map solution . catMaybes . map (either (const Nothing) Just . parse game "") <$> lines \ No newline at end of file -- cgit 1.4.1