# Day 21 ```elixir Mix.install([:kino_aoc]) ``` ## Section ```elixir {:ok, puzzle_input} = KinoAOC.download_puzzle("2024", "21", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) ``` ``` {:ok, "638A\n965A\n780A\n803A\n246A"} ``` ```elixir codes = puzzle_input |> String.split("\n", trim: true) |> Enum.map(fn <> <> "A" = code -> {String.to_charlist(code), String.to_integer(num)} end) ``` ``` [{~c"638A", 638}, {~c"965A", 965}, {~c"780A", 780}, {~c"803A", 803}, {~c"246A", 246}] ``` ```elixir dirpad = %{ [?A, ?>] => ~c[vA], [?A, ?^] => ~c[ ~c[ ~c[v<, ?A] => ~c[^A], [?>, ?^] => ~c[<^A], [?>, ?v] => ~c[, ?<] => ~c[< ~c[>A], [?^, ?>] => ~c[v>A], [?^, ?v] => ~c[vA], [?^, ?<] => ~c[v ~c[>>^A], [?<, ?^] => ~c[>^A], [?<, ?v] => ~c[>A], [?<, ?>] => ~c[>>A], [?v, ?A] => ~c[>^A], [?v, ?^] => ~c[^A], [?v, ?<] => ~c[] => ~c[>A] } ``` ``` %{ ~c"<>" => ~c">>A", ~c" ~c">>^A", ~c"<^" => ~c">^A", ~c" ~c">A", ~c"><" => ~c"<A" => ~c"^A", ~c">^" => ~c"<^A", ~c">v" => ~c" ~c"v<" => ~c"vA", ~c"A^" => ~c" ~c" ~c"v" => ~c"v>A", ~c"^A" => ~c">A", ~c"^v" => ~c"vA", ~c"v<" => ~c"" => ~c">A", ~c"vA" => ~c">^A", ~c"v^" => ~c"^A" } ``` ```elixir ``` ``` nil ``` ```elixir defmodule Keypad do def naive(input, lut) do [?A | input] |> Enum.chunk_every(2, 1, :discard) |> Enum.flat_map(&Map.get(lut, &1, [?A])) end def expand(input, lut) do Stream.concat([?A], input) |> Stream.chunk_every(2, 1, :discard) |> Stream.flat_map(&Map.get(lut, &1, [?A])) end end ``` ``` {:module, Keypad, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:expand, 2}} ``` ```elixir ``` ``` nil ``` ```elixir Keypad.expand(~c[^^AvvvA], dirpad) |> Enum.count() #|> Enum.map(fn {k, v} -> # [?A | Map.get(dirpad, k, [?A])] # |> Enum.chunk_every(2, 1, :discard) # |> Enum.map() #end) #|> Enum.group_by(&elem(&1, 0), &elem(&1, 1)) #|> Map.new(fn {k, v} -> {k, Enum.sum(v)} end) ``` ``` 28 ``` ```elixir Keypad.naive(~c[^^AvvvA], dirpad) |> Keypad.naive(dirpad) |> Enum.chunk_every(2, 1, [?A]) |> Enum.frequencies() |> Map.values() |> Enum.sum() ``` ``` 68 ``` ```elixir ~c">^AvAA<^A>Av<>^AvA^A^Av<^A>AAvA^Av<A>^AAAvA<^A>A" ~c">^AvAA<^A>A>^AvA^A^A^A>AAvA^AA>^AAAvA<^A>A" |> length ``` ``` 68 ```