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## Part 1
34
35```elixir
36Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} ->
37 import MapSet, only: [intersection: 2, difference: 2, union: 2]
38
39 hits = intersection(beams, splits)
40 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
41 beams = beams |> difference(hits) |> union(new_beams)
42
43 {beams, MapSet.size(hits) + count}
44end)
45```
46
47<!-- livebook:{"branch_parent_index":0} -->
48
49## Part 2
50
51```elixir
52Enum.reduce(splitters, %{start_col => 1}, fn splits, beams ->
53 Enum.reduce(splits, beams, fn s, acc ->
54 case Map.pop(acc, s) do
55 {nil, map} ->
56 map
57
58 {count, map} ->
59 Map.merge(
60 map,
61 %{
62 (s + 1) => count,
63 (s - 1) => count
64 },
65 fn _k, a, b -> a + b end
66 )
67 end
68 end)
69end)
70|> Enum.sum_by(&elem(&1, 1))
71```
72
73<!-- livebook:{"branch_parent_index":0} -->
74
75## Image
76
77```elixir
78height = length([start | rest])
79width = byte_size(start)
80
81{height, width}
82```
83
84```elixir
85Image.new!(width, height)
86|> Image.mutate(fn img ->
87 Image.Draw.point!(img, start_col, 0, color: :yellow)
88
89 splitters
90 |> Enum.with_index(1)
91 |> Enum.reduce(MapSet.new([start_col]), fn {splits, y}, beams ->
92 import MapSet, only: [intersection: 2, difference: 2, union: 2]
93
94 for x <- beams do
95 Image.Draw.point!(img, x, y, color: :green)
96 end
97
98 for x <- splits do
99 Image.Draw.point!(img, x, y, color: :red)
100 end
101
102 hits = intersection(beams, splits)
103 new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
104 beams = beams |> difference(hits) |> union(new_beams)
105
106 beams
107 end)
108
109 #for {row, y} <- Enum.with_index(splitters, 1),
110 # x <- row,
111 # do: Image.Draw.point!(img, x, y, color: :red)
112
113 img
114end)
115|> then(fn {:ok, img} -> img end)
116|> Image.resize!(5, interpolate: :nearest)
117```
118
119<!-- livebook:{"offset":2629,"stamp":{"token":"XCP.lHomXHh84XridtwMBP5AP7BXVVCvUC-jx1w-h7SzIFygBNyHhdS1qTLyp97LGQ3Rf1f4to4IjQtJmlsi-0PrxC2vUjGg97fvP9zvt5n0IxMkwLnFfvafaIDjJSsZLX1Bcg","version":2}} -->