module Part1 where import Commons import Data.Array ((!)) getDistanceToStart :: (Int, Int) -> Direction -> Grid -> Int getDistanceToStart (y, x) South grid = case grid ! (y, x) of Pipe (North, South) -> 1 + getDistanceToStart (y + 1, x) South grid Pipe (North, East) -> 1 + getDistanceToStart (y, x + 1) East grid Pipe (North, West) -> 1 + getDistanceToStart (y, x - 1) West grid Start -> 0 getDistanceToStart (y, x) West grid = case grid ! (y, x) of Pipe (East, West) -> 1 + getDistanceToStart (y, x - 1) West grid Pipe (North, East) -> 1 + getDistanceToStart (y - 1, x) North grid Pipe (South, East) -> 1 + getDistanceToStart (y + 1, x) South grid Start -> 0 getDistanceToStart (y, x) North grid = case grid ! (y, x) of Pipe (North, South) -> 1 + getDistanceToStart (y - 1, x) North grid Pipe (South, East) -> 1 + getDistanceToStart (y, x + 1) East grid Pipe (South, West) -> 1 + getDistanceToStart (y, x - 1) West grid Start -> 0 getDistanceToStart (y, x) East grid = case grid ! (y, x) of Pipe (East, West) -> 1 + getDistanceToStart (y, x + 1) East grid Pipe (North, West) -> 1 + getDistanceToStart (y - 1, x) North grid Pipe (South, West) -> 1 + getDistanceToStart (y + 1, x) South grid Start -> 0 getCycleLength :: Grid -> Int getCycleLength grid = let (dir, startCoords) = getStartDirection (getStartCoordinates grid) grid in 1 + getDistanceToStart startCoords dir grid