module Part2 where import Commons import Data.Array ((!), bounds) getAreaToStart :: (Int, Int) -> (Int, Int) -> Direction -> Direction -> Grid -> Int getAreaToStart (y, x) (yMax, xMax) South sdir grid = case grid ! (y, x) of Pipe (North, South) -> xMax - x + getAreaToStart (y + 1, x) (yMax, xMax) South sdir grid Pipe (North, East) -> getAreaToStart (y, x + 1) (yMax, xMax) East sdir grid Pipe (North, West) -> xMax - x + getAreaToStart (y, x - 1) (yMax, xMax) West sdir grid Start -> if sdir == South then xMax - x else 0 getAreaToStart (y, x) (yMax, xMax) West sdir grid = case grid ! (y, x) of Pipe (East, West) -> getAreaToStart (y, x - 1) (yMax, xMax) West sdir grid Pipe (North, East) -> x - xMax - 1 + getAreaToStart (y - 1, x) (yMax, xMax) North sdir grid Pipe (South, East) -> getAreaToStart (y + 1, x) (yMax, xMax) South sdir grid Start -> 0 getAreaToStart (y, x) (yMax, xMax) North sdir grid = case grid ! (y, x) of Pipe (North, South) -> x - xMax - 1 + getAreaToStart (y - 1, x) (yMax, xMax) North sdir grid Pipe (South, East) -> x - xMax - 1 + getAreaToStart (y, x + 1) (yMax, xMax) East sdir grid Pipe (South, West) -> getAreaToStart (y, x - 1) (yMax, xMax) West sdir grid Start -> if sdir == East then x - xMax - 1 else 0 getAreaToStart (y, x) (yMax, xMax) East sdir grid = case grid ! (y, x) of Pipe (East, West) -> getAreaToStart (y, x + 1) (yMax, xMax) East sdir grid Pipe (North, West) -> getAreaToStart (y - 1, x) (yMax, xMax) North sdir grid Pipe (South, West) -> xMax - x + getAreaToStart (y + 1, x) (yMax, xMax) South sdir grid Start -> if sdir == South then xMax - x else 0 getCycleArea :: Grid -> Int getCycleArea grid = let (dir, startCoords) = getStartDirection (getStartCoordinates grid) grid ((_, _), (yMax, xMax)) = bounds grid in getAreaToStart startCoords (yMax, xMax) dir dir grid