+49
-1
2025/day07.livemd
+49
-1
2025/day07.livemd
···
44
44
end)
45
45
```
46
46
47
+
<!-- livebook:{"branch_parent_index":0} -->
48
+
47
49
## Part 2
48
50
49
51
```elixir
···
68
70
|> Enum.sum_by(&elem(&1, 1))
69
71
```
70
72
71
-
<!-- livebook:{"offset":1576,"stamp":{"token":"XCP.4O_0Nj7V9wS7w6P8UvTBgpp4vhW57_8fy1nGUUO-kK-Q74Dt1KmWL8qx_FolCKDbpEooq8lZ8yn9tXw9AlKXzLPCKp2hEtIvQvKWtBiSmje0vN9ms0Uqud5m2GxlgCHmtg","version":2}} -->
73
+
<!-- livebook:{"branch_parent_index":0} -->
74
+
75
+
## Image
76
+
77
+
```elixir
78
+
height = length([start | rest])
79
+
width = byte_size(start)
80
+
81
+
{height, width}
82
+
```
83
+
84
+
```elixir
85
+
Image.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
114
+
end)
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}} -->