Day 10
This commit is contained in:
36
day10/Part2.hs
Normal file
36
day10/Part2.hs
Normal file
@@ -0,0 +1,36 @@
|
||||
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
|
||||
Reference in New Issue
Block a user