tangled
alpha
login
or
join now
hauleth.dev
/
advent-of-code
3
fork
atom
this repo has no description
3
fork
atom
overview
issues
pulls
pipelines
2024 day 06
hauleth.dev
1 year ago
4dfcd34f
cba61364
verified
This commit was signed with the committer's
known signature
.
hauleth.dev
SSH Key Fingerprint:
SHA256:1hEP8QO8nM2KQfQ8jK4Q19y/CmqVZQI/cNSht3c1QlI=
+187
1 changed file
expand all
collapse all
unified
split
2024
day06.livemd
+187
2024/day06.livemd
···
1
1
+
<!-- livebook:{"persist_outputs":true} -->
2
2
+
3
3
+
# Untitled notebook
4
4
+
5
5
+
```elixir
6
6
+
Mix.install([:kino_aoc, :arrays])
7
7
+
```
8
8
+
9
9
+
## Section
10
10
+
11
11
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI2Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjQifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
12
+
13
13
+
```elixir
14
14
+
{:ok, puzzle_input} =
15
15
+
KinoAOC.download_puzzle("2024", "6", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16
16
+
```
17
17
+
18
18
+
<!-- livebook:{"output":true} -->
19
19
+
20
20
+
```
21
21
+
{:ok,
22
22
+
"...#..................#...................#......................#..............................#.............................#...\n....#.......................#........#.#..............##...........#.....#..........#..........................#..................\n.............#........................................................................#.........#.#..#..#..........#..............\n..........#.......#..........#..................#........##...................#..............#....................................\n....................#..........................................................#..#.....................................#.........\n....#............................#..............................................#.....................#..........##....#..........\n.......#.............#......................................................................#.............#.........#.............\n....###......................#....#...........#.....#................................#..........................#.................\n..........#..#...........#..#........................................................#.....#...........#................#.........\n..#....#......#....#....#...................................................................#.....................................\n....................#............#............................................#......#....#...............................#.......\n..........#.......#.........#.......#.............................................................................................\n.......#...#.......................................#...................#..........................................................\n.......#........#............................#.....#.......#..............................................#..................#...#\n.....................#.................................#................#...#...............#.....#.#..........................#..\n.....#..........................................#......................#.............##..............................#........#...\n.....#......#.........................#..........................#..........................................................#..#..\n.#......#.............#......#.................................................#.....#...................##......#................\n.............................................................................##...................................................\n........................................#.......................................#........#.............................#.#.......#\n...........#.....................................#.............................#......#......#..#....................#..#.........\n.............................................#.......................#..................##....#.....#.............................\n........................#..............................................................#..........................................\n#..............#.........................#........#...#...............#..............#..................#....................##...\n...#...#.............................#.......#................................................#........................#....#.....\n.....#.........................#..#.......................#..........#.....................#..................#.#.....#...........\n..................#........#..#.......#...................................................................................#....#..\n..#...#...............................................#.#..#........................................................#....#......#.\n...............#...............#..........................#............................#..........#.............#.................\n............#.....#........#.........................................................#........#........#.....#........#......#....\n............................#.........#....#........#.....#...#.............#.................................#...................\n........#..................#....#.." <> ...}
23
23
+
```
24
24
+
25
25
+
```elixir
26
26
+
map =
27
27
+
puzzle_input
28
28
+
|> String.split("\n", trim: true)
29
29
+
|> Enum.with_index()
30
30
+
|> Enum.flat_map(fn {row, y} ->
31
31
+
row
32
32
+
|> String.to_charlist()
33
33
+
|> Enum.with_index()
34
34
+
|> Enum.map(fn {v, x} -> {{y, x}, v} end)
35
35
+
end)
36
36
+
|> Map.new()
37
37
+
```
38
38
+
39
39
+
<!-- livebook:{"output":true} -->
40
40
+
41
41
+
```
42
42
+
%{
43
43
+
{18, 103} => 46,
44
44
+
{76, 13} => 46,
45
45
+
{61, 121} => 46,
46
46
+
{37, 47} => 46,
47
47
+
{65, 63} => 46,
48
48
+
{77, 129} => 46,
49
49
+
{120, 47} => 46,
50
50
+
{38, 2} => 46,
51
51
+
{1, 26} => 46,
52
52
+
{116, 69} => 46,
53
53
+
{124, 56} => 46,
54
54
+
{83, 76} => 46,
55
55
+
{117, 125} => 46,
56
56
+
{32, 15} => 46,
57
57
+
{103, 106} => 46,
58
58
+
{30, 113} => 46,
59
59
+
{123, 104} => 46,
60
60
+
{124, 60} => 46,
61
61
+
{89, 14} => 46,
62
62
+
{35, 30} => 46,
63
63
+
{37, 53} => 46,
64
64
+
{4, 5} => 46,
65
65
+
{8, 50} => 46,
66
66
+
{78, 98} => 46,
67
67
+
{101, 62} => 46,
68
68
+
{95, 56} => 46,
69
69
+
{74, 12} => 46,
70
70
+
{102, 74} => 46,
71
71
+
{11, 39} => 46,
72
72
+
{65, 43} => 46,
73
73
+
{22, 38} => 46,
74
74
+
{14, 86} => 46,
75
75
+
{49, 117} => 46,
76
76
+
{20, 41} => 46,
77
77
+
{29, 25} => 46,
78
78
+
{86, 10} => 46,
79
79
+
{83, 36} => 46,
80
80
+
{29, 26} => 46,
81
81
+
{47, 27} => 46,
82
82
+
{4, 81} => 46,
83
83
+
{31, 42} => 46,
84
84
+
{9, 34} => 46,
85
85
+
{13, 124} => 46,
86
86
+
{90, 0} => 46,
87
87
+
{14, 122} => 46,
88
88
+
{120, 42} => 46,
89
89
+
{121, 77} => 46,
90
90
+
{103, 39} => 46,
91
91
+
{102, ...} => 46,
92
92
+
{...} => 46,
93
93
+
...
94
94
+
}
95
95
+
```
96
96
+
97
97
+
```elixir
98
98
+
{start_pos, _} = start = Enum.find(map, fn {_pos, v} -> v in ~c'^>v<' end)
99
99
+
100
100
+
map = Map.replace(map, start_pos, ?.)
101
101
+
102
102
+
start
103
103
+
```
104
104
+
105
105
+
<!-- livebook:{"output":true} -->
106
106
+
107
107
+
```
108
108
+
{{93, 71}, 94}
109
109
+
```
110
110
+
111
111
+
```elixir
112
112
+
defmodule Guard do
113
113
+
def walk(map, start),
114
114
+
do: walk(map, start, MapSet.new())
115
115
+
116
116
+
defp walk(map, {pos, dir} = curr, visited) do
117
117
+
if curr in visited do
118
118
+
:loop
119
119
+
else
120
120
+
visited = MapSet.put(visited, curr)
121
121
+
122
122
+
case Map.fetch(map, next(pos, dir)) do
123
123
+
{:ok, ?#} ->
124
124
+
walk(map, {pos, turn(dir)}, visited)
125
125
+
126
126
+
{:ok, ?.} ->
127
127
+
walk(map, {next(pos, dir), dir}, visited)
128
128
+
129
129
+
:error ->
130
130
+
MapSet.new(visited, fn {pos, _} -> pos end)
131
131
+
end
132
132
+
end
133
133
+
end
134
134
+
135
135
+
defp next({y, x}, ?^), do: {y - 1, x}
136
136
+
defp next({y, x}, ?>), do: {y, x + 1}
137
137
+
defp next({y, x}, ?v), do: {y + 1, x}
138
138
+
defp next({y, x}, ?<), do: {y, x - 1}
139
139
+
140
140
+
defp turn(?^), do: ?>
141
141
+
defp turn(?>), do: ?v
142
142
+
defp turn(?v), do: ?<
143
143
+
defp turn(?<), do: ?^
144
144
+
end
145
145
+
```
146
146
+
147
147
+
<!-- livebook:{"output":true} -->
148
148
+
149
149
+
```
150
150
+
{:module, Guard, <<70, 79, 82, 49, 0, 0, 12, ...>>, {:turn, 1}}
151
151
+
```
152
152
+
153
153
+
## Part 1
154
154
+
155
155
+
```elixir
156
156
+
orig_path = Guard.walk(map, start)
157
157
+
158
158
+
MapSet.size(orig_path)
159
159
+
```
160
160
+
161
161
+
<!-- livebook:{"output":true} -->
162
162
+
163
163
+
```
164
164
+
4433
165
165
+
```
166
166
+
167
167
+
## Part 2
168
168
+
169
169
+
```elixir
170
170
+
orig_path
171
171
+
|> MapSet.delete(start_pos)
172
172
+
|> Task.async_stream(fn point ->
173
173
+
map
174
174
+
|> Map.put(point, ?#)
175
175
+
|> Guard.walk(start)
176
176
+
|> Kernel.==(:loop)
177
177
+
end, ordered: false)
178
178
+
|> Enum.count(& &1)
179
179
+
```
180
180
+
181
181
+
<!-- livebook:{"output":true} -->
182
182
+
183
183
+
```
184
184
+
4432
185
185
+
```
186
186
+
187
187
+
<!-- livebook:{"offset":7387,"stamp":{"token":"XCP.Wj_YFc-zYzAPEIaLCGnT6vtMYoDgv-DJ3xiuAVdHZPkMwNpP5jrmLW4LBe4lzRgNN75xF-FYACOKdzd82Z71i5y8yC5Wmd072w6qDXxmygH8fZvTOAZM02UZvvg20b5Yhv0","version":2}} -->