diff options
Diffstat (limited to 'solutions')
-rw-r--r-- | solutions/day12.fs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/solutions/day12.fs b/solutions/day12.fs new file mode 100644 index 0000000..d37d08a --- /dev/null +++ b/solutions/day12.fs @@ -0,0 +1,48 @@ +module Solutions.Day12 +open System.IO +open AStar + +let input = File.ReadAllLines("inputs/day12.txt") |> Array.map Array.ofSeq + +let findPoint ch = + let row = Array.findIndex (Array.contains ch) input + let col = Array.findIndex (fun x -> x = ch) input[row] + (row, col) + +let startCoord, endCoord = findPoint 'S', findPoint 'E' +input[fst startCoord][snd startCoord] <- 'a' +input[fst endCoord][snd endCoord] <- 'z' + +let height, width = input.Length, input[0].Length + +let neighbors (row, col) = + [|(row-1, col); (row+1, col); (row, col-1); (row, col+1)|] + |> Seq.filter (fun (nRow, nCol) -> nRow >= 0 && + nRow < height && + nCol >= 0 && + nCol < width && + input[nRow][nCol] <= input[row][col] + char 1) + +let gScore _ _ = 1.0 + +let fScore (x, y) (dx, dy) = + sqrt ((float dx - float x) ** 2.0 + (float dy - float y) ** 2.0) + +let getPathLength start finish = + match search start finish {neighbours = neighbors; gCost = gScore; fCost = fScore; maxIterations = None} with + | Some path -> Seq.length path - 1 + | None -> -1 + +let part1 () = + getPathLength startCoord endCoord + +let part2 () = + seq { + for row in 0 .. height - 1 do + for col in 0 .. width - 1 do + if input[row][col] = 'a' then + getPathLength (row, col) endCoord + } + |> Seq.filter (fun x -> x > 0) + |> Seq.sort + |> Seq.head |