X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent21%2FMain.hs;h=3048dafe31fddacea739847b68029a8c7e7a4192;hb=1ab3e062eb1b3b28a8aead9834afc962ca142451;hp=f187b98718cb4b595cea00b59d7c337b27755577;hpb=8307ab6717ea4ceaff6691cbc3fc5acf70335f79;p=advent-of-code-21.git diff --git a/advent21/Main.hs b/advent21/Main.hs index f187b98..3048daf 100644 --- a/advent21/Main.hs +++ b/advent21/Main.hs @@ -1,19 +1,12 @@ --- Writeup at https://work.njae.me.uk/2021/12/23/advent-of-code-2021-day-20/ - -import Debug.Trace +-- Writeup at https://work.njae.me.uk/2021/12/26/advent-of-code-2021-day-21/ +-- import Debug.Trace import Data.Text () import qualified Data.Text.IO as TIO import Data.Attoparsec.Text hiding (take, takeWhile) import Control.Applicative --- import Control.Monad.State.Strict --- import Control.Monad.Reader --- import Control.Monad.Writer --- import Control.Monad.RWS.Strict --- import Control.Monad.Loops - import qualified Data.Map.Strict as M import Data.Map.Strict ((!)) import Data.List @@ -36,19 +29,12 @@ type Games = MS.MultiSet Game type Dice = MS.MultiSet Int type Winners = MS.MultiSet Player - instance Show Game where - show game = "{" ++ (showPlayer Player1) ++ (showActive) ++ (showPlayer Player2) ++ "}" where showPlayer p = (show $ position $ (players game) ! p) ++ "," ++ (show $ score $ (players game) ! p) showActive = if (current game) == Player1 then "<" else ">" - - --- type GameState = State Game - - main :: IO () main = do text <- TIO.readFile "data/advent21.txt" @@ -103,22 +89,16 @@ nonDetGameSimulation winThreshold games0 dice winners0 winners = MS.insertMany Player2 p2Wins $ MS.insertMany Player1 p1Wins winners0 nonDetGameStep :: Games -> Dice -> Games +-- nonDetGameStep games dice | trace ("G0 >" ++ (show games) ++ "-" ++ (show dice)) False = undefined nonDetGameStep games dice = MS.foldOccur (nonDetGameStep1 dice) MS.empty games --- nonDetGameStep games dice - -- | trace ("G0 >" ++ (show games) ++ "-" ++ (show dice)) False = undefined - -- | otherwise = MS.foldOccur (nonDetGameStep1 games) MS.empty dice nonDetGameStep1 :: Dice -> Game -> MS.Occur -> Games -> Games -nonDetGameStep1 dice game gnum acc = MS.foldOccur (nonDetGameStep2 game gnum) MS.empty dice --- nonDetGameStep1 game dice dnum acc - -- | trace ("G1 >" ++ (show game) ++ "-" ++ (show dice) ++ ": " ++ (show gnum)) False = undefined - -- | otherwise = MS.foldOccur (nonDetGameStep2 dice dnum) acc game +-- nonDetGameStep1 dice game gnum acc | trace ("G1 >" ++ (show game) ++ "-" ++ (show dice) ++ ": " ++ (show gnum)) False = undefined +nonDetGameStep1 dice game gnum acc = MS.foldOccur (nonDetGameStep2 game gnum) acc dice nonDetGameStep2 :: Game -> MS.Occur -> Int -> MS.Occur -> Games -> Games +-- nonDetGameStep2 dice dnum game gnum acc | trace ("G2 >" ++ (show game) ++ "-" ++ (show dice) ++ ": " ++ (show gnum) ++ "," ++ (show dnum)) False = undefined nonDetGameStep2 game gnum roll dnum acc = MS.insertMany game' (gnum * dnum) acc --- nonDetGameStep2 dice dnum game gnum acc - -- | trace ("G2 >" ++ (show game) ++ "-" ++ (show dice) ++ ": " ++ (show gnum) ++ "," ++ (show dnum)) False = undefined - -- | otherwise = MS.insertMany game' (gnum * dnum) acc where game' = gameStep game roll @@ -133,7 +113,7 @@ mod1 a b = ((a - 1) `mod` b) + 1 -- Parsing -playerP = ("1" *> pure Player1) <|> ("2" *> pure Player2) +playerP = (Player1 <$ "1") <|> (Player2 <$ "2") playerStateP = playerify <$> ("Player " *> playerP) <*> (" starting position: " *> decimal) where playerify name pos = (name, PlayerState {position = pos, score = 0})