this repo has no description
1# Day 07
2
3```elixir
4Mix.install([:kino_aoc, :image])
5```
6
7## Parse
8
9<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI3Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjUifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
10
11```elixir
12{:ok, puzzle_input} =
13 KinoAOC.download_puzzle("2025", "7", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
14```
15
16```elixir
17[start | rest] = String.split(puzzle_input)
18
19start_col = byte_size(start) - byte_size(String.trim_leading(start, "."))
20```
21
22```elixir
23splitters =
24 Enum.map(rest, fn row ->
25 row
26 |> String.to_charlist()
27 |> Enum.with_index()
28 |> Enum.filter(&(elem(&1, 0) == ?^))
29 |> MapSet.new(&elem(&1, 1))
30 end)
31```
32
33<!-- livebook:{"branch_parent_index":0} -->
34
35## Part 1
36
37```elixir
38Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} ->
39 import MapSet, only: [intersection: 2, difference: 2, union: 2]
40
41 hits = intersection(beams, splits)
42 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
43 beams = beams |> difference(hits) |> union(new_beams)
44
45 {beams, MapSet.size(hits) + count}
46end)
47```
48
49<!-- livebook:{"branch_parent_index":0} -->
50
51## Part 2
52
53```elixir
54Enum.reduce(splitters, %{start_col => 1}, fn splits, beams ->
55 Enum.reduce(splits, beams, fn s, acc ->
56 case Map.pop(acc, s) do
57 {nil, map} ->
58 map
59
60 {count, map} ->
61 Map.merge(
62 map,
63 %{
64 (s + 1) => count,
65 (s - 1) => count
66 },
67 fn _k, a, b -> a + b end
68 )
69 end
70 end)
71end)
72|> Enum.sum_by(&elem(&1, 1))
73```
74
75<!-- livebook:{"branch_parent_index":0} -->
76
77## Image
78
79```elixir
80height = length([start | rest])
81width = byte_size(start)
82
83{height, width}
84```
85
86```elixir
87Image.new!(width, height)
88|> Image.mutate(fn img ->
89 Image.Draw.point!(img, start_col, 0, color: :yellow)
90
91 splitters
92 |> Enum.with_index(1)
93 |> Enum.reduce(MapSet.new([start_col]), fn {splits, y}, beams ->
94 import MapSet, only: [intersection: 2, difference: 2, union: 2]
95
96 for x <- beams do
97 Image.Draw.point(img, x, y, color: :green)
98 end
99
100 for x <- splits do
101 Image.Draw.point(img, x, y, color: :red)
102 end
103
104 hits = intersection(beams, splits)
105 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
106 beams = beams |> difference(hits) |> union(new_beams)
107
108 beams
109 end)
110
111 img
112end)
113|> then(fn {:ok, img} -> img end)
114|> Image.resize!(5, interpolate: :nearest)
115```
116
117<!-- livebook:{"offset":2553,"stamp":{"token":"XCP.6lQNAY-yntHErm41fMi4xgwAxGSGZ7l6ekgYSe6b3Exm48kBKgyIoCK62LLVaeQP-1PfZFpd3tzHwAIA8OWTsnRBuWsxmex5qixMa-l4DaThm-jrSaVsE3Qj4aO-TrqdqA","version":2}} -->