diff --git a/Makefile b/Makefile index 92e8ba4..72623ad 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -DAY = 1 +DAY = 2 DIR = day$(DAY) diff --git a/day2/input.txt b/day2/input.txt new file mode 100644 index 0000000..cc70403 --- /dev/null +++ b/day2/input.txt @@ -0,0 +1,2500 @@ +C Y +B Y +C Y +B X +B X +B X +C Y +B Z +A Z +A Z +A Z +A Y +A X +A Z +A X +A Z +C Y +A X +A Z +A Z +A Z +A Y +C Y +B Z +B Z +C Y +C Y +C Y +C Y +A X +B Z +C X +B X +A Y +C X +C Y +C Y +B X +C X +B Z +C Y +B X +C Y +B X +B X +C Y +A X +B X +B Z +B X +A Z +B Z +B X +B Y +C Y +A X +C Y +A Z +C Y +C Z +B Z +C Y +C Y +C Y +B Y +B X +B X +A X +B Z +B X +B X +B X +B X +B Y +B X +B X +B X +B X +B Z +B X +B X +B Y +B X +C Y +C Y +B Z +A Z +A X +B X +B X +A X +B X +A X +B X +A Z +B Y +A X +A Y +C Y +A X +A X +C Y +A Z +B X +B Y +C Z +C Y +B X +B X +A Z +B X +B X +C Y +A Z +A Z +B X +C X +B Z +C Y +B X +A Y +C Y +B Z +C Y +B Z +A X +C Y +C Z +B X +B X +C X +A X +B X +B Z +B Z +B Z +A Y +B Z +B X +C Y +B Z +A Z +C Y +C Y +A Z +C Y +B X +B X +C Y +B Z +B Z +C Y +A X +C Y +C Y +B X +B Y +C Y +C Y +A Z +B Z +B X +B X +C Z +C Y +A X +B Z +B Y +C Y +C Y +B X +B Z +C X +B X +C Y +B Z +A X +B X +B Z +A X +C Y +B X +B X +C Y +A X +B X +B Y +A X +A Y +C Y +C Y +B X +A Z +A X +B Y +A X +A X +C X +C Y +B Y +A Z +C X +A X +B Z +B X +B X +C Y +A X +C X +C Y +A X +C Y +B X +B X +C Y +C Y +B X +A X +B X +A X +C Y +B Y +B Z +B X +B X +C X +C Y +B Z +C Y +C Y +B X +A Z +B Z +A Z +A Z +C Y +B X +C Y +C Y +C X +B X +C X +C Z +C Y +B Z +C Z +C Y +A Z +B X +C X +B Y +B Z +C Y +B Z +B Z +B Z +A Z +C X +A Y +B Z +A Z +B Z +B Y +A Z +C Y +C Y +B X +A X +B X +C X +B Y +C Y +B Z +B X +C Y +A X +B Z +B Y +C X +C Y +B X +A Z +A Z +C Y +B Z +B Z +B X +B X +C X +B X +B X +B X +A Z +A X +C Z +B X +A Z +B X +C X +B X +C X +B Z +B X +B X +A X +B Z +B Y +A Z +A Z +C Y +C Y +A Z +A Z +B X +A X +B Z +C X +C Y +C Y +B Z +A X +B Y +B Z +A X +C Y +B Z +A X +B X +B X +C Y +C Z +A Y +A X +C Y +A Z +C X +A Z +A Z +C X +A X +A Z +B Z +A Y +A Z +C Y +B X +B X +B Z +B X +B X +B Y +B X +B X +C Y +B X +A Z +B X +C Y +A Z +B Z +C Y +C X +C Y +B X +C Y +B Y +B X +B Z +C Y +A X +A X +C X +B X +A X +C X +B Y +B Y +A Z +C Z +C Z +A X +C Y +A Y +A Z +B Z +A Z +A X +A Y +B X +B Y +C Y +A X +B Y +C X +C Y +B Z +C Y +A X +B Z +B Z +A X +C X +B X +A X +B Z +C Y +C Y +B Y +A Y +B X +B Z +B X +C Y +B X +C Y +C X +A Z +B Z +C Y +B X +B Z +B Z +B Z +C Y +C X +C X +B X +A X +C Y +C Y +B X +B Z +C Y +A X +B X +B Z +B Z +B Y +A Y +B X +B Z +B X +A X +A Z +A Z +C X +B Y +B Z +C Z +B X +C Y +B X +C Y +B Y +B Z +B Y +B X +A Z +C X +A X +A Z +C Y +B X +C Y +C Y +B X +C Z +B Z +B Z +C X +C Y +A Y +C Y +A Y +B X +B Y +A Z +B Z +B X +B X +A X +C Y +B Z +C Y +B X +A Z +B Z +C Y +B Z +A Z +C Y +B X +B X +C Y +C Y +C Y +B X +C Z +B Z +B X +C Y +C X +B X +C Y +B Y +B Z +B Z +B Y +B Z +B Y +A Z +B X +B X +A Z +C Z +A Z +B X +C Z +A X +B X +C Y +B Z +A Z +C Y +C Y +B Z +A X +C Y +A Z +B X +B Z +B Y +B X +B Z +B X +C Y +A X +B Z +C Y +B Z +B Z +C Y +B X +B X +A Y +C Y +B Z +B Z +B X +B Z +A X +A X +C Y +B X +C Y +A Z +A X +B X +C Y +B Z +A Z +B X +A X +B X +B Y +A X +C Z +A X +B Y +B X +A Y +C Y +A Z +B X +C Y +A X +B X +C Y +A Z +B Y +A Z +B Z +B X +A X +B Y +A X +A Z +B Z +B X +B Z +C Y +C Y +C Y +B X +B Y +A Z +A Z +B X +B X +B Y +A X +A Z +C Y +A Y +B Z +A X +C X +A Z +C X +C Y +C Y +B X +B X +B Z +A X +A Z +B Y +B Z +B X +B Z +B X +C Y +B X +C Y +C Y +B X +B X +C Z +C Y +A X +A Z +C Y +C Y +A X +A Z +A X +C Y +C Y +B X +A X +C Y +B X +B X +A Z +B X +A Z +A Z +C Y +C Y +B X +C Y +B X +A X +C Y +B Z +A X +C Y +B Z +A X +A Z +C Y +C Y +B X +A X +B X +B Z +A Z +C X +B Z +A X +B Z +C Y +B X +A Z +C X +B Z +A Z +A X +C Y +B X +C Y +B X +A Z +B Z +B X +C X +B Z +B Y +C Y +B Z +B Z +B Z +B Z +C Y +C Y +A Z +C Y +C Z +C Z +C Y +C Y +B Z +A Y +B X +A Y +B Z +A Z +C Z +B X +B X +C X +A Z +C Y +A Z +B X +B X +A X +B Z +B X +C X +A Z +B Y +A X +B X +A Z +A X +B Z +C Y +B X +B X +C Y +C Y +B X +A Y +C X +B X +C X +B Y +B X +C Y +C Y +B X +A Z +A Z +A Y +B Z +B Z +B Z +C Y +A X +B X +C Y +C Y +A X +C Y +A Z +B X +A X +A Y +B Z +B Y +B Y +C X +A Z +A Z +B Z +A Z +B Z +B X +A Z +B Z +B Y +B X +B X +B X +A Y +A X +B X +B X +A X +C Y +B Z +C Y +B Y +A X +B Z +A Z +C Y +A X +C Y +B X +B Z +B Z +C Y +B Z +C Y +B X +C Y +A Z +A X +B X +C Y +A X +A X +C Y +C X +C Y +A Z +B Z +A X +C X +C X +C Y +B X +C X +A X +C Y +B Y +A X +C Y +B X +A Z +C Y +C Y +A X +A X +B X +B Y +B Y +A Y +A X +C Y +A X +C X +B X +C Y +C Y +A X +A Z +B Z +B Z +C Y +B Z +B Y +A X +C X +C X +A X +C Y +B Z +A Z +B X +C Y +C Y +C X +C Y +C X +A X +C Y +B X +C X +B X +A Z +B Z +B Z +B Z +B X +B Z +B X +B Y +C Y +C X +A Y +B Z +B Y +C Y +B Z +A X +A X +A Z +C Y +A X +C X +C Y +B Y +B X +B X +A X +B Y +C Y +B X +C X +C X +A Z +A Z +C Y +B X +B Z +C Y +B Z +B Z +C Y +C X +A X +B Z +C Y +C Y +C Y +B Z +B X +C Y +B Z +A X +B X +C Y +A Z +C Y +A Z +A Z +B Z +C Y +A Z +C Y +B X +A X +A X +B Z +C Y +B Y +B X +A Z +B X +C Y +A Z +C Y +A X +A Z +B X +B X +B Y +B X +A Z +C Y +A X +C Y +C Y +C Y +C Z +C Y +A Z +A Y +B Z +C Y +B X +C Y +C Y +A Z +C Z +C Y +B X +C Y +A Z +B Z +B Y +B Z +A Z +B X +B X +C X +B X +B Z +A X +C Y +C Y +C Y +A Z +B X +B Y +A X +A Z +C Y +A Z +A Z +B X +C Y +B Z +B Z +B X +C X +A Z +C X +B Z +C Y +A Z +B X +C Y +B X +A X +C Z +C X +C Y +A Z +C Y +B X +B X +B X +B X +B X +A Y +C Y +B X +A X +A Z +A Z +A X +C Z +B Z +C Y +B X +B Z +A X +B X +B X +C Y +B X +C Y +A Z +A Z +C X +B Z +A X +C Y +B X +C Y +C Y +C Y +B X +B Y +A Z +C Y +C Y +A X +A X +C Y +B X +B Z +C Y +A X +C Z +B Z +B X +C Y +C Y +B Z +A X +A Z +B X +C Y +A Z +A X +A Y +C Y +B X +B Z +A X +B Z +B Z +C Y +C Y +C X +B Z +A X +C Y +B Y +A Z +B X +B Y +B X +C Y +A Z +B X +A Z +C Y +B X +B X +C Y +B Y +C Y +C Y +C Y +B X +A X +C Y +C Y +C Y +A Z +C Y +B X +B X +B X +B X +A X +B Y +C X +B X +C X +A X +C X +C Y +A X +A Z +C Y +B Z +B Y +A X +B Y +C Y +C Y +B X +A X +A X +C X +B Z +C Y +C Y +A Z +B Z +B Z +C X +C Y +B X +B X +B Z +A Z +C Y +C Y +A Z +A Z +B X +B X +B Y +B Z +B Z +A Y +B Z +A Z +B Z +B X +B Z +C Z +B Z +A Z +B Z +B X +B X +B X +A X +C Y +A Z +C Y +C Y +B X +A Z +C X +B Z +B Y +C Z +B X +C Y +A X +C Y +A Y +B Z +C Y +C Y +B X +B X +A Z +C X +A X +A Z +B Y +C Y +C Y +C Y +B X +C Y +C Y +A Z +B X +A Z +C X +C Y +B Z +B Z +B Z +A Z +C Y +C Z +B Z +C Y +C Y +C Y +B X +B X +C Y +C Y +B X +A X +A Z +B X +C Y +B X +A Z +C Y +C Y +B Y +A X +A X +A X +A X +B X +B Y +C Y +A Z +B Y +B Z +A X +B X +C Y +A Y +C Y +A Z +B X +B Z +B Z +A Y +B X +B X +C Y +A Z +A Z +A X +A X +B Z +C Y +B Z +C X +A Z +C Y +B Z +C Y +C Y +B Z +A Z +C Y +C X +A Z +C Y +B X +A Y +A X +B Z +A Y +A Z +B X +C X +B Z +C Y +C Y +B Y +B Z +A X +B X +A Z +C Y +C Y +A Z +A Z +B X +C Y +B Z +A X +A X +B X +B Y +C Y +B X +C X +C Y +B Z +A Z +A Y +B X +C Y +C Y +C X +A Z +C Z +B Z +B X +A Z +A X +A X +B Z +B X +A Z +B Z +C Y +A X +B Z +B Z +C Y +C Y +A X +B X +C Y +A X +B X +C Y +B X +A Z +A X +B Z +A Z +B Z +B Y +A X +B Z +A Z +A Z +A Z +A X +A X +B X +B X +A Z +B Y +A Y +C Y +B X +C Y +B Y +C Y +A Z +A Z +B X +B X +C Y +B Z +C Y +B Z +B X +B X +B X +B X +A X +B Y +B X +C X +A Z +A Z +B X +C Y +C Y +C Y +A X +C Y +C Y +C Y +A X +C Y +C X +B X +A Y +C Z +C Y +A Z +B X +A Z +A X +B X +A X +A X +C Y +A Y +A X +B X +A Z +B Z +B Y +C Z +B X +A Z +C Y +B Z +B X +C Y +C Y +C Y +B X +A X +A Z +B X +A X +C Y +B Z +A X +C Y +C Y +A X +A X +A X +A Y +C Y +C Y +C Y +C Z +C Y +A X +B X +C Y +C Y +C Y +C Y +A X +B Z +A X +B X +C Y +B Z +A Z +C Y +A Z +C Y +B X +B X +C Y +C Y +B Y +A X +C Y +C X +C Y +C X +A Z +A Z +B Y +A X +A X +B Z +A Z +A X +A Z +C Y +A X +B Z +C X +A X +A X +B X +A X +B Y +A X +B X +B X +C Y +C X +B X +B Y +C X +A Z +B Z +B X +C Y +B Y +B Z +C Y +A X +C Y +B X +B X +C Y +C Z +B X +B X +C X +B Y +B Y +B Z +C X +B X +C Y +B X +C Y +B X +A X +A Y +B X +B X +B X +B Y +C Y +B X +B X +B X +C Y +A Z +B Z +B X +A Z +B X +B Y +C X +A Z +C Y +C Y +B Z +B X +C Y +C Y +C Y +C Y +B Z +A X +C Y +C Y +A Z +B X +B Z +A Y +C Y +B X +C Z +A Z +B Y +A Y +A Z +A Z +B X +B X +C X +A Z +B Z +A X +B Z +A Z +B X +B X +C Y +B Z +C Y +A Z +B Z +B X +A Z +C Y +B X +B Y +B Z +C Y +B X +C Y +B X +A X +A X +C Y +B X +B X +A Y +A Z +A Z +B Z +A Z +C Y +C Y +A Z +A X +A Z +B X +C Y +C X +A Z +A X +B Z +B Z +A X +B X +C X +C Y +C Y +B Z +B X +C Y +C Z +B Y +C Y +A Z +B Z +B Z +B X +B X +C Y +B X +B X +C X +A X +B Z +C Y +B Y +B X +A Z +B Z +B X +A Z +B Z +B X +A Z +B X +C Y +C X +B Y +B Y +B Z +C Y +A X +B Z +B Y +C Y +A X +B Z +B Z +C X +B X +C Y +C Y +C Y +C Y +A Z +A Z +B X +B X +C Z +B X +B Z +B X +B Z +A Z +B X +C Y +B X +C Y +C Y +A X +B X +A X +C X +B X +B Y +A X +B Z +A Z +B Y +B Z +C Y +B Z +C Y +B X +B Z +B Y +B X +B X +A Z +B Z +B X +A Z +C Y +C Y +A Z +A X +C Z +A X +B Z +B Z +C Y +B X +B X +A Y +B Z +C X +C Y +C Y +C Y +A Y +A X +B X +B Z +A Z +B X +C X +C X +C Y +C Y +C Y +B X +B X +A Z +B Z +B X +A X +A Z +C Z +B Z +B Z +B X +A X +B X +C Y +B Z +A X +B Y +B Z +B Y +B X +A X +B Z +C Y +C X +C Y +A Z +B Z +B X +B Z +B X +A Y +B X +A Z +B X +C X +A X +C Y +B X +C Y +C Y +A Y +C Z +A Z +C X +B X +C Y +A Z +B X +B Z +B Z +C Y +A X +A Z +B X +B X +B Z +B X +C Y +B X +A X +A X +C Y +A Z +C Y +B Y +B Z +B Z +C Y +B Z +C Y +B X +B X +B Y +C Y +A X +A Z +A Z +A X +C Y +B X +B Y +B Y +B X +A X +A Y +B Y +B Y +C Y +A X +B Z +C Y +A Z +C Y +B Y +A X +B X +A X +B X +A Z +C Y +C Y +A X +B Y +B Y +B X +A Z +A Z +A Z +A Y +B Z +C X +B X +C Y +C Z +B Y +C Y +C X +B X +B Z +B Z +B Z +B Z +B Y +B Z +A Z +C X +B X +C Y +C Y +B Z +C Y +C Y +A X +C X +A X +B Z +C Y +B X +C Y +A X +A Z +C Z +A X +B Z +C Y +C Y +C Y +A X +C Y +C Y +B X +B X +B Y +C Y +B Z +B X +C Y +A Z +C X +A Z +C Y +A Z +A X +B Z +B X +C Z +B X +C Y +A Z +C Y +B X +B X +B X +B Z +C Y +B X +A Z +A Z +C Y +B Y +C Y +B Z +A Z +A X +B Z +B X +B X +A Y +B X +B X +C Y +B X +B X +B Z +C Y +B X +A X +A Z +A Z +C X +A X +A X +B X +B X +B Z +A X +C Y +B X +C Y +C Y +A X +B X +A X +A Z +A Z +C Y +B X +C Y +B Y +B X +B X +C X +B X +A X +C X +B Z +C Y +B Z +B X +C Y +C Y +A Z +C Y +B Z +B X +A Z +C Y +C Y +B X +B Z +A X +B X +C Y +C Y +C Y +A X +A X +A X +B Z +B Z +A X +A X +B X +B Z +C Y +C Y +B Z +A Z +C Y +C Y +A Z +B Z +C Y +B X +B X +B X +C Y +C Y +B Z +C Y +B Z +A X +A X +B X +C Y +A X +A X +C X +A Y +C X +B X +B X +B Z +B Z +B Z +B X +B Z +C Y +C Y +C X +A Z +B X +A X +B Z +B X +A Z +C Y +B X +B Y +B Z +A Z +B X +A Y +C X +B X +C Z +C Y +B Z +A X +B Z +B Z +A X +B Z +B X +C Y +B Z +C X +C Y +A Z +C Y +A Y +B Z +B X +B Y +A Z +A Y +A X +B Y +A Z +B Z +C Y +C Y +C X +C Y +C Y +B X +B Z +A Z +B Z +B Z +A Z +C Y +A Z +C X +C Y +C Y +C Y +A X +C Y +B Z +A X +C Y +C Y +C Y +B X +B Z +B Y +C Y +C Y +C Y +C Y +B Y +A Y +B Z +B X +A X +A Y +C Y +C X +B X +B Z +A Z +B Z +B X +A X +C Z +C X +B Z +C Y +A X +C X +B Z +B X +B X +A Z +B X +B Z +B Y +C Y +B X +A X +B X +B Z +A X +B Z +A Y +C Y +A X +C X +B X +B Y +B Z +B X +B X +C Y +B X +B X +C Y +B Y +B Z +B Y +B Z +C Y +A Z +C Y +A Z +B X +B X +A Z +B X +C Y +C X +C Y +B Y +C Y +C Y +C Z +C Y +A Y +C Y +B X +B Z +A Y +B Z +A Z +B Z +B Z +B X +B Y +C Y +B X +C Y +C Z +C Y +A X +B X +B X +C Z +A Z +B X +A Z +C Y +B Z +B Z +B Y +A Z +B Z +C Y +C Y +A Z +C Y +B Y +C Y +B Z +C X +B Z +B X +A Z +B Y +B Y +B Z +A Z +B Z +C X +C X +B Z +B X +C Y +B X +A X +B X +B X +B Z +C Y +A Z +A Y +B Z +C Y +A X +A X +A Y +B X +B Z +A X +B X +C X +B X +B Y +B X +A Z +C Y +A X +C Y +A X +C Y +C Y +B Y +C Y +B X +C Y +C Y +B X +B Z +A X +C Y +C X +C X +C Y +B Y +A Z +C Y +A X +A X +B X +B X +A X +B X +C X +B Z +B X +A X +A Z +B X +C Y +C Y +A X +C X +B Z +B Z +B X +C Y +C Y +A Z +C X +B Z +C Y +B Y +A Z +B Z +A Z +B X +C X +C Z +C Y +A Z +B Z +B X +C Y +C Y +C X +C Y +C Y +C Y +A X +A Z +C Y +B X +B X +B Z +A Z +C Y +B X +A Z +C Y +C Y +B Z +A X +B Z +B Z +B X +B Z +B X +B X +B Z +B Z +C Y +A X +A X +A Z +C Y +C Y +B X +B Z +C Z +B X +C Z +C Y +C X +C Y +B Y +A X +B Z +A Z +C X +B X +C X +A Z +A Y +B Z +A X +A X +A Z +A Z +B Y +B Z +C Y +B X +C Y +B Z +B X +C Y +C Y +A X +A Z +B X +C Y +B X +B X +A X +A Z +B X +B X +B Z +A X +A X +B Z +B X +B X +B X +A Z +C X +B X +B X +B X +B Z +B X +C X +C Y +A Z +C X +A Z +C Y +A X +C Y +A X +B X +A Z +B X +C Y +C Y +A Z +A Z +B Z +B Z +B X +C X +A X +B Y +B Z +C Y +B Z +A X +A X +B X +A X +A X +A X +A X +B Z +B Y +C Y +A Z +C Z +C Y +A X +B Y +C X +A Z +B X +B Z +A X +A X +C Y +B X +B X +A X +A Z +C Y +C Y +A Z +C Y +B X +B X +A Z +A Y +C Y +A Z +A X +C Y +B Z +B Z +C Y +B X +C Y +C Y +C Y +C Z +B X +C Y +C X +B Z +A Z +C Y +A Z +B Z +A Z +B X +A X +A Z +B Z +B Z +A X +B Z +A X +B X +A Z +B X +B X +A Z +C Y +B X +B Z +C Y +B Z +B Z +B X +B Z +B X +B X +C Y +B X +B Y +B X +B X +A Z +B X +C Y +B X +B X +B X +B Z +A Z +B Y +B X +B Z +C X +C Y +B X +B Y +C Y +B X +C X +B X +C X +B Z +A Y +A Z +B Z +B Z +A X +A Z +B Z +B X +A Z +B Z +C Y +C Z +C Y +A Z +C Z +A Z +C Z +C Y +A Z +A Y +C Y diff --git a/day2/main.hs b/day2/main.hs new file mode 100644 index 0000000..15e6d4d --- /dev/null +++ b/day2/main.hs @@ -0,0 +1,72 @@ +import System.IO + +data Part = P1 | P2 + + + + +data Shape = Rock | Paper | Scissors deriving (Eq, Show) + + +shape :: Char -> Shape +shape 'A' = Rock +shape 'B' = Paper +shape 'C' = Scissors +shape 'X' = Rock +shape 'Y' = Paper +shape 'Z' = Scissors + + +opShp :: String -> Shape +opShp = shape . head + +beats = [(Rock, Scissors),(Scissors, Paper),(Paper, Rock)] + +myShp2 :: Char -> Shape -> Shape +myShp2 'X' o = snd $ head $ filter ((== o) . fst) beats +myShp2 'Y' o = o +myShp2 'Z' o = fst $ head $ filter ((== o) . snd) beats + +myShp :: Part -> String -> Shape +myShp P1 g = shape $ last g +myShp P2 g = myShp2 (last g) (opShp g) + + +shapeScore :: Shape -> Int +shapeScore Rock = 1 +shapeScore Paper = 2 +shapeScore Scissors = 3 + + +instance Ord Shape where + Rock `compare` Scissors = GT + Scissors `compare` Rock = LT + s1 `compare` s2 = (shapeScore s1) `compare` (shapeScore s2) + + + + +winScore :: (Shape, Shape) -> Int +winScore (me, op) + | me < op = 0 + | me == op = 3 + | me > op = 6 + + + + +gameScore :: Part -> String -> Int +gameScore p s = shapeScore me + winScore (me, op) + where me = myShp p s + op = opShp s + + + + +handler :: String -> String +handler s = (show $ sum $ map (gameScore P1) $ lines s) ++ "\n" ++ + (show $ sum $ map (gameScore P2) $ lines s) ++ "\n" + +main :: IO () +main = do + interact handler