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