this repo has no description
at master 2.1 kB view raw
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}} -->