40 lines
1.0 KiB
Haskell
40 lines
1.0 KiB
Haskell
import Data.List
|
|
|
|
main :: IO ()
|
|
main = do
|
|
input <- map (map (subtract 48 . fromEnum)) . lines <$> readFile "input"
|
|
print $ sum $ day8 (fromEnum . any (/= 0)) walkLine1 input
|
|
print $ maximum $ day8 product walkLine2 input
|
|
|
|
walkLine2 :: Int -> [Int] -> Int
|
|
walkLine2 x (y:ys) =
|
|
1 +
|
|
if y < x
|
|
then walkLine2 x ys
|
|
else 0
|
|
walkLine2 _ [] = 0
|
|
|
|
walkLine1 :: Int -> [Int] -> Int
|
|
walkLine1 x (y:ys) =
|
|
if y < x
|
|
then walkLine1 x ys
|
|
else 0
|
|
walkLine1 _ [] = 1
|
|
|
|
checkPoint :: (Int -> [Int] -> Int) -> (Int, Int) -> [[Int]] -> [Int]
|
|
checkPoint f (x, y) field =
|
|
[f num line | line <- [lineX1, lineX2, lineY1, lineY2]]
|
|
where
|
|
num = field !! y !! x
|
|
lineX1 = drop (x + 1) $ field !! y
|
|
lineX2 = reverse $ take x $ field !! y
|
|
lineY1 = drop (y + 1) $ transpose field !! x
|
|
lineY2 = reverse $ take y $ transpose field !! x
|
|
|
|
day8 :: ([Int] -> Int) -> (Int -> [Int] -> Int) -> [[Int]] -> [Int]
|
|
day8 f1 f2 field =
|
|
[ f1 $ checkPoint f2 (x, y) field
|
|
| x <- [0 .. (subtract 1 $ length $ head field)]
|
|
, y <- [0 .. (subtract 1 $ length field)]
|
|
]
|