Day 23
This commit is contained in:
32
day23/Commons.hs
Normal file
32
day23/Commons.hs
Normal file
@@ -0,0 +1,32 @@
|
||||
module Commons where
|
||||
|
||||
import GHC.IO.Handle (isEOF)
|
||||
import Data.Array (Array, listArray, (!), Ix (inRange), bounds)
|
||||
|
||||
|
||||
data Direction = North | South | West | East deriving (Eq, Ord, Show)
|
||||
data Tile = Empty | Rock | Slope { direction :: Direction } deriving (Eq, Show)
|
||||
type Trails = Array (Int, Int) Tile
|
||||
|
||||
|
||||
parseLine :: String -> [Tile]
|
||||
parseLine = map (\case
|
||||
'.' -> Empty
|
||||
'#' -> Rock
|
||||
'>' -> Slope {direction = East}
|
||||
'v' -> Slope {direction = South}
|
||||
'<' -> Slope {direction = West}
|
||||
'^' -> Slope {direction = North})
|
||||
|
||||
parseTrails :: IO [[Tile]]
|
||||
parseTrails = do done <- isEOF
|
||||
if done
|
||||
then return []
|
||||
else do line <- getLine
|
||||
let trailsLine = parseLine line
|
||||
trails <- parseTrails
|
||||
return (trailsLine: trails)
|
||||
|
||||
parse :: IO Trails
|
||||
parse = do trails <- parseTrails
|
||||
return $ listArray ((1, 1), (length trails, length $ head trails)) $ concat trails
|
||||
Reference in New Issue
Block a user