+218
2024/day10.livemd
+218
2024/day10.livemd
···
1
+
<!-- livebook:{"persist_outputs":true} -->
2
+
3
+
# Day 10
4
+
5
+
```elixir
6
+
Mix.install([:kino_aoc])
7
+
```
8
+
9
+
## Section
10
+
11
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIxMCIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI0In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
+
13
+
```elixir
14
+
{:ok, puzzle_input} =
15
+
KinoAOC.download_puzzle("2024", "10", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16
+
```
17
+
18
+
<!-- livebook:{"output":true} -->
19
+
20
+
```
21
+
{:ok,
22
+
"543067650323210321032110356789890110710189878760134567\n612148941212306782345091235410765227893258759651021298\n701238932301456798106787549323454336794567549842330807\n898547215450589867287654678892961245987654456732498910\n987656306769678956398013234781870301256003301201567821\n234543215878760145478920105690210982340112210341056932\n109650124981232230569834124567345673451234985452347845\n018744323890341021656765033438454589298545676701037796\n199803210787650110765017842129823672107655677812378987\n785012345654789541874326956010510563201234389983405676\n174321498723498632903455467173421454102348210234514430\n065430239014323721212762398982567876218959650149623521\n145540128765017890101871081071018967327968743898734678\n236692134984178768718981012567894458456876212798604329\n987783005673269659654108923458763349663212108789015012\n896654012562154546743267830309854218767103419276126787\n765780123473043432890154321212903109878756578125435698\n434099874984012301740125654567812893469017647030165556\n323101065765101787434436763058906732154178736543256765\n013298187890678696325569892143215440043289128954343894\n010367296541549045016678765014300351234567037760012983\n329458305032132134787867410967891267653438546891898012\n458789414145010120196986323898763298344129655432743210\n567076523236678743285898456777654101201098766653658901\n456167654107549658374567689985403100312434985567877014\n343228943298938569843210576876312238920125676656986323\n651014543498127478755765435410278947437876985543235434\n743223672567078369876890324320127656506987234350145632\n894102981089569232125981210451256543215432122341076541\n765091234676352101034674323401237894101341001456789830\n014780365445443032126501012532345743103210112565898321\n123689876034321145098432107645236743254101101876543210\n094545763125210056788943258896107858969010332987674301\n785430432106782169877652349787567967678321245696784561\n876021569045893458965601654343478914565414326781093870\n987109878010432167014298710234323901258905015492012901\n789219894324569052123109620123217892109876012323458692\n654308765543678743013234538994106543010870965410069783\n789877787632189852101110145885287676521961871012178654\n034565896601087601211001406776896789437652676523468743\n121053795542194512389132312345445676548943989430549012\n262342187634765433498545434531230107401232104321678298\n876533014123892324567696526540043298340981010780890187\n983414523016101019876587017832134781256672125690743296\n032101654327892100345678789901295690764543434321652345\n123089789236743981234589654800387789835678987787601336\n854176590187656876104310343211456876544549016098543223\n965765410194545675465231230898565963233432145123210112\n876894321243232980370110141767653210112321039654101101\n146765232100101061289879852632154100203410128789210322\n036787103761267876518768763543069911012543454376325412\n123498654854356987405650654985678892327632567215436701\n210567569983543292314321569876301765438761078904589898\n325456478754330101223433478765432654349652987615678765"}
23
+
```
24
+
25
+
```elixir
26
+
map =
27
+
for {row, y} <- puzzle_input |> String.split("\n", trim: true) |> Enum.with_index(),
28
+
{h, x} <- row |> String.to_charlist() |> Enum.with_index(),
29
+
into: %{},
30
+
do: {{x, y}, h - ?0}
31
+
```
32
+
33
+
<!-- livebook:{"output":true} -->
34
+
35
+
```
36
+
%{
37
+
{37, 47} => 3,
38
+
{38, 2} => 4,
39
+
{1, 26} => 5,
40
+
{32, 15} => 4,
41
+
{35, 30} => 3,
42
+
{37, 53} => 4,
43
+
{4, 5} => 4,
44
+
{8, 50} => 3,
45
+
{11, 39} => 1,
46
+
{22, 38} => 1,
47
+
{20, 41} => 8,
48
+
{29, 25} => 6,
49
+
{29, 26} => 0,
50
+
{47, 27} => 0,
51
+
{31, 42} => 4,
52
+
{9, 34} => 0,
53
+
{47, 38} => 2,
54
+
{20, 3} => 7,
55
+
{47, 44} => 1,
56
+
{22, 37} => 3,
57
+
{22, 36} => 0,
58
+
{45, 7} => 7,
59
+
{19, 38} => 0,
60
+
{27, 21} => 9,
61
+
{9, 33} => 1,
62
+
{26, 41} => 4,
63
+
{52, 42} => 8,
64
+
{21, 35} => 2,
65
+
{42, 8} => 6,
66
+
{19, 22} => 9,
67
+
{16, 10} => 3,
68
+
{21, 45} => 5,
69
+
{11, 8} => 7,
70
+
{26, 21} => 0,
71
+
{21, 48} => 1,
72
+
{50, 40} => 9,
73
+
{10, 25} => 9,
74
+
{11, 19} => 0,
75
+
{16, 38} => 5,
76
+
{35, 15} => 8,
77
+
{37, 15} => 6,
78
+
{35, 26} => 7,
79
+
{28, 20} => 1,
80
+
{45, 19} => 9,
81
+
{27, 22} => 8,
82
+
{16, 24} => 5,
83
+
{6, 18} => 0,
84
+
{10, 32} => 2,
85
+
{32, ...} => 8,
86
+
{...} => 7,
87
+
...
88
+
}
89
+
```
90
+
91
+
```elixir
92
+
starts = Enum.filter(map, fn {_, elev} -> elev == 0 end)
93
+
```
94
+
95
+
<!-- livebook:{"output":true} -->
96
+
97
+
```
98
+
[
99
+
{{38, 5}, 0},
100
+
{{24, 7}, 0},
101
+
{{11, 35}, 0},
102
+
{{3, 9}, 0},
103
+
{{15, 36}, 0},
104
+
{{41, 32}, 0},
105
+
{{51, 14}, 0},
106
+
{{51, 24}, 0},
107
+
{{5, 12}, 0},
108
+
{{4, 35}, 0},
109
+
{{40, 4}, 0},
110
+
{{46, 4}, 0},
111
+
{{22, 30}, 0},
112
+
{{27, 12}, 0},
113
+
{{7, 4}, 0},
114
+
{{24, 43}, 0},
115
+
{{31, 20}, 0},
116
+
{{29, 42}, 0},
117
+
{{29, 9}, 0},
118
+
{{10, 2}, 0},
119
+
{{0, 20}, 0},
120
+
{{15, 20}, 0},
121
+
{{14, 0}, 0},
122
+
{{42, 48}, 0},
123
+
{{40, 15}, 0},
124
+
{{43, 14}, 0},
125
+
{{19, 2}, 0},
126
+
{{14, 22}, 0},
127
+
{{34, 35}, 0},
128
+
{{38, 42}, 0},
129
+
{{23, 5}, 0},
130
+
{{0, 11}, 0},
131
+
{{44, 11}, 0},
132
+
{{15, 30}, 0},
133
+
{{17, 44}, 0},
134
+
{{31, 32}, 0},
135
+
{{48, 28}, 0},
136
+
{{21, 39}, 0},
137
+
{{49, 13}, 0},
138
+
{{29, 45}, 0},
139
+
{{4, 37}, 0},
140
+
{{53, 31}, 0},
141
+
{{45, 46}, 0},
142
+
{{43, 29}, 0},
143
+
{{8, 0}, 0},
144
+
{{47, 42}, 0},
145
+
{{7, 14}, 0},
146
+
{{52, ...}, 0},
147
+
{{...}, ...},
148
+
{...},
149
+
...
150
+
]
151
+
```
152
+
153
+
```elixir
154
+
defmodule Trail do
155
+
def traverse(start, map), do: MapSet.new(traverse(start, map, []))
156
+
157
+
defp traverse({curr, 9}, _map, acc), do: [[{curr, 9} | acc]]
158
+
defp traverse({curr, elev}, map, acc) do
159
+
curr
160
+
|> surroundings()
161
+
|> then(&Map.take(map, &1))
162
+
|> Enum.filter(fn {_, h} -> elev + 1 == h end)
163
+
|> Enum.flat_map(&traverse(&1, map, [{curr, elev} | acc]))
164
+
end
165
+
166
+
defp surroundings({x, y}) do
167
+
[
168
+
{x, y - 1},
169
+
{x - 1, y},
170
+
{x, y + 1},
171
+
{x + 1, y}
172
+
]
173
+
end
174
+
end
175
+
```
176
+
177
+
<!-- livebook:{"output":true} -->
178
+
179
+
```
180
+
{:module, Trail, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:surroundings, 1}}
181
+
```
182
+
183
+
## Part 1
184
+
185
+
```elixir
186
+
starts
187
+
|> Enum.map(fn start ->
188
+
Trail.traverse(start, map)
189
+
|> MapSet.new(&hd/1)
190
+
|> MapSet.size()
191
+
end)
192
+
|> Enum.sum()
193
+
```
194
+
195
+
<!-- livebook:{"output":true} -->
196
+
197
+
```
198
+
733
199
+
```
200
+
201
+
## Section
202
+
203
+
```elixir
204
+
starts
205
+
|> Enum.map(fn start ->
206
+
Trail.traverse(start, map)
207
+
|> MapSet.size()
208
+
end)
209
+
|> Enum.sum()
210
+
```
211
+
212
+
<!-- livebook:{"output":true} -->
213
+
214
+
```
215
+
1514
216
+
```
217
+
218
+
<!-- livebook:{"offset":6605,"stamp":{"token":"XCP.68U6SzidJCV7il26kiMv6z5qLEx_50_v2V7x6LqV9t8LQG1-aShVMNE1DEgCj9SwpKOn02np0aeSu5T1parIYMF9MeWGGfqP-oc4UGnDiDGDtJ5RGqdwcxcPjuPUQmCtZj0","version":2}} -->