this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 21
4
5```elixir
6Mix.install([:kino_aoc])
7```
8
9## Section
10
11<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIyMSIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI0In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
13```elixir
14{:ok, puzzle_input} =
15 KinoAOC.download_puzzle("2024", "21", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16```
17
18<!-- livebook:{"output":true} -->
19
20```
21{:ok, "638A\n965A\n780A\n803A\n246A"}
22```
23
24```elixir
25codes =
26 puzzle_input
27 |> String.split("\n", trim: true)
28 |> Enum.map(fn <<num::3-binary>> <> "A" = code ->
29 {String.to_charlist(code), String.to_integer(num)}
30 end)
31```
32
33<!-- livebook:{"output":true} -->
34
35```
36[{~c"638A", 638}, {~c"965A", 965}, {~c"780A", 780}, {~c"803A", 803}, {~c"246A", 246}]
37```
38
39```elixir
40dirpad = %{
41 [?A, ?>] => ~c[vA],
42 [?A, ?^] => ~c[<A],
43 [?A, ?v] => ~c[<vA],
44 [?A, ?<] => ~c[v<<A],
45
46 [?>, ?A] => ~c[^A],
47 [?>, ?^] => ~c[<^A],
48 [?>, ?v] => ~c[<A],
49 [?>, ?<] => ~c[<<A],
50
51 [?^, ?A] => ~c[>A],
52 [?^, ?>] => ~c[v>A],
53 [?^, ?v] => ~c[vA],
54 [?^, ?<] => ~c[v<A],
55
56 [?<, ?A] => ~c[>>^A],
57 [?<, ?^] => ~c[>^A],
58 [?<, ?v] => ~c[>A],
59 [?<, ?>] => ~c[>>A],
60
61 [?v, ?A] => ~c[>^A],
62 [?v, ?^] => ~c[^A],
63 [?v, ?<] => ~c[<A],
64 [?v, ?>] => ~c[>A]
65}
66```
67
68<!-- livebook:{"output":true} -->
69
70```
71%{
72 ~c"<>" => ~c">>A",
73 ~c"<A" => ~c">>^A",
74 ~c"<^" => ~c">^A",
75 ~c"<v" => ~c">A",
76 ~c"><" => ~c"<<A",
77 ~c">A" => ~c"^A",
78 ~c">^" => ~c"<^A",
79 ~c">v" => ~c"<A",
80 ~c"A<" => ~c"v<<A",
81 ~c"A>" => ~c"vA",
82 ~c"A^" => ~c"<A",
83 ~c"Av" => ~c"<vA",
84 ~c"^<" => ~c"v<A",
85 ~c"^>" => ~c"v>A",
86 ~c"^A" => ~c">A",
87 ~c"^v" => ~c"vA",
88 ~c"v<" => ~c"<A",
89 ~c"v>" => ~c">A",
90 ~c"vA" => ~c">^A",
91 ~c"v^" => ~c"^A"
92}
93```
94
95```elixir
96
97```
98
99<!-- livebook:{"output":true} -->
100
101```
102nil
103```
104
105```elixir
106defmodule Keypad do
107 def naive(input, lut) do
108 [?A | input]
109 |> Enum.chunk_every(2, 1, :discard)
110 |> Enum.flat_map(&Map.get(lut, &1, [?A]))
111 end
112
113 def expand(input, lut) do
114 Stream.concat([?A], input)
115 |> Stream.chunk_every(2, 1, :discard)
116 |> Stream.flat_map(&Map.get(lut, &1, [?A]))
117 end
118end
119```
120
121<!-- livebook:{"output":true} -->
122
123```
124{:module, Keypad, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:expand, 2}}
125```
126
127```elixir
128
129```
130
131<!-- livebook:{"output":true} -->
132
133```
134nil
135```
136
137```elixir
138Keypad.expand(~c[<A^A>^^AvvvA], dirpad)
139|> Enum.count()
140
141#|> Enum.map(fn {k, v} ->
142# [?A | Map.get(dirpad, k, [?A])]
143# |> Enum.chunk_every(2, 1, :discard)
144# |> Enum.map()
145#end)
146#|> Enum.group_by(&elem(&1, 0), &elem(&1, 1))
147#|> Map.new(fn {k, v} -> {k, Enum.sum(v)} end)
148```
149
150<!-- livebook:{"output":true} -->
151
152```
15328
154```
155
156```elixir
157Keypad.naive(~c[<A^A>^^AvvvA], dirpad)
158|> Keypad.naive(dirpad)
159|> Enum.chunk_every(2, 1, [?A])
160|> Enum.frequencies()
161|> Map.values()
162|> Enum.sum()
163```
164
165<!-- livebook:{"output":true} -->
166
167```
16868
169```
170
171```elixir
172~c"<vA<AA>>^AvAA<^A>Av<<A>>^AvA^A<vA>^Av<<A>^A>AAvA^Av<<A>A>^AAAvA<^A>A"
173~c"<vA<AA>>^AvAA<^A>A<v<A>>^AvA^A<vA>^A<v<A>^A>AAvA^A<v<A>A>^AAAvA<^A>A" |> length
174```
175
176<!-- livebook:{"output":true} -->
177
178```
17968
180```
181
182<!-- livebook:{"offset":3144,"stamp":{"token":"XCP.rEBKR0PbENlE02mf_Mo6R3RTWsHU-tFuA9VTPd907vq3-8e37LytxC6qWBmZAHZHLc_e1t3ZaG85X5KBWsYq0WGEzo7HC0U9-oE0dpPKGKeF7oBGgFeiEoDsX6GDKTwp76o","version":2}} -->