+42
-40
2021/day19.livemd
+42
-40
2021/day19.livemd
···
9
9
```elixir
10
10
# File.read!("day19.txt")
11
11
input =
12
-
File.read!("day19.txt")
12
+
File.read!("2021/day19.txt")
13
13
|> String.split("\n\n")
14
14
|> Enum.map(fn scanner ->
15
15
scanner
···
34
34
34
35
35
```
36
36
37
+
To find rotation of point $b_1$ and $b_2$ around shift point $b_0$
38
+
37
39
$$
38
40
\left\{
39
41
\begin{alignat*}{3}
40
-
b_{x_1} r_x + b_{x_0} = a_{x_1} \\
41
-
b_{x_2} r_x + b_{x_0} = a_{x_2}
42
+
{b_1}_x r_x + {b_0}_x = {a_1}_x \\
43
+
{b_2}_x r_x + {b_0}_x = {a_2}_x
42
44
\end{alignat*}
43
45
\right.
44
46
\left\{
45
47
\begin{alignat*}{3}
46
-
b_{y_1} r_y + b_{y_0} = a_{y_1} \\
47
-
b_{y_2} r_y + b_{y_0} = a_{y_2} \\
48
+
{b_1}_y r_y + {b_0}_y = {a_1}_y \\
49
+
{b_2}_y r_y + {b_0}_y = {a_2}_y \\
48
50
\end{alignat*}
49
51
\right.
50
52
\left\{
51
53
\begin{alignat*}{3}
52
-
b_{z_1} r_z + b_{z_0} = a_{z_1} \\
53
-
b_{z_2} r_z + b_{z_0} = a_{z_2} \\
54
+
{b_1}_z r_z + {b_0}_z = {a_1}_z \\
55
+
{b_2}_z r_z + {b_0}_z = {a_2}_z \\
54
56
\end{alignat*}
55
57
\right.
56
58
$$
···
59
61
This mean that we need to solve:
60
62
61
63
$$
62
-
B_x x + b_0 = a_x \\
63
-
B_y y + b_0 = a_y \\
64
-
B_z z + b_0 = a_z
64
+
B_x r_x + b_0 = a_x \\
65
+
B_y r_y + b_0 = a_y \\
66
+
B_z r_z + b_0 = a_z
65
67
$$
66
68
67
69
Where:
···
71
73
{b_1}_d & 1 \\
72
74
{b_2}_d & 1 \\
73
75
\end{bmatrix}
74
-
d = \begin{bmatrix}
75
-
r_d \\
76
-
b_{d_0}
76
+
b_0 = \begin{bmatrix}
77
+
{b_0}_d \\
78
+
{b_0}_d
77
79
\end{bmatrix}
78
80
a_d = \begin{bmatrix}
79
81
{a_1}_d \\
···
82
84
$$
83
85
84
86
By applying [Cramer's Rule](https://en.wikipedia.org/wiki/Cramer%27s_rule) we can solve these
85
-
linear equations with:
87
+
linear equations with (we are looking for $b_0$ and $r$):
86
88
87
89
$$
88
-
e_d = \frac{
90
+
r_d = \frac{
89
91
\begin{vmatrix}
90
-
{b_1}_d & 1 \\
91
-
{b_2}_d & 1
92
+
{a_1}_d & 1 \\
93
+
{a_2}_d & 1
92
94
\end{vmatrix}
93
95
}{
94
96
\begin{vmatrix}
95
-
{a_1}_d & 1 \\
96
-
{a_2}_d & 1
97
+
{b_1}_d & 1 \\
98
+
{b_2}_d & 1
97
99
\end{vmatrix}
98
-
} = \frac{{b_1}_d - {b_2}_d}{{a_1}_d - {a_2}_d} \\
100
+
} = \frac{{a_1}_d - {a_2}_d}{{b_1}_d - {b_2}_d} \\
99
101
b_{d_0} = \frac{
100
102
\begin{vmatrix}
101
-
{a_1}_d & {b_1}_d \\
102
-
{a_2}_d & {b_2}_d
103
+
{b_1}_d & {a_1}_d \\
104
+
{b_2}_d & {a_2}_d
103
105
\end{vmatrix}
104
106
}{
105
107
\begin{vmatrix}
106
-
{a_1}_d & 1 \\
107
-
{a_2}_d & 1
108
+
{b_1}_d & 1 \\
109
+
{b_2}_d & 1
108
110
\end{vmatrix}
109
-
} = \frac{{a_1}_d {b_2}_d - {b_1}_d {a_2}_d}{{a_1}_d - {a_2}_d}
111
+
} = \frac{{b_1}_d {a_2}_d - {a_1}_d {b_2}_d}{{b_1}_d - {b_2}_d}
110
112
$$
111
113
112
114
```elixir
···
133
135
b_2 = reaxe(select_common(p0, p2), axes)
134
136
135
137
transform =
136
-
for i <- ~w[x y z]a, into: %{} do
137
-
a_1 = a_1[i]
138
-
a_2 = a_2[i]
139
-
b_1 = b_1[i]
140
-
b_2 = b_2[i]
138
+
for d <- ~w[x y z]a, into: %{} do
139
+
a_1 = a_1[d]
140
+
a_2 = a_2[d]
141
+
b_1 = b_1[d]
142
+
b_2 = b_2[d]
141
143
det_b = b_1 - b_2
142
144
r = div(a_1 - a_2, det_b)
143
145
144
146
b_0 = div(b_1 * a_2 - a_1 * b_2, det_b)
145
147
146
-
{i, {r, b_0}}
148
+
{d, {r, b_0}}
147
149
end
148
150
149
151
new_points =
···
210
212
<!-- livebook:{"output":true} -->
211
213
212
214
```
213
-
{:module, Day19, <<70, 79, 82, 49, 0, 0, 26, ...>>, {:pairs, 1}}
215
+
{:module, Day19, <<70, 79, 82, 49, 0, 0, 29, ...>>, {:pairs, 1}}
214
216
```
215
217
216
218
```elixir
···
282
284
<!-- livebook:{"output":true} -->
283
285
284
286
```
285
-
0.002822
287
+
0.005503
286
288
1: {5, 25}
287
-
0.017052
289
+
0.029354
288
290
2: {5, 20}
289
-
0.0355
291
+
0.067284
290
292
3: {7, 13}
291
-
0.134655
293
+
0.195126
292
294
4: {6, 7}
293
-
0.229952
295
+
0.292686
294
296
5: {5, 2}
295
-
0.288351
297
+
0.374403
296
298
6: {1, 1}
297
-
0.076665
299
+
0.074645
298
300
7: {1, 0}
299
-
0.071942
301
+
0.090199
300
302
```
301
303
302
304
<!-- livebook:{"output":true} -->