day2
This commit is contained in:
parent
5ce1fcfad1
commit
6bb46e0b8b
2
.gitignore
vendored
2
.gitignore
vendored
@ -22,4 +22,4 @@ cabal.project.local
|
|||||||
cabal.project.local~
|
cabal.project.local~
|
||||||
.HTF/
|
.HTF/
|
||||||
.ghc.environment.*
|
.ghc.environment.*
|
||||||
|
input
|
||||||
|
@ -35,3 +35,16 @@ executable Day1
|
|||||||
, safe
|
, safe
|
||||||
hs-source-dirs: day1
|
hs-source-dirs: day1
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
executable Day2
|
||||||
|
main-is: Main.hs
|
||||||
|
|
||||||
|
-- Modules included in this executable, other than Main.
|
||||||
|
-- other-modules:
|
||||||
|
|
||||||
|
-- LANGUAGE extensions used by modules in this package.
|
||||||
|
-- other-extensions:
|
||||||
|
build-depends: base ^>=4.14.3.0
|
||||||
|
, safe
|
||||||
|
hs-source-dirs: day2
|
||||||
|
default-language: Haskell2010
|
||||||
|
2250
day1/input
2250
day1/input
File diff suppressed because it is too large
Load Diff
104
day2/Main.hs
Normal file
104
day2/Main.hs
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Data.List as L
|
||||||
|
import Data.Maybe
|
||||||
|
import Safe
|
||||||
|
|
||||||
|
data InputOptions = DoHand
|
||||||
|
| DoResult
|
||||||
|
| Quit
|
||||||
|
|
||||||
|
|
||||||
|
data RPS = Rock
|
||||||
|
| Paper
|
||||||
|
| Scissors
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
data Result = Win
|
||||||
|
| Loss
|
||||||
|
| Draw
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
getInput :: IO InputOptions
|
||||||
|
getInput = do
|
||||||
|
putStrLn "Force Hand or force Result? (h/r/q)"
|
||||||
|
getLine >>= \case
|
||||||
|
"d" -> return DoHand
|
||||||
|
"r" -> return DoResult
|
||||||
|
"q" -> return Quit
|
||||||
|
_ -> putStrLn "not understood" >> getInput
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = getInput >>= \case
|
||||||
|
Quit -> putStrLn "bye!"
|
||||||
|
DoHand -> interact $
|
||||||
|
(<>"\n")
|
||||||
|
. show
|
||||||
|
. sum
|
||||||
|
. fmap ((\(a,b) -> case play a b of
|
||||||
|
Win -> 6 + rpsScore b
|
||||||
|
Draw -> 3 + rpsScore b
|
||||||
|
Loss -> 0 + rpsScore b
|
||||||
|
)
|
||||||
|
. (\case [a,' ',b] -> (rps a,rps b); _ -> error "malformed input"))
|
||||||
|
. lines
|
||||||
|
DoResult -> interact $
|
||||||
|
(<>"\n")
|
||||||
|
. show
|
||||||
|
. sum
|
||||||
|
. fmap ((\(a,b) -> case b of
|
||||||
|
Win -> 6 + rpsScore (fixResult b a)
|
||||||
|
Draw -> 3 + rpsScore (fixResult b a)
|
||||||
|
Loss -> 0 + rpsScore (fixResult b a)
|
||||||
|
)
|
||||||
|
. (\case [a,' ',b] -> (rps a,result b); _ -> error "malformed input"))
|
||||||
|
. lines
|
||||||
|
|
||||||
|
fixResult :: Result -> RPS -> RPS
|
||||||
|
fixResult Draw a = a
|
||||||
|
fixResult Win Rock = Paper
|
||||||
|
fixResult Win Paper = Scissors
|
||||||
|
fixResult Win Scissors = Rock
|
||||||
|
fixResult Loss Rock = Scissors
|
||||||
|
fixResult Loss Paper = Rock
|
||||||
|
fixResult Loss Scissors = Paper
|
||||||
|
|
||||||
|
|
||||||
|
play :: RPS -> RPS -> Result
|
||||||
|
play Scissors Rock = Win
|
||||||
|
play Paper Scissors = Win
|
||||||
|
play Rock Paper = Win
|
||||||
|
play a b
|
||||||
|
| a == b = Draw
|
||||||
|
| otherwise = Loss
|
||||||
|
|
||||||
|
rps :: Char -> RPS
|
||||||
|
rps 'A' = Rock
|
||||||
|
rps 'B' = Paper
|
||||||
|
rps 'C' = Scissors
|
||||||
|
rps 'X' = Rock
|
||||||
|
rps 'Y' = Paper
|
||||||
|
rps 'Z' = Scissors
|
||||||
|
rps c = error $ "malformed Input: "<> show c
|
||||||
|
|
||||||
|
rpsScore :: RPS -> Int
|
||||||
|
rpsScore Rock = 1
|
||||||
|
rpsScore Paper = 2
|
||||||
|
rpsScore Scissors = 3
|
||||||
|
|
||||||
|
result :: Char -> Result
|
||||||
|
result 'X' = Loss
|
||||||
|
result 'Y' = Draw
|
||||||
|
result 'Z' = Win
|
||||||
|
result c = error $ "malformed Input: "<> show c
|
||||||
|
|
||||||
|
-- | Split a list into sublists delimited by the given element.
|
||||||
|
--
|
||||||
|
-- From: https://hackage.haskell.org/package/haskell-gi-0.26.2/docs/src/Data.GI.CodeGen.Util.html#splitOn
|
||||||
|
splitOn :: Eq a => a -> [a] -> [[a]]
|
||||||
|
splitOn x xs = go xs []
|
||||||
|
where go [] acc = [reverse acc]
|
||||||
|
go (y : ys) acc = if x == y
|
||||||
|
then reverse acc : go ys []
|
||||||
|
else go ys (y : acc)
|
Loading…
Reference in New Issue
Block a user