Skip to content

Commit 8e255ea

Browse files
committed
day 15 part 2
1 parent 259bc4f commit 8e255ea

2 files changed

Lines changed: 39 additions & 20 deletions

File tree

2021/elixir/lib/advent_of_code/day_15.ex

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,31 @@ defmodule AdventOfCode.Day15 do
33
nodes = parse(args)
44
|> Map.update({0,0}, nil, fn {v, dist} -> {v, 0} end)
55

6-
target = get_target(nodes)
6+
target = Map.keys(nodes) |> Enum.max()
77

88
dijkstra(Map.delete(nodes, {0,0}), {{0,0}, nodes[{0,0}]}, target)
99
end
1010

11-
def get_target(nodes) do
12-
{{max_r, _}, _} = Enum.max_by(nodes, fn {{r, _c}, _} -> r end)
13-
{{_, max_c}, _} = Enum.max_by(nodes, fn {{_r, c}, _} -> c end)
14-
15-
{max_r, max_c}
16-
end
17-
1811
def dijkstra(_unvisited, {{r, c}, {_, distance}}, {r, c}), do: distance
1912

2013
def dijkstra(unvisited, {coord, {label, distance}}, target) do
14+
IO.puts(Enum.count(unvisited))
2115
neighbors = get_neighbors(unvisited, coord)
22-
|> Map.map(fn {_, {v, d}} ->
23-
{v, min(distance + v, d)}
16+
|> Map.map(fn
17+
{_, {v, :infinity}} ->
18+
{v, distance + v}
19+
{_, {v, d}} ->
20+
{v, min(distance + v, d)}
2421
end)
2522

2623
updated_unvisited = update_distances(unvisited, neighbors)
2724

28-
next = Enum.min_by(updated_unvisited, fn {_, {_, d}}
29-
-> d
30-
end)
25+
next = Enum.reject(updated_unvisited, fn
26+
{_, {_, :infinity}} ->
27+
true
28+
_ -> false
29+
end)
30+
|> Enum.min_by(fn {_, {_, d}} -> d end)
3131

3232
dijkstra(Map.delete(updated_unvisited, coord), next, target)
3333
end
@@ -47,6 +47,16 @@ defmodule AdventOfCode.Day15 do
4747
end
4848

4949
def part2(args) do
50+
initial = parse(args)
51+
52+
{max_row, max_col} = target = Map.keys(initial) |> Enum.max()
53+
54+
nodes = expand_board(initial, {max_row + 1, max_row + 1})
55+
|> Map.update({0,0}, nil, fn {v, dist} -> {v, 0} end)
56+
57+
new_target = Map.keys(nodes) |> Enum.max()
58+
59+
dijkstra(Map.delete(nodes, {0,0}), {{0,0}, nodes[{0,0}]}, new_target)
5060
end
5161

5262
def expand_board(board, {max_row, max_col}) do

2021/elixir/test/advent_of_code/day_15_test.exs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ defmodule AdventOfCode.Day15Test do
6060
assert String.trim(result) == String.trim(expected)
6161
end
6262

63-
# @tag :skip
64-
test "big board 1" do
63+
test "small board expansion" do
6564
input = """
6665
234
6766
456
@@ -91,8 +90,7 @@ defmodule AdventOfCode.Day15Test do
9190
assert String.trim(result) == String.trim(expected)
9291
end
9392

94-
# @tag :skip
95-
test "big board 2" do
93+
test "sample board expansion" do
9694
input = """
9795
1163751742
9896
1381373672
@@ -159,17 +157,28 @@ defmodule AdventOfCode.Day15Test do
159157
67554889357866599146897761125791887223681299833479
160158
"""
161159

160+
162161
expanded = parse(input) |> expand_board({10,10})
163162

164163
result = capture_io(fn -> show_grid(expanded) end)
165164
assert String.trim(result) == String.trim(expected)
166165
end
167166

168-
@tag :skip
169167
test "part2" do
170-
input = nil
168+
input = """
169+
1163751742
170+
1381373672
171+
2136511328
172+
3694931569
173+
7463417111
174+
1319128137
175+
1359912421
176+
3125421639
177+
1293138521
178+
2311944581
179+
"""
171180
result = part2(input)
172181

173-
assert result
182+
assert result == 315
174183
end
175184
end

0 commit comments

Comments
 (0)