this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 09
4
5```elixir
6Mix.install([
7 {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8])
9```
10
11<!-- livebook:{"output":true} -->
12
13```
14:ok
15```
16
17## Setup
18
19<!-- livebook:{"attrs":{"day":"9","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
20
21```elixir
22{:ok, puzzle_input} =
23 KinoAOC.download_puzzle("2022", "9", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24```
25
26<!-- livebook:{"output":true} -->
27
28```
29{:ok,
30 "L 1\nR 1\nL 1\nU 1\nR 2\nU 1\nD 2\nR 2\nU 1\nD 2\nU 2\nL 2\nD 1\nU 1\nD 2\nL 2\nD 1\nL 2\nD 2\nL 1\nU 2\nR 2\nL 1\nD 2\nL 2\nR 2\nD 2\nL 1\nU 1\nR 1\nU 1\nL 1\nD 1\nR 1\nU 2\nD 2\nR 1\nU 1\nR 1\nL 1\nU 1\nR 1\nD 1\nL 1\nU 1\nR 1\nD 1\nU 1\nD 1\nU 1\nR 2\nL 2\nD 2\nL 2\nR 1\nU 2\nL 2\nR 1\nU 1\nR 2\nD 2\nR 2\nL 2\nU 2\nR 2\nD 2\nR 1\nU 1\nL 2\nR 1\nU 1\nD 2\nU 2\nD 1\nR 2\nL 2\nD 2\nL 2\nR 2\nU 1\nR 2\nL 2\nD 2\nL 1\nD 1\nR 2\nL 1\nU 2\nR 1\nU 2\nD 1\nU 2\nD 1\nL 1\nR 2\nD 2\nR 2\nU 2\nR 1\nU 2\nR 2\nU 1\nR 1\nD 2\nU 2\nR 2\nU 1\nR 2\nD 2\nR 1\nL 1\nU 3\nL 2\nU 1\nL 2\nU 1\nD 1\nU 2\nD 1\nU 2\nR 2\nL 1\nU 3\nR 1\nU 1\nR 3\nL 3\nD 3\nL 2\nU 1\nD 3\nU 1\nR 1\nL 1\nR 2\nL 1\nR 3\nL 3\nD 1\nR 2\nL 3\nU 3\nD 1\nL 2\nU 2\nD 2\nL 2\nU 1\nR 1\nL 2\nR 3\nL 3\nD 3\nR 2\nD 3\nU 1\nL 3\nR 1\nU 2\nL 1\nD 3\nL 1\nU 1\nD 3\nL 3\nU 2\nD 1\nU 2\nL 3\nR 1\nU 2\nD 2\nR 3\nD 3\nU 2\nD 3\nL 3\nR 3\nL 1\nU 3\nL 1\nD 1\nL 2\nD 2\nR 1\nL 3\nR 2\nL 3\nR 3\nL 1\nD 1\nU 3\nL 2\nR 2\nL 2\nD 3\nU 3\nL 3\nU 3\nD 1\nU 2\nR 2\nU 1\nD 3\nL 3\nR 1\nL 3\nU 3\nD 1\nL 3\nD 2\nR 1\nU 1\nR 1\nD 2\nL 2\nU 1\nL 2\nR 2\nL 2\nD 3\nU 3\nD 4\nL 3\nD 4\nR 3\nL 2\nU 3\nR 3\nU 1\nR 4\nU 2\nD 1\nR 3\nL 1\nR 1\nD 3\nR 2\nD 1\nR 2\nL 2\nU 2\nD 1\nR 1\nU 2\nR 3\nL 2\nD 1\nU 3\nR 2\nD 4\nL 3\nU 1\nR 1\nD 2\nU 1\nR 3\nL 4\nD 2\nL 1\nU 3\nL 2\nU 3\nR 1\nD 1\nL 2\nR 4\nD 4\nU 1\nR 3\nU 3\nR 1\nU 3\nL 2\nU 3\nL 2\nD 4\nU 1\nR 1\nL 2\nR 2\nD 2\nL 2\nD 2\nU 4\nD 4\nL 2\nU 2\nD 3\nL 4\nU 4\nD 4\nR 1\nD 4\nR 1\nD 1\nL 1\nR 1\nL 1\nD 2\nL 4\nD 2\nR 3\nL 1\nD 2\nU 3\nL 2\nU 3\nR 4\nD 4\nU 1\nL 1\nU 4\nL 4\nU 3\nD 2\nR 3\nL 1\nD 3\nU 3\nR 1\nL 3\nU 1\nD 1\nR 1\nU 3\nR 2\nL 1\nD 1\nL 3\nU 1\nD 1\nL 2\nR 3\nU 4\nL 5\nD 5\nR 5\nD 3\nU 3\nD 1\nL 5\nR 2\nU 1\nL 2\nD 1\nL 1\nD 4\nR 1\nU 1\nL 1\nU 1\nD 3\nL 4\nD 1\nU 5\nL 1\nR 5\nL 2\nR 4\nD 5\nU 2\nD 3\nU 4\nL 1\nR 2\nU 4\nL 4\nD 3\nR 1\nU 1\nR 3\nD 3\nU 5\nL 3\nD 3\nU 5\nR 4\nL 1\nD 4\nU 1\nL 1\nR 4\nD 5\nL 5\nD 3\nR 5\nU 3\nR 2\nD 2\nU 2\nD 5\nR 5\nD 5\nR 2\nD 5\nU 2\nD 2\nR 1\nL 5\nD 2\nU 2\nR 5\nU 1\nD 5\nU 5\nL 2\nD 5\nL 1\nR 4\nU 4\nD 1\nL 5\nU 4\nL 1\nR 3\nL 3\nR 3\nL 3\nD 3\nR 4\nU 5\nL 2\nD 3\nU 2\nL 1\nR 5\nU 1\nL 3\nU 4\nL 4\nD 4\nR 1\nD 4\nR 5\nD 5\nU 5\nR 5\nL 3\nD 3\nU 2\nR 5\nU 5\nR 2\nD 5\nR 1\nU 2\nD 5\nL 3\nR 5\nU 5\nR 4\nD 6\nL 4\nU 4\nL 6\nR 2\nL 4\nU 5\nL 1\nU 6\nD 4\nR 3\nU 2\nR 1\nD 5\nL 4\nU 2\nR 6\nU 1\nL 2\nD 6\nU 1\nR 2\nL 3\nR 2\nL 5\nU 1\nR 3\nD 3\nL 4\nR 5\nU 1\nD 3\nR 6\nD 5\nR 4\nD 3\nU 2\nD 4\nR 5\nU 4\nR 2\nL 2\nU 5\nD 5\nU 6\nD 4\nU 5\nL 5\nR 1\nD 3\nR 3\nL 3\nD 3\nL 3\nU 6\nR 5\nD 6\nU 5\nL 1\nR 4\nL 1\nU 4\nL 5\nD 5\nU 4\nD 3\nR 3\nL 4\nR 4\nU 6\nL 5\nD 2\nU 3\nR 4\nU 5\nL 5\nD 6\nR 5\nD 5\nL 3\nU 6\nL 3\nU 5\nD 2\nU 4\nR 4\nU 3\nD 1\nR 2\nL 6\nR 2\nL 3\nU 5\nL 1\nR 4\nD 2\nU 5\nD 2\nR 4\nU 6\nR 6\nL 6\nU 6\nL 4\nR 5\nD 3\nU 1\nD 6\nL 1\nD 3\nL 4\nD 6\nU 3\nD 2\nL 2\nU 5\nD 2\nU 5\nD 6\nR 4\nD 1\nU 1\nD 5\nU 1\nL 7\nU 3\nR 3\nU 5\nD 2\nR 7\nD 6\nL 7\nR 6\nL 3\nR 3\nU 1\nL 4\nD 4\nL 6\nR 1\nU 4\nL 3\nR 3\nD 3\nL 2\nD 7\nU 7\nD 7\nR 2\nL 6\nD 2\nR 6\nD 6\nU 5\nL 4\nU 3\nD 6\nU 3\nD 1\nL 7\nU 7\nL 4\nR 3\nD 6\nU 2\nL 6\nD 3\nU 7\nD 2\nR 7\nD 4\nL 4\nR 4\nU 2\nD 3\nU 2\nL 4\nR 4\nL 4\nD 6\nR 4\nU 1\nR 7\nD 7\nU 7\nR 6\nD 4\nU 2\nD 4\nL 5\nU 4\nD 6\nR 4\nU 2\nR 1\nU 4\nD 5\nR 1\nD 7\nR 4\nU 1\nD 4\nU 6\nL 6\nR 1\nD 1\nR 1\nD 6\nR 6\nD 3\nU 1\nD 5\nR 4\nL 1\nD 6\nR 6\nL 8\nU 1\nD 7\nR 4\nL 2\nR 6\nU 7\nL 2\nD 5\nR 6\nD 3\nL 4\nR 5\nU 7\nL 3\nU 8\nL 1\nU 6\nL 8\nR 7\nD 2\nU 3\nR 4\nL 8\nD 4\nL 1\nU 1\nD 7\nU 8\nR 7\nD 2\nL 5\nU 6\nD 7\nR 4\nL 1\nR 3\nU 1\nR 2\nU 1\nD 7\nR 6\nU 7\nD 6\nL 2\nD 8\nU 4\nR 8\nL 5\nD 6\nL 7\nU 7\nR 8\nL 5\nD 5\nR 4\nL 5\nU 8\nD 4\nU 6\nD 2\nU 5\nR 7\nL 8\nU 7\nR 3\nL 8\nR 6\nD 4\nR 2\nD 6\nR 5\nD 2\nU 6\nL 4\nU 8\nR 3\nU 1\nL 6\nR 1\nL 3\nR 1\nU 3\nL 8\nD 5\nU 6\nL 8\nD 6\nR 2\nU 6\nR 4\nL 8\nD 1\nR 6\nD 8\nU 6\nD 6\nL 3\nU 4\nD 2\nL 2\nD 7\nL 5\nU 3\nR 8\nD 6\nR 5\nL 8\nU 5\nL 9\nR 7\nD 5\nR 2\nU 5\nL 3\nD 9\nR 4\nU 1\nL 3\nR 5\nL 7\nR 8\nD 1\nU 4\nL 4\nR 3\nU 8\nL 8\nD 8\nU 9\nR 6\nU 3\nR 2\nU 8\nD 9\nR 3\nL 2\nU 9\nR 9\nL 8\nD 2\nR 1\nL 8\nU 7\nR 3\nL 1\nR 9\nL 4\nR 2\nU 3\nD 8\nR 5\nU 9\nL 9\nR 1\nD 5\nR 5\nU 4\nL 9\nR 6\nD 5\nL 2\nR 6\nU 1\nD 5\nL 3\nR 1\nU 5\nR 4\nD 4\nU 8\nD 2\nU 6\nR 6\nU 5\nR 3\nU 5\nR 5\nL 8\nD 9\nL 7\nR 1\nU 7\nR 5\nU 6\nR 8\nU 2\nR 2\nU 8\nR 7\nD 3\nR 6\nL 8\nR 4\nL 8\nR 8\nU 8\nR 3\nL 3\nU 1\nL 9\nD 9\nR 9\nU 4\nR 1\nL 3\nD 4\nU 5\nR 7\nD 6\nL 9\nU 7\nL 4\nR 8\nU 8\nD 4\nL 5\nD 9\nU 2\nD 9\nR 4\nD 8\nR 8\nD 8\nU 9\nL 6\nR 6\nL 2\nU 9\nL 4\nU 10\nL 1\nR 10\nD 3\nU 6\nR 5\nD 3\nR 4\nL 4\nU 7\nD 9\nR 2\nD 10\nU 9\nL 7\nD 4\nR 2\nL 10\nD 5\nR 5\nU 9\nR 4\nL 7\nR 5\nD 3\nR 6\nD 8\nR 6\nD 10\nR 7\nU 4\nD 5\nU 6\nL 3\nD 3\nU 10\nR 10\nU 10\nD 9\nR 6\nD 2\nR 9\nD 8\nR 7\nU 10\nR 4\nU 6\nR 7\nU 2\nR 5\nU 6\nL 4\nU 8\nL 6\nD 8\nR 2\nU 2\nL 4\nU 4\nR 5\nU 10\nD 8\nU 7\nR 5\nD 3\nL 2\nR 9\nU 10\nL 1\nU 5\nL 1\nD 3\nL 9\nR 9\nU 2\nD 3\nU 8\nR 10\nL 2\nU 9\nD 4\nU 4\nD 10\nL 4\nD 3\nR 3\nL 2\nU 8\nL 4\nD 6\nR 2\nL 3\nD 6\nL 4\nD 5\nL 7\nU 9\nL 3\nD 4\nR 6\nL 10\nU 5\nL 3\nR 3\nD 6\nU 1\nL 3\nR 5\nD 8\nR 11\nU 2\nL 11\nR 7\nU 8\nR 4\nD 4\nU 6\nD 4\nU 9\nD 5\nR 9\nD 9\n" <> ...}
31```
32
33```elixir
34moves =
35 puzzle_input
36 |> String.split("\n", trim: true)
37 |> Enum.map(fn line ->
38 [dir, steps] = String.split(line)
39
40 {dir, String.to_integer(steps)}
41 end)
42```
43
44<!-- livebook:{"output":true} -->
45
46```
47[
48 {"L", 1},
49 {"R", 1},
50 {"L", 1},
51 {"U", 1},
52 {"R", 2},
53 {"U", 1},
54 {"D", 2},
55 {"R", 2},
56 {"U", 1},
57 {"D", 2},
58 {"U", 2},
59 {"L", 2},
60 {"D", 1},
61 {"U", 1},
62 {"D", 2},
63 {"L", 2},
64 {"D", 1},
65 {"L", 2},
66 {"D", 2},
67 {"L", 1},
68 {"U", 2},
69 {"R", 2},
70 {"L", 1},
71 {"D", 2},
72 {"L", 2},
73 {"R", 2},
74 {"D", 2},
75 {"L", 1},
76 {"U", 1},
77 {"R", 1},
78 {"U", 1},
79 {"L", 1},
80 {"D", 1},
81 {"R", 1},
82 {"U", 2},
83 {"D", 2},
84 {"R", 1},
85 {"U", 1},
86 {"R", 1},
87 {"L", 1},
88 {"U", 1},
89 {"R", 1},
90 {"D", 1},
91 {"L", 1},
92 {"U", 1},
93 {"R", 1},
94 {"D", 1},
95 {"U", 1},
96 {"D", ...},
97 {...},
98 ...
99]
100```
101
102```elixir
103defmodule Rope do
104 @start %{x: 0, y: 0}
105
106 defstruct segments: [%{x: 0, y: 0}, %{x: 0, y: 0}]
107
108 def new(length),
109 do: %__MODULE__{segments: List.duplicate(@start, length + 1)}
110
111 def last(%__MODULE__{segments: list}), do: List.last(list)
112
113 def move(%__MODULE__{segments: [%{x: x, y: y} | tails]}, dir) do
114 head =
115 case dir do
116 "U" -> %{x: x + 1, y: y}
117 "D" -> %{x: x - 1, y: y}
118 "L" -> %{x: x, y: y + 1}
119 "R" -> %{x: x, y: y - 1}
120 end
121
122 segments = move_tails([head | tails])
123
124 %__MODULE__{segments: segments}
125 end
126
127 defp move_tails([]), do: []
128 defp move_tails([head]), do: [head]
129
130 # When nothing else moves, then stop
131 defp move_tails([head, tail | _] = rope)
132 when abs(head.x - tail.x) < 2 and abs(head.y - tail.y) < 2,
133 do: rope
134
135 defp move_tails([head, tail | rest])
136 when abs(head.y - tail.y) < 2,
137 do: [head | move_tails([%{x: head.x - sgn(head.x - tail.x), y: head.y} | rest])]
138
139 defp move_tails([head, tail | rest])
140 when abs(head.x - tail.x) < 2,
141 do: [head | move_tails([%{x: head.x, y: head.y - sgn(head.y - tail.y)} | rest])]
142
143 defp move_tails([head, tail | rest]),
144 do: [
145 head
146 | move_tails([%{x: head.x - sgn(head.x - tail.x), y: head.y - sgn(head.y - tail.y)} | rest])
147 ]
148
149 def sgn(0), do: 0
150 def sgn(n) when n < 0, do: -1
151 def sgn(_), do: 1
152end
153```
154
155<!-- livebook:{"output":true} -->
156
157```
158{:module, Rope, <<70, 79, 82, 49, 0, 0, 21, ...>>, {:sgn, 1}}
159```
160
161```elixir
162rope = Rope.new(1)
163
164{_rope, tail_positions} =
165 moves
166 |> Enum.flat_map(fn {dir, steps} -> List.duplicate(dir, steps) end)
167 |> Enum.reduce({rope, MapSet.new([Rope.last(rope)])}, fn dir, {rope, acc} ->
168 new_rope = Rope.move(rope, dir)
169
170 {new_rope, MapSet.put(acc, Rope.last(new_rope))}
171 end)
172
173MapSet.size(tail_positions)
174```
175
176<!-- livebook:{"output":true} -->
177
178```
1795960
180```
181
182## Task 2
183
184```elixir
185rope = Rope.new(9)
186
187{_rope, tail_positions} =
188 moves
189 |> Enum.flat_map(fn {dir, steps} -> List.duplicate(dir, steps) end)
190 |> Enum.reduce({rope, MapSet.new([Rope.last(rope)])}, fn dir, {rope, acc} ->
191 new_rope = Rope.move(rope, dir)
192
193 {new_rope, MapSet.put(acc, Rope.last(new_rope))}
194 end)
195
196MapSet.size(tail_positions)
197```
198
199<!-- livebook:{"output":true} -->
200
201```
2022327
203```