this repo has no description
1# Day 08
2
3```elixir
4Mix.install([:kino_aoc])
5```
6
7## Section
8
9<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"8","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
10
11```elixir
12{:ok, puzzle_input} =
13 KinoAOC.download_puzzle("2023", "8", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
14```
15
16```elixir
17# puzzle_input =
18"""
19LR
20
2111A = (11B, XXX)
2211B = (XXX, 11Z)
2311Z = (11B, XXX)
2422A = (22B, XXX)
2522B = (22C, 22C)
2622C = (22Z, 22Z)
2722Z = (22B, 22B)
28XXX = (XXX, XXX)
29"""
30```
31
32```elixir
33defmodule Day08 do
34 def find_path(instructions, pos, map) do
35 Enum.reduce_while(instructions, pos, fn
36 {_, idx}, <<_, _, ?Z>> -> {:halt, idx}
37 {step, _}, pos -> {:cont, elem(Map.fetch!(map, pos), step)}
38 end)
39 end
40end
41
42[instructions | rest] =
43 String.split(puzzle_input, "\n", trim: true)
44
45instructions =
46 Stream.cycle(for <<c <- instructions>>, do: if(c == ?L, do: 0, else: 1))
47 |> Stream.with_index()
48
49map =
50 Map.new(rest, fn
51 <<src::binary-3>> <> " = (" <> <<left::binary-3>> <> ", " <> <<right::binary-3>> <> ")" ->
52 {src, {left, right}}
53 end)
54```
55
56## Part 1
57
58```elixir
59Day08.find_path(instructions, "AAA", map)
60```
61
62## Part 2
63
64```elixir
65starts = map |> Map.keys() |> Enum.filter(&String.ends_with?(&1, "A"))
66
67Task.async_stream(starts, &Day08.find_path(instructions, &1, map), ordered: false)
68|> Enum.reduce(1, fn {:ok, a}, b ->
69 div(a * b, Integer.gcd(a, b))
70end)
71```
72
73<!-- livebook:{"offset":1485,"stamp":{"token":"XCP.dP8RakyYvjO2Dt2LfELbhGu7h_AlwhvgijUPOM_xnTL158Wj_I2mpQbyuTUJEnrHmVyOVnplBQcB1UHSBWM-ogSxBCmlsFU8DVr00oukCY_wP9T2YAIinkNIn_0CtZ7tkg","version":2}} -->