@@ -43,13 +43,9 @@ instance MayFail[Option] {
43
43
44
44
type alias Beam = (Direction, Int32, Int32)
45
45
46
- def solvePart1(lines: List[String] ): Int32 = region rc {
46
+ def solveGrid(rc: Region[r], grid: Array[Array[Char, r], r], initialBeam: Beam ): Int32 \ r = {
47
47
use Direction.{Up,Down,Left,Right};
48
48
use Monad.{>>=};
49
- let grid =
50
- lines
51
- |> List.map(String.toArray(rc))
52
- |> List.toArray(rc);
53
49
let visited = MutSet.new(rc);
54
50
55
51
def moveBeam(beam: Beam): List[Beam] = {
@@ -100,8 +96,6 @@ def solvePart1(lines: List[String]): Int32 = region rc {
100
96
}
101
97
};
102
98
103
- let initialBeam = (Right, 0, 0);
104
-
105
99
def recur(beams: List[Beam]): Unit = {
106
100
match beams {
107
101
case Nil => ()
@@ -117,11 +111,47 @@ def solvePart1(lines: List[String]): Int32 = region rc {
117
111
MutSet.size(visited)
118
112
}
119
113
114
+ def solvePart1(lines: List[String]): Int32 = region rc {
115
+ lines
116
+ |> List.map(String.toArray(rc))
117
+ |> List.toArray(rc)
118
+ |> grid -> solveGrid(rc, grid, (Direction.Right, 0, 0))
119
+ }
120
+
121
+ def solvePart2(lines: List[String]): Int32 = region rc {
122
+ let grid =
123
+ lines
124
+ |> List.map(String.toArray(rc))
125
+ |> List.toArray(rc);
126
+ let width = match Array.head(grid) {
127
+ case None => bug!("empty grid")
128
+ case Some(firstRow) => Array.length(firstRow)
129
+ };
130
+ let height = Array.length(grid);
131
+ let topBeams =
132
+ List.range(0, width)
133
+ |> List.map(c -> (Direction.Down, c, 0));
134
+ let leftBeams =
135
+ List.range(0, height)
136
+ |> List.map(r -> (Direction.Right, 0, r));
137
+ let rightBeams =
138
+ List.range(0, height)
139
+ |> List.map(r -> (Direction.Left, width-1, r));
140
+ let bottomBeams =
141
+ List.range(0, width)
142
+ |> List.map(c -> (Direction.Up, c, height-1));
143
+ (topBeams ::: leftBeams ::: rightBeams ::: bottomBeams)
144
+ |> List.map(beam -> solveGrid(rc, grid, beam))
145
+ |> List.foldLeft((a, b) -> Int32.max(a, b), 0)
146
+ }
147
+
120
148
def main(): Result[String, Unit] \ IO =
121
149
use MayFail.withErrorMsg;
122
150
let fname = "input.txt";
123
151
forM (lines <- Files.readLines(fname) `withErrorMsg` "Unable to read '${fname}'")
124
152
yield {
125
153
println("Part 1:");
126
- lines |> solvePart1 |> println
154
+ lines |> solvePart1 |> println;
155
+ println("Part 2:");
156
+ lines |> solvePart2 |> println
127
157
}
0 commit comments