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
Day 07 of 2025
hauleth.dev
3 months ago
8003c417
64ac2206
verified
This commit was signed with the committer's
known signature
.
hauleth.dev
SSH Key Fingerprint:
SHA256:1hEP8QO8nM2KQfQ8jK4Q19y/CmqVZQI/cNSht3c1QlI=
+71
1 changed file
expand all
collapse all
unified
split
2025
day07.livemd
+71
2025/day07.livemd
···
1
1
+
# Day 07
2
2
+
3
3
+
```elixir
4
4
+
Mix.install([:kino_aoc, :image])
5
5
+
```
6
6
+
7
7
+
## Parse
8
8
+
9
9
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI3Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjUifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
10
10
+
11
11
+
```elixir
12
12
+
{:ok, puzzle_input} =
13
13
+
KinoAOC.download_puzzle("2025", "7", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
14
14
+
```
15
15
+
16
16
+
```elixir
17
17
+
[start | rest] = String.split(puzzle_input)
18
18
+
19
19
+
start_col = byte_size(start) - byte_size(String.trim_leading(start, "."))
20
20
+
```
21
21
+
22
22
+
```elixir
23
23
+
splitters =
24
24
+
Enum.map(rest, fn row ->
25
25
+
row
26
26
+
|> String.to_charlist()
27
27
+
|> Enum.with_index()
28
28
+
|> Enum.filter(&(elem(&1, 0) == ?^))
29
29
+
|> MapSet.new(&elem(&1, 1))
30
30
+
end)
31
31
+
```
32
32
+
33
33
+
## Part 1
34
34
+
35
35
+
```elixir
36
36
+
Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} ->
37
37
+
import MapSet, only: [intersection: 2, difference: 2, union: 2]
38
38
+
39
39
+
hits = intersection(beams, splits)
40
40
+
new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
41
41
+
beams = beams |> difference(hits) |> union(new_beams)
42
42
+
43
43
+
{beams, MapSet.size(hits) + count}
44
44
+
end)
45
45
+
```
46
46
+
47
47
+
## Part 2
48
48
+
49
49
+
```elixir
50
50
+
Enum.reduce(splitters, %{start_col => 1}, fn splits, beams ->
51
51
+
Enum.reduce(splits, beams, fn s, acc ->
52
52
+
case Map.pop(acc, s) do
53
53
+
{nil, map} ->
54
54
+
map
55
55
+
56
56
+
{count, map} ->
57
57
+
Map.merge(
58
58
+
map,
59
59
+
%{
60
60
+
(s + 1) => count,
61
61
+
(s - 1) => count
62
62
+
},
63
63
+
fn _k, a, b -> a + b end
64
64
+
)
65
65
+
end
66
66
+
end)
67
67
+
end)
68
68
+
|> Enum.sum_by(&elem(&1, 1))
69
69
+
```
70
70
+
71
71
+
<!-- livebook:{"offset":1576,"stamp":{"token":"XCP.4O_0Nj7V9wS7w6P8UvTBgpp4vhW57_8fy1nGUUO-kK-Q74Dt1KmWL8qx_FolCKDbpEooq8lZ8yn9tXw9AlKXzLPCKp2hEtIvQvKWtBiSmje0vN9ms0Uqud5m2GxlgCHmtg","version":2}} -->