this repo has no description
1# Day 11
2
3```elixir
4Mix.install([:kino_aoc])
5```
6
7## Parse
8
9<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIxMSIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI1In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
10
11```elixir
12{:ok, puzzle_input} =
13 KinoAOC.download_puzzle("2025", "11", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
14```
15
16```elixir
17graph =
18 puzzle_input
19 |> String.split("\n", trim: true)
20 |> Map.new(fn <<from::binary-3>> <> ": " <> rest ->
21 {from, String.split(rest)}
22 end)
23```
24
25## Implementation
26
27```elixir
28defmodule Servers do
29 def paths(graph, from, to), do: paths(graph, from, to, [from])
30
31 defp paths(_graph, to, to, acc), do: [Enum.reverse(acc)]
32
33 defp paths(graph, from, to, acc) do
34 if next = graph[from] do
35 Stream.flat_map(next, &paths(graph, &1, to, [&1 | acc]))
36 else
37 []
38 end
39 end
40
41 def paths_through(graph, from, to, required),
42 do: path_through(graph, from, to, MapSet.new(required), %{})
43
44 defp path_through(_graph, to, to, required, memo),
45 do: {if(Enum.empty?(required), do: 1, else: 0), memo}
46
47 defp path_through(graph, from, to, required, memo) do
48 state = MapSet.delete(required, from)
49
50 with :error <- Map.fetch(memo, {from, state}),
51 {:ok, next} <- Map.fetch(graph, from) do
52 {sum, memo} =
53 Enum.reduce(next, {0, memo}, fn n, {sum, acc} ->
54 {c, next_acc} = path_through(graph, n, to, state, acc)
55
56 {c + sum, next_acc}
57 end)
58
59 {sum, Map.put(memo, {from, state}, sum)}
60 else
61 :error -> {0, memo}
62 {:ok, val} -> {val, memo}
63 end
64 end
65end
66```
67
68<!-- livebook:{"branch_parent_index":1} -->
69
70## Part 1
71
72```elixir
73Servers.paths(graph, "you", "out") |> Enum.count()
74```
75
76<!-- livebook:{"branch_parent_index":1} -->
77
78## Part 2
79
80```elixir
81Servers.paths_through(graph, "svr", "out", ["dac", "fft"])
82|> elem(0)
83```
84
85<!-- livebook:{"offset":1933,"stamp":{"token":"XCP.fzzPot48c9xb6ftw8IEb1V6uTX6csBICnoXjN1PU6c3DylXjP-bco9PgawAoc2GSeNJRzS3NCPmJ9aO9Jm2ehPXnam5fN-bZvUbEcxKmNA8SqH2_fJ5o_qp8rIaxpH6DRQ","version":2}} -->