Two stars on day 2 as well!
This commit is contained in:
parent
def733add9
commit
22b7ebfe93
@ -32,4 +32,4 @@ executable aoc2022
|
|||||||
build-depends: base ^>=4.16.3.0
|
build-depends: base ^>=4.16.3.0
|
||||||
hs-source-dirs: app
|
hs-source-dirs: app
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
other-modules: Day1.Main
|
other-modules: Day1.Main Day2.Main
|
||||||
|
89
2022/app/Day2/Main.hs
Normal file
89
2022/app/Day2/Main.hs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
module Day2.Main (main) where
|
||||||
|
|
||||||
|
import Data.List
|
||||||
|
import Data.Tuple
|
||||||
|
import Data.Maybe
|
||||||
|
import System.IO
|
||||||
|
import Control.Monad
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
putStrLn "Day 2"
|
||||||
|
|
||||||
|
handle <- openFile "app/Day2/input" ReadMode
|
||||||
|
contents <- hGetContents handle
|
||||||
|
|
||||||
|
let r1 = part1 contents
|
||||||
|
putStrLn $ "part 1: " ++ show r1
|
||||||
|
|
||||||
|
let r2 = part2 contents
|
||||||
|
putStrLn $ "part 2: " ++ show r2
|
||||||
|
|
||||||
|
data Shape = Rock | Paper | Scissors
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Read Shape where
|
||||||
|
readsPrec _ "A" = [(Rock, "")]
|
||||||
|
readsPrec _ "B" = [(Paper, "")]
|
||||||
|
readsPrec _ "C" = [(Scissors, "")]
|
||||||
|
|
||||||
|
readsPrec _ "X" = [(Rock, "")]
|
||||||
|
readsPrec _ "Y" = [(Paper, "")]
|
||||||
|
readsPrec _ "Z" = [(Scissors, "")]
|
||||||
|
|
||||||
|
readsPrec _ _ = []
|
||||||
|
|
||||||
|
instance Enum Shape where
|
||||||
|
fromEnum Rock = 1
|
||||||
|
fromEnum Paper = 2
|
||||||
|
fromEnum Scissors = 3
|
||||||
|
|
||||||
|
toEnum _ = error "nope"
|
||||||
|
|
||||||
|
data Result = Loss | Tie | Win
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
instance Read Result where
|
||||||
|
readsPrec _ "X" = [(Loss, "")]
|
||||||
|
readsPrec _ "Y" = [(Tie, "")]
|
||||||
|
readsPrec _ "Z" = [(Win, "")]
|
||||||
|
readsPrec _ _ = []
|
||||||
|
|
||||||
|
instance Enum Result where
|
||||||
|
fromEnum Loss = 0
|
||||||
|
fromEnum Tie = 3
|
||||||
|
fromEnum Win = 6
|
||||||
|
|
||||||
|
toEnum _ = error "nope"
|
||||||
|
|
||||||
|
result :: Shape -> Shape -> Result
|
||||||
|
result a b | a == b = Tie
|
||||||
|
result Rock Paper = Loss
|
||||||
|
result Rock Scissors = Win
|
||||||
|
result Paper Rock = Win
|
||||||
|
result Paper Scissors = Loss
|
||||||
|
result Scissors Rock = Loss
|
||||||
|
result Scissors Paper = Win
|
||||||
|
|
||||||
|
parseInput :: String -> (String -> a) -> (String -> b) -> [(a, b)]
|
||||||
|
parseInput contents lhs rhs = shapes
|
||||||
|
where
|
||||||
|
rounds = lines contents
|
||||||
|
picks = map (\l -> ([l !! 0], [l !! 2])) rounds
|
||||||
|
shapes = map (\(a,b) -> (lhs a, rhs b)) picks
|
||||||
|
|
||||||
|
part1 :: String -> Int
|
||||||
|
part1 contents = sum scoresResults + sum scoresPicks
|
||||||
|
where
|
||||||
|
rounds = parseInput contents (read :: String -> Shape) (read :: String -> Shape)
|
||||||
|
scoresResults = map (fromEnum . (uncurry result) . swap) rounds
|
||||||
|
scoresPicks = map (fromEnum . snd) rounds
|
||||||
|
|
||||||
|
part2 :: String -> Int
|
||||||
|
part2 contents = sum solutions + sum outcomes
|
||||||
|
where
|
||||||
|
rounds = parseInput contents (read :: String -> Shape) (read :: String -> Result)
|
||||||
|
getResult o r = fromJust $ find (\p -> result p o == r) [Rock,Paper,Scissors]
|
||||||
|
solutions = map (fromEnum . uncurry getResult) rounds
|
||||||
|
outcomes = map (fromEnum . snd) rounds
|
||||||
|
|
2500
2022/app/Day2/input
Normal file
2500
2022/app/Day2/input
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,9 @@
|
|||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
import qualified Day1.Main as Day1
|
import qualified Day1.Main as Day1
|
||||||
|
import qualified Day2.Main as Day2
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
Day1.main
|
Day1.main
|
||||||
|
Day2.main
|
||||||
|
Loading…
Reference in New Issue
Block a user