diff --git a/02/Main.idr b/02/Main.idr new file mode 100644 index 0000000..733d0e9 --- /dev/null +++ b/02/Main.idr @@ -0,0 +1,68 @@ +import Data.String +import System.File.ReadWrite + +data Result = Win | Loss | Draw + +-- Score value of a result for us +scoreResult : Result -> Int +scoreResult Win = 6 +scoreResult Loss = 0 +scoreResult Draw = 3 + +data Move = Rock | Paper | Scissors + +-- Determine the Result for a pair of moves +-- First argument is their move, second argument is our move +eval : Move -> Move -> Result +eval Rock Rock = Draw +eval Rock Paper = Win +eval Rock Scissors = Loss +eval Paper Rock = Loss +eval Paper Paper = Draw +eval Paper Scissors = Win +eval Scissors Rock = Win +eval Scissors Paper = Loss +eval Scissors Scissors = Draw + +-- Score for an individual move +scoreMove : Move -> Int +scoreMove Rock = 1 +scoreMove Paper = 2 +scoreMove Scissors = 3 + +-- Parse a move from a string +parseMove : String -> Maybe Move +parseMove "A" = Just Rock +parseMove "B" = Just Paper +parseMove "C" = Just Scissors +parseMove "X" = Just Rock +parseMove "Y" = Just Paper +parseMove "Z" = Just Scissors +parseMove x = Nothing + +data Round = R Move Move + +-- Score a round +scoreRound : Round -> Int +scoreRound (R a b) = scoreMove b + scoreResult (eval a b) + +-- Parse a round from a string +parseRound : String -> Maybe Round +parseRound input = + let inputWords = words input + in case inputWords of + [a, b] => + do theirs <- parseMove a + ours <- parseMove b + Just (R theirs ours) + x => Nothing + +main: IO () +main = + do file <- readFile "input" + case file of + Right content => + let rounds = catMaybes . map parseRound . lines $ content + in do putStr "Part 1: " + printLn $ foldl (+) 0 (map scoreRound rounds) + Left err => printLn err diff --git a/02/input b/02/input new file mode 100644 index 0000000..6e0a558 --- /dev/null +++ b/02/input @@ -0,0 +1,2500 @@ +A Z +C Z +A X +B Z +C X +A X +A X +A Z +C Y +A X +C Z +C Y +B Z +B X +A X +B X +C X +C X +C Z +B Z +B Y +C X +C X +C Z +C X +C X +C X +A Y +B Y +C Y +C Z +B Y +B X +C Z +B Z +B Y +B Y +C Z +C X +C Y +B Z +B Z +A X +A X +C Z +C X +A X +B Z +C X +C X +B Z +B Z +C Z +A X +A X +A Z +C Z +C Z +C Z +A X +B Z +A X +B Y +C Z +C X +B Z +C X +C Y +B Z +A X +B Z +A Z +C X +B Z +C Z +C X +C Z +C X +C Z +C Y +C Z +C Y +C X +C Z +C Z +C Z +C Z +A X +B Z +B X +C X +C Z +C Z +A Y +C Z +C X +B Y +B Z +C Z +C X +B Z +A Z +C Z +C Z +C Z +C Z +C Z +B X +A X +B Z +B Y +B Z +C X +C Y +B Z +A X +A X +A Z +C X +C Z +B Z +C Z +C X +A X +A X +A X +C Z +B Z +A Z +C Z +C X +B Z +B Z +C X +B X +C X +C X +C X +B Z +C X +B Z +A X +A Z +A Z +C Z +C Y +C Z +B Y +C Z +C Z +C X +C X +A X +C Z +A Z +B Z +A X +C Z +C Z +B Z +A Z +C X +B Z +C Z +C X +C Y +C Y +B Y +B Z +C Y +C Z +B Z +C Z +B Z +C X +A X +B X +C Y +B Z +C Z +B X +A X +C Z +C Z +C Z +C X +B Y +A X +C Y +C Z +B X +A Z +C Z +C X +B Y +A Y +C Z +C Z +B Y +A X +A Z +B Y +C Z +B X +C Z +C Z +B X +C Z +C X +A X +C Z +A X +C X +B Z +C Y +C Z +A Z +B Z +A X +A X +C X +A Y +C Y +C X +C Z +C Z +C Z +C Z +C Z +B Y +A X +A Z +B Y +C Z +C X +C X +B Z +C X +A Z +A X +C Z +B X +B Z +A Z +B X +A X +A X +B Z +B Y +B Y +C X +C Z +C Z +C Y +C X +C Z +C Z +B X +A X +B X +C X +C X +B Z +B Z +C X +C X +B Z +B Z +A Z +B Z +B Z +C Z +A Z +A Z +C X +B Z +A X +C X +A X +C Z +A X +C Z +B X +C X +B Z +A Y +C Z +B X +C Y +C X +B Z +C Y +C Z +B X +B X +B Z +C X +C Z +B Z +C Z +C X +A X +A X +C Y +B X +A Z +B Y +C X +B Y +C Z +B Y +B Z +C Y +C Z +A Z +C X +C X +C X +C Z +A Y +A Z +C Z +C Z +B Z +B Z +B Z +A Z +C Z +C X +C Z +C Z +A X +C Z +C X +B X +C Z +C X +C Z +A X +B X +C Z +C X +B Z +C Y +A Y +A X +C X +A X +B X +C X +C Z +A Z +C Z +C Z +B Z +A X +C Z +C Z +C Z +B Z +A X +C Z +C Z +C Z +C Z +B Y +C X +B Z +C Z +B X +C Z +C X +C Y +B X +A Y +A Y +C Y +B Y +C X +B Y +C X +A X +C Z +C X +C X +B Z +C X +B Z +C Z +C Z +A X +B Y +C X +C Z +B X +C Z +C Y +B Z +A X +B Z +B Z +B X +A Z +A X +C Z +A Y +A X +A X +C Y +B Y +C X +B Y +B X +A X +C Y +A X +B Z +B Y +B Y +A X +A X +A Z +C X +A X +C Y +A X +A X +C Y +C Z +B Z +B Y +B X +A X +A X +B Z +C Z +B X +A Y +A Z +C Y +A X +C Z +C X +A Z +C Z +C Z +C Y +C X +C Z +A Z +C Y +C Z +C Z +C Z +C X +C Z +A X +C Y +B Y +C Y +B Y +A X +B Y +B Z +B Z +B X +B Z +C Z +B Z +C Z +B X +C Z +B Z +B Z +C Z +C Z +A Z +A Z +C X +B Y +B Y +C Z +C X +C Z +A Z +A X +C Y +C Z +B Z +C Z +A X +B Z +A X +A Z +A X +A X +C X +B Z +B Z +C Z +C X +A X +B X +A X +A X +A Z +C Y +B Y +B X +A X +C X +B Y +C Z +B X +C X +B Z +B Z +C Z +B Z +C Z +C Y +C Y +A X +A Z +C X +A X +C Z +A Z +B X +C X +A X +B Z +B Z +B Z +C Z +C Z +C Z +C Y +B Z +C X +C X +C X +B Z +B Z +B Z +A X +A X +A Z +C Z +C X +A X +B X +A Z +C X +A X +C Z +C Z +C Z +C Z +C Y +C Z +B Z +C X +C Z +A Z +A Z +B Z +C X +A X +A X +A X +C X +C X +C X +C X +B X +C X +B Y +C Z +C Z +C Z +B Z +B Z +C Z +B Y +C Y +C X +A Z +C Y +C Z +A X +C X +C Z +C Z +A X +C Y +B Y +C X +C Z +C X +B X +C Z +B Z +B Y +A X +C X +C Z +B Z +B X +A Z +C Y +C X +C Y +B Z +A Z +C X +C X +A X +A Y +B Y +C Y +C Z +C Z +C Z +C Y +A X +A X +B X +B Y +A Z +C Z +C Y +B Z +C Z +C X +C Z +A X +C Z +C X +C Y +C X +C X +C X +C Z +C Z +C Z +A X +C Z +C X +C X +B X +C X +B Y +A X +C X +A X +C Y +C X +C Z +C X +C Z +C X +B Z +A X +C Z +C X +C Z +C Y +C X +C X +C Z +B Z +C Z +C Z +C X +B Z +C Z +B X +C Z +B Z +C X +B X +C Z +C Y +B X +C Z +C Y +A X +B Z +B Z +C Y +B Y +B X +C Y +C X +C X +B Z +B Y +C X +C Z +B Z +C Y +C X +C Z +C Y +B Z +A Z +C Z +C Z +C Z +C Y +C Z +C Z +C Z +C X +B Z +B Z +C Z +C X +C X +C Z +C Z +C X +A Z +B Z +B X +C X +C Z +A Z +C X +C Z +B Z +A X +C Z +C Z +B Z +C Z +B Y +A X +A X +A Z +B Z +A Z +A X +B Z +C X +B Z +B Z +B Y +A X +B X +B Z +B Z +A X +C Z +B Z +C X +A X +B Z +B Z +C Z +B Y +C Z +B Z +B Y +C X +A Z +B Y +A X +A X +C X +C Z +A Z +C X +C Z +A Z +B Z +C Z +C Z +C X +C Y +C Z +A X +C X +C Z +B Y +B Z +A X +C X +B Z +C X +B Z +C Z +C Y +C Z +B Z +C X +A Z +C Z +C Z +B Z +B X +A Z +C Z +C Z +C Z +C Z +A Z +C X +B Z +C Y +B X +C Z +A X +B Y +C Z +B X +B X +C X +A Z +C X +C X +C Z +A Y +C Y +C Z +B Z +A X +B Z +C Z +A Z +C Y +B Z +B Z +C X +C Z +A Z +C X +C X +C Z +C Z +C Z +A X +C Z +A X +C Z +C X +C Z +C Z +C X +A Z +B Y +B Z +A X +C Y +C Z +B Z +B Z +A X +B Z +A Z +C Z +C Z +A X +C X +A Y +C Z +C X +C Z +B Y +C Y +B Z +B Z +A X +C Z +C Z +A Z +A X +C Z +C Z +C Y +C Z +A X +B Z +A X +B Y +C X +B Z +C X +B X +A X +B Y +A Y +C X +B Y +B Y +B Z +C Z +A Z +B Z +A X +C Z +C Z +A X +B Z +A X +A X +B Y +B Z +A Y +C Z +C X +A X +C Z +A Z +C Y +B Z +C X +C Y +B Z +B X +A X +C Z +C X +A Z +A Z +C Z +A Z +C Z +C Z +C Z +A Z +A Z +C Z +C Z +A X +B X +B Z +C X +A Y +C Z +C Z +B Z +C Z +C Z +C X +A X +A Z +C X +B Z +C X +C Z +C X +A X +B X +C X +B Z +C X +A Z +C Z +B X +C Z +B Y +A X +C Z +C X +C X +C Z +B Z +C X +C Z +A X +A X +C X +B Z +C Z +B Z +A Z +C Z +A Z +C Z +C Y +A Z +A X +B Y +A X +B X +C X +C Z +C Y +C X +C Z +C X +C X +B X +B Z +B Y +C Y +C Z +C X +C Y +C X +C X +C Z +C Y +C X +C X +C Z +C X +C Y +C Z +B X +A Y +C X +B X +A Z +C Z +C X +C Y +B X +C Z +A X +B Z +B Z +A X +A X +B Z +B Z +A Z +A X +B X +C Y +A Z +C Z +B Z +A X +B X +B Z +A X +A Z +C Y +B X +B Y +C Z +C X +A Z +C Z +C Z +C Z +B Y +B X +A Z +B Y +A X +A Z +B Z +C X +A X +C X +B Y +A Z +C X +C X +A X +A X +A X +C X +B Z +B Z +C Z +C Z +A X +B Z +C Z +B Z +C X +B Y +C Z +A X +C Z +A X +A Z +C Z +B Z +C Z +B Y +A X +C Z +B Z +C X +C Z +C Z +C Z +C Y +C X +C Y +B Y +B Z +C Z +B X +C Z +C X +A X +C Z +B Y +C Y +C Z +B Z +C X +C Z +C Z +C Z +C X +A Y +B Y +C Y +A X +A Z +C Z +B Z +C Z +B Z +A X +A X +C Z +C X +B Z +B Z +A Z +C Z +A Z +C Y +B X +C Z +A X +B Y +A X +C Z +C Z +A Z +A Z +A X +C Z +B Z +C Z +B Y +A X +C Z +B Z +B Z +A X +A X +C X +B X +B X +B Z +A Z +C Z +C X +C Y +B Z +C X +A X +C Z +C Z +C Z +C Z +B Y +C Z +B Z +C Z +B X +C Z +C X +A X +B Y +C Z +C Z +A X +B Y +B Y +B Y +B Z +A X +B Z +B Z +A X +C Z +C Z +C Z +B Z +B Z +A X +C Z +C Z +C X +C Z +C Z +C Z +C Y +A Z +C X +C Y +C X +B Z +A X +C Z +C X +A Z +A Z +C Z +B Z +B Z +C X +B Z +C X +B Z +C X +C X +B Y +C Z +C Y +B Z +C X +C Z +C X +C X +C X +A X +C Y +C X +A X +B Z +A Z +C Z +C X +C X +C Z +B Z +C X +C Z +A Z +B Z +C Z +C X +C Z +C Z +A Z +C Z +A X +C Z +A Z +C Z +A X +B Y +C X +A X +C Z +B Z +A X +B Y +A Z +C Z +C Z +B Y +A X +B Z +A X +B Z +C Z +C X +B Z +C Z +B Z +C X +B Y +B X +C Y +A Z +C Y +C X +C Y +C X +C X +A Z +B Z +A Z +A X +A X +A X +C X +C Z +A X +B X +A X +C X +B Z +C Z +C Y +A Z +C X +C Z +B Y +B Z +A X +A Z +C Z +C X +B Y +A X +B Y +C Y +A X +A Z +B Z +C Z +C Z +A Z +C Z +C X +C Y +C X +C X +C Y +A X +C Z +C X +C Z +C Z +A Z +C Z +C Z +C Y +C Z +B Y +C Z +C Z +C Z +C Z +C X +A X +C Z +C Z +C X +C Z +C X +C Z +A X +A Z +B Z +B Y +A X +C X +C Y +A X +B X +C X +C X +A Z +C X +C Y +B X +C Z +A Z +C X +A X +B Z +C Y +C Z +C X +A Y +C Z +C Y +C Z +C Z +B Z +B Z +B Z +C Z +C Z +A X +B X +A X +B Y +B Z +B Z +C X +C X +C Z +A Z +A X +B X +B Z +B Z +A X +C Z +B Z +B Z +C Z +C Z +C Z +B Z +C X +C X +B Z +C Y +B Z +C X +B X +C X +A Z +A X +C Z +C Z +B Y +A X +A Y +C Z +A Z +C X +B Y +C X +A Z +B Y +B X +C Z +C X +B Y +C Z +B Z +C X +C X +C Z +B Z +C Z +C Z +C X +C X +C Z +C X +C X +C Z +A X +C X +C X +B Z +C Z +A X +C X +C X +A Z +C Z +C Z +B Y +B Z +B X +C Z +A X +A X +B Y +C X +C X +B Y +C Z +A Z +B Y +B Y +C X +C X +C X +C X +A X +B Z +B Y +B Z +C X +C Z +B Z +B Y +C Z +B Z +A X +C X +C X +C Z +A X +C X +C X +C Z +C Y +B X +C X +C Y +B Z +C X +C Y +C Z +C Z +A Z +B X +C Z +B X +A Z +C Z +C X +C X +A Z +C X +B Z +A Z +C X +C X +B X +C Z +C X +A X +C Z +C Z +B Z +B Y +C X +C Y +C Z +C Z +A Z +C Z +C Y +C Y +A X +C Z +A X +B Z +B Z +C Z +B X +B Z +A Z +A Z +B Z +B Y +B Z +C X +B Y +B Z +A X +B X +C Y +A X +C Z +B Z +C X +A X +B X +C Y +B Z +C Z +A X +C X +B Z +C X +A Z +C X +C Z +C Z +B X +C X +A Z +C X +B Z +C Z +C Z +C X +B Z +C Z +B X +C X +C Z +B Z +B Z +A X +C X +C Z +C Z +C Z +A X +C X +C Z +B Z +C Y +C X +C X +C Z +C X +C Z +C X +C X +C Z +B Z +B Z +C Z +B Z +C Z +B X +C Z +A X +C Z +C X +C X +C Z +B Y +B Z +B Z +B Z +C Z +B X +C X +B Z +A X +C X +A X +C X +C X +A Z +B Y +B X +A X +C Z +B Y +C X +A X +B Z +B Z +C Z +B Z +C Z +A Y +A Z +C X +C Y +A Y +C X +B Y +C X +C Y +C Z +B Z +C Z +B Z +B X +C Z +B X +B X +C Z +A Z +B Z +C Z +B Z +C Z +C Z +B Z +C X +C Z +C Z +C Z +C Z +A Z +C Z +B Z +B Z +B Z +C Z +C Z +C Z +A X +B X +C Z +A X +C X +B Z +C X +C Z +B Y +C Z +C Z +A X +C Z +C X +C X +C X +B Z +C Y +C Z +B Z +A X +C X +C X +C X +C Z +A Z +A Z +B Y +B Z +B Z +C X +A X +C X +C X +A X +B X +B Z +B Z +C X +C Z +C Z +C X +B X +A X +A Z +C X +C Z +B Z +B Y +C Z +A X +B X +B Z +C Z +C Y +C Z +C X +C Z +C Z +B Z +C Y +C X +A X +B Z +C Y +A Z +C Z +B Y +A X +A Z +A X +C Z +C Y +C Z +C Y +A Z +B Z +B Z +C Z +C Z +C X +C Z +C Y +C Z +C Z +B Y +A X +B Z +C Z +C X +C X +A Z +B Z +B Z +B Y +B Z +C Y +B Z +C Z +A X +C X +C X +B X +C Z +A X +C Y +B X +C Z +C Z +B Y +C Z +B Y +C Z +A Z +C Z +B Y +A X +C X +C X +C Z +C X +C Z +B Y +B Z +C Z +B Z +C Z +A X +B Z +C X +C Y +A Z +B Z +C X +A Z +C Y +B Y +C Y +C Z +C Z +A Z +A Z +C X +B Y +C Z +B Z +A X +B Z +A X +C X +C Z +B Z +C X +B Z +C X +A Y +C Z +B Z +C X +C X +C X +B X +B Y +A Y +B Z +A X +C X +C Z +B Y +C Z +C Z +B X +B X +A Y +C X +C Z +C X +C Z +C X +C X +C Z +C Z +C X +A X +C Z +B Z +B X +A X +B X +A Z +B X +C Z +C Z +A Z +C X +C X +A X +C Z +C X +C Z +C X +C X +C Z +A Z +C Z +A Z +C Z +B Z +C Z +C Y +C X +C Z +B Z +B Z +C Y +B Y +C X +C Y +A Z +A X +A X +A Z +C X +C X +C Z +C Z +B Z +C Z +A X +C Z +C X +B Z +A X +C Z +C Z +B Z +B Z +B X +B Z +A X +C Z +B Z +A Z +C X +C X +A Z +C Y +B Y +C X +B Z +C X +C Z +B Y +A Y +B Y +A X +C Y +C X +C Z +A X +A Z +B Z +B Y +C Y +B Z +A Y +B X +C Z +C Z +C X +A X +C Z +C Y +A Z +B Z +C Z +A Z +C Y +C Z +B X +C X +A Z +C Z +B Z +A X +B Y +C X +A X +B Y +C Z +B Z +C Z +C Y +A Z +C Z +B Z +C Z +C Z +A X +C Z +C Z +A Z +C X +C Z +A X +C Z +C Z +C Z +C Y +A X +B Z +B Z +A X +C Z +B Y +C Z +A X +C Y +B Z +C Z +A X +C Y +A Z +C X +B Y +C X +B Z +C Y +A Z +C X +C X +C Y +C X +A X +B Z +C X +C X +C X +B Z +B Y +B Z +C X +B Y +C Z +A X +C Z +A Z +C Y +C X +C Z +A Z +B Z +B Z +C X +A Z +A X +C Z +B X +A X +A X +B X +C X +C X +A Z +B Z +C Z +C X +B Z +A Z +A Z +C Z +C X +B Y +C X +C X +C X +C Z +C X +A X +C X +C Y +C Z +A X +C Y +B Z +B Z +A X +C Z +B Z +B Y +C Y +C X +A Z +B Y +A X +A Z +B Z +C X +B Z +A Z +C Y +C X +C X +C Z +B X +A X +C Z +C Z +C X +B Y +C Z +A Z +C Z +C Z +B Z +C X +C X +C Z +B Z +C Z +B Y +B Z +A X +B Z +A X +B Z +B Z +C Z +A Z +A X +A X +B Y +C Z +A Y +B Z +C Z +A Z +A Y +C Z +C Z +A X +C Y +C Z +C Z +A Z +C Y +C Z +A X +B Y +C Z +A X +B X +C X +A Z +C Z +A Z +C Y +C Z +C Y +A X +C X +B Z +B X +C Z +C Z +B Z +C Z +C Y +C X +B Z +A X +C Y +B Z +A Z +C Z +C X +B X +C Z +C Z +C Z +A X +C X +B X +C Y +A X +A Z +C X +C Y +C X +C X +A Z +A Z +C X +C X +C X +A X +A X +C X +A X +A X +A X +C Z +B Z +C Y +C Z +C Z +C X +C Y +A X +B Z +C Y +B Y +A X +A X +A Z +A Z +C Y +C Y +C X +C Z +A X +A X +C Z +C Z +B Z +B Z +C Z +A X +C X +C X +C X +A Z +C Z +A Z +B Y +B Y +C X +B Z +B Z +C Z +C Z +B Z +C Y +B Z +B X +B Z +C Z +A Z +A X +C X +A Y +C Z +A X +C X +A X +B X +C X +B Z +A X +C Z +B Z +C X +B Z +C Z +C X +A X +C Z +B Z +C Z +A Z +A X +A Z +C Z +C Z +B X +C Z +A Z +B Y +C Z +B X +B Z +C X +B X +A Z +C Z +C X +A Y +A X +C X +B Z +C X +C Y +C Y +C X +C Y +C Y +B X +B Z +A X +B Y +B Z +C Z +B Z +C Z +C Z +B Z +C X +C X +B Z +B Z +C X +C X +A X +C X +B Y +B X +C Z +B Z +A X +A Z +A Y +C Z +A Z +B Z +A Z +C X +C X +A Y +C X +B Z +B Y +B Y +C Z +B X +B Z +A X +B Y +C Z +C Z +A X +B Y +A Z +C Z +C Z +B Z +A Z +C Z +B Z +C Y +C X +B Z +A Z +A X +A X +A X +C Z +A Z +A X +C Y +C Y +B Z +C Z +B Y +C X +B Z +C X +B Z +B Y +C Z +A X +A X +B Z +A Z +B Z +C Z +C Z +A X +C X +C Z +A Z +A X +C Z +C X +B Z +C Z +A Z +C Z +B X +B Z +A X +C Z +C Z +A X +C X +A Z +C Z +A X +C Z +A Z +C X +C X +B Z +C Z +C X +B X +A X +B Z +B Y +B X +C Z +B X +B Z +C X +C Z +B Z +A Z +C Z +B Z +C Z +B X +B Y +C Z +C Y +C Z +B Y +B Z +C Z +A X +C X +C X +B Z +B Z +A X +A Y +A Z +C X +B X +C Z +C X +B Z +C X +A X +A X +B Z +B Y +B Z +B Y +C Y +C Z +B Z +C Y +B Z +C X +A X +B Y +C Z +A X +A X +C X +C Z +B Z +C Y +C Z +C X +C X +C Z +C X +B Z +C Y +C Z +A X +C X +B X +A X +B X +C X +C Z +A Z +A X +A Z +A X +A X +A X +A Y +A X +B Z +B Y +A X +C Z +A Z +C X +C Z +A Z +A Y +C Z +B Z +B Z +B Z +C X +A X +A X +C Z +C X +A X +C Z +C X +A X +C Y +B Z +C Z +C X +C X +C X +C Z +C X +C Y +B Y +C X +B Y +B Z +C X +C Z +A X +B Z +C Z +C X +A Y