summaryrefslogtreecommitdiff
path: root/Day8/app
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2022-12-21 00:05:25 +0100
committerAndreas Grois <andi@grois.info>2022-12-21 00:05:25 +0100
commit7e0c66b8f6f142420041972620f3795c83a4c22f (patch)
tree0e7421c0f109545a40396f43020710cba5f550ea /Day8/app
parent50850c8d2f94ad346c681b42952f6978a0f6d0ef (diff)
Day8 partial input parsing.
Diffstat (limited to 'Day8/app')
-rw-r--r--Day8/app/Main.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/Day8/app/Main.hs b/Day8/app/Main.hs
new file mode 100644
index 0000000..fc36d66
--- /dev/null
+++ b/Day8/app/Main.hs
@@ -0,0 +1,41 @@
+module Main (main) where
+
+import System.Environment ( getArgs )
+
+main :: IO ()
+main = getArgs >>= readFile . head >>= print . solveDay8
+
+solveDay8 :: String -> String
+solveDay8 = formatDay8Result . fmap solveDay8Parts . parseDay8Input
+
+formatDay8Result :: Maybe (Int, Int) -> String
+formatDay8Result Nothing = "Input didn't parse. Check that it is a rectangular grid with values from 0-9."
+formatDay8Result (Just (p1, p2)) = "Part 1: " ++ show p1 ++ ", Part 2: " ++ show p2
+
+newtype Day8Input = Day8Input [[Height]] -- but with guarantee that it's rectangular
+
+data Height = Zero | One | Two | Three | Four | Five | Six | Seven | Eight | Nine
+ deriving (Eq, Ord)
+
+heightFromChar :: Char -> Maybe Height -- this could also be done using the Enum typeclass' toEnum function and an intermediate Int
+heightFromChar '0' = Just Zero
+heightFromChar '1' = Just One
+heightFromChar '2' = Just Two
+heightFromChar '3' = Just Three
+heightFromChar '4' = Just Four
+heightFromChar '5' = Just Five
+heightFromChar '6' = Just Six
+heightFromChar '7' = Just Seven
+heightFromChar '8' = Just Eight
+heightFromChar '9' = Just Nine
+heightFromChar _ = Nothing
+
+validateDay8Input :: [[Height]] -> Maybe Day8Input
+validateDay8Input [] = Nothing
+validateDay8Input (h:hs) = if all ((== length h) . length) hs then Just $ Day8Input $ h:hs else Nothing
+
+parseDay8Input :: String -> Maybe Day8Input
+parseDay8Input = (=<<) validateDay8Input . mapM (mapM heightFromChar) . lines
+
+solveDay8Parts :: Day8Input -> (Int, Int)
+solveDay8Parts = undefined \ No newline at end of file