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)]
  ]
