day3 done

This commit is contained in:
Nicole Dresselhaus 2022-12-05 00:30:20 +01:00
parent 6bb46e0b8b
commit 4ec9d323c2
3 changed files with 66 additions and 10 deletions

View File

@ -48,3 +48,17 @@ executable Day2
, safe
hs-source-dirs: day2
default-language: Haskell2010
executable Day3
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
, extra
hs-source-dirs: day3
default-language: Haskell2010

View File

@ -92,13 +92,3 @@ 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)

52
day3/Main.hs Normal file
View File

@ -0,0 +1,52 @@
{-# LANGUAGE LambdaCase #-}
module Main where
import Data.List as L
import Data.Bifunctor
import Data.Char
import Data.Maybe
import Data.List.Extra
import Safe
data InputOptions = SumPrios
| SumGroups
| Quit
getInput :: IO InputOptions
getInput = do
putStrLn "Sum Prios or Quit? (s/g/q)"
getLine >>= \case
"s" -> return SumPrios
"g" -> return SumGroups
"q" -> return Quit
_ -> putStrLn "not understood" >> getInput
main :: IO ()
main = getInput >>= \case
Quit -> putStrLn "bye!"
SumPrios -> interact $
(<>"\n")
. show
. sum
. fmap turnIntoPrios
. lines
SumGroups -> interact $
(<>"\n")
. show
. sum
. fmap turnIntoGroup
. chunksOf 3
. lines
turnIntoPrios :: String -> Integer
turnIntoPrios l = maximum . fmap toPrio . uncurry intersect . bimap sort sort . splitAt (length l `div` 2) $ l
turnIntoGroup :: [String] -> Integer
turnIntoGroup [a,b,c] = maximum . fmap toPrio $ intersect a (b `intersect` c)
toPrio :: Char -> Integer
toPrio x
| isAsciiLower x = toInteger $ ord x - ord 'a' + 1
| isAsciiUpper x = toInteger $ ord x - ord 'A' + 27
| otherwise = error "malformed input"