Skip to content

Commit fcbfea6

Browse files
committed
solve day 16 part 2 in Flix
1 parent b9ca66e commit fcbfea6

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

day16/solution.flix

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,9 @@ instance MayFail[Option] {
4343

4444
type alias Beam = (Direction, Int32, Int32)
4545

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 = {
4747
use Direction.{Up,Down,Left,Right};
4848
use Monad.{>>=};
49-
let grid =
50-
lines
51-
|> List.map(String.toArray(rc))
52-
|> List.toArray(rc);
5349
let visited = MutSet.new(rc);
5450

5551
def moveBeam(beam: Beam): List[Beam] = {
@@ -100,8 +96,6 @@ def solvePart1(lines: List[String]): Int32 = region rc {
10096
}
10197
};
10298

103-
let initialBeam = (Right, 0, 0);
104-
10599
def recur(beams: List[Beam]): Unit = {
106100
match beams {
107101
case Nil => ()
@@ -117,11 +111,47 @@ def solvePart1(lines: List[String]): Int32 = region rc {
117111
MutSet.size(visited)
118112
}
119113

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+
120148
def main(): Result[String, Unit] \ IO =
121149
use MayFail.withErrorMsg;
122150
let fname = "input.txt";
123151
forM (lines <- Files.readLines(fname) `withErrorMsg` "Unable to read '${fname}'")
124152
yield {
125153
println("Part 1:");
126-
lines |> solvePart1 |> println
154+
lines |> solvePart1 |> println;
155+
println("Part 2:");
156+
lines |> solvePart2 |> println
127157
}

0 commit comments

Comments
 (0)