this repo has no description

Day 07 of 2025

hauleth.dev 8003c417 64ac2206

verified
Changed files
+71
2025
+71
2025/day07.livemd
···
+
# Day 07
+
+
```elixir
+
Mix.install([:kino_aoc, :image])
+
```
+
+
## Parse
+
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiI3Iiwic2Vzc2lvbl9zZWNyZXQiOiJBRFZFTlRfT0ZfQ09ERV9TRVNTSU9OIiwieWVhciI6IjIwMjUifQ","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
+
+
```elixir
+
{:ok, puzzle_input} =
+
KinoAOC.download_puzzle("2025", "7", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
+
```
+
+
```elixir
+
[start | rest] = String.split(puzzle_input)
+
+
start_col = byte_size(start) - byte_size(String.trim_leading(start, "."))
+
```
+
+
```elixir
+
splitters =
+
Enum.map(rest, fn row ->
+
row
+
|> String.to_charlist()
+
|> Enum.with_index()
+
|> Enum.filter(&(elem(&1, 0) == ?^))
+
|> MapSet.new(&elem(&1, 1))
+
end)
+
```
+
+
## Part 1
+
+
```elixir
+
Enum.reduce(splitters, {MapSet.new([start_col]), 0}, fn splits, {beams, count} ->
+
import MapSet, only: [intersection: 2, difference: 2, union: 2]
+
+
hits = intersection(beams, splits)
+
new_beams = for hit <- hits, dx <- [-1, 1], into: MapSet.new(), do: hit + dx
+
beams = beams |> difference(hits) |> union(new_beams)
+
+
{beams, MapSet.size(hits) + count}
+
end)
+
```
+
+
## Part 2
+
+
```elixir
+
Enum.reduce(splitters, %{start_col => 1}, fn splits, beams ->
+
Enum.reduce(splits, beams, fn s, acc ->
+
case Map.pop(acc, s) do
+
{nil, map} ->
+
map
+
+
{count, map} ->
+
Map.merge(
+
map,
+
%{
+
(s + 1) => count,
+
(s - 1) => count
+
},
+
fn _k, a, b -> a + b end
+
)
+
end
+
end)
+
end)
+
|> Enum.sum_by(&elem(&1, 1))
+
```
+
+
<!-- livebook:{"offset":1576,"stamp":{"token":"XCP.4O_0Nj7V9wS7w6P8UvTBgpp4vhW57_8fy1nGUUO-kK-Q74Dt1KmWL8qx_FolCKDbpEooq8lZ8yn9tXw9AlKXzLPCKp2hEtIvQvKWtBiSmje0vN9ms0Uqud5m2GxlgCHmtg","version":2}} -->