From 9dbfa20954bcc8f43d0440d68d5ddf221224887d Mon Sep 17 00:00:00 2001 From: Brian Chu Date: Fri, 23 Dec 2022 21:51:18 -0800 Subject: solution for day 12 --- solutions/day12.fs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 solutions/day12.fs (limited to 'solutions') 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 -- cgit 1.4.1-2-gfad0