From ba79aa152db1f0bab861550ad38599177b12e838 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sat, 4 Dec 2021 18:04:51 +0100 Subject: 4 --- 2021/4.hs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 2021/4.hs (limited to '2021/4.hs') diff --git a/2021/4.hs b/2021/4.hs new file mode 100644 index 0000000..bee4780 --- /dev/null +++ b/2021/4.hs @@ -0,0 +1,28 @@ +module Main where + +import Data.Foldable +import Data.List +import Data.Maybe +import Data.Ord + +import Input +import Util + + +data Board = Board [[Maybe Int]] + deriving (Show) + +main :: IO () +main = do + inp <- getInput 4 + let order = read <$> splitOn (== ',') (head inp) + boards = Board . map (map (Just . read) . words) <$> splitOn null (drop 2 inp) + won (Board l) = any (all isNothing) l || any (all isNothing) (transpose l) + cross (Board bd) n = Board (map (map (>>= \x -> if x == n then Nothing else Just x)) bd) + timetowin bd = find (won . snd) . zip [0::Int ..] $ scanl cross bd (toList order) + wins = catMaybes . toList $ timetowin <$> boards + score idx (Board l) = (toList order !! (idx - 1)) * sum (catMaybes (concat l)) + wonboard = minimumBy (comparing fst) wins + lostboard = maximumBy (comparing fst) wins + print (uncurry score wonboard) + print (uncurry score lostboard) -- cgit v1.2.3-54-g00ecf