Browse Source

Completed day 10

Tyler Hallada 4 years ago
parent
commit
f5aa9aad9b
5 changed files with 599 additions and 2 deletions
  1. 313 0
      inputs/10.txt
  2. 31 0
      inputs/10_test.txt
  3. 1 0
      inputs/10_test_one.txt
  4. 247 0
      src/day10.rs
  5. 7 2
      src/main.rs

+ 313 - 0
inputs/10.txt

@@ -0,0 +1,313 @@
1
+position=<-52775,  31912> velocity=< 5, -3>
2
+position=<-52816,  10731> velocity=< 5, -1>
3
+position=< 42573, -31652> velocity=<-4,  3>
4
+position=<-31611,  31918> velocity=< 3, -3>
5
+position=< 42585, -31656> velocity=<-4,  3>
6
+position=<-10428,  53102> velocity=< 1, -5>
7
+position=< 31958, -10460> velocity=<-3,  1>
8
+position=<-21020,  10723> velocity=< 2, -1>
9
+position=<-52770,  10731> velocity=< 5, -1>
10
+position=< 21400,  10728> velocity=<-2, -1>
11
+position=<-10427, -42253> velocity=< 1,  4>
12
+position=< 21343,  42515> velocity=<-2, -4>
13
+position=<-10417, -52846> velocity=< 1,  5>
14
+position=< 42558, -42251> velocity=<-4,  4>
15
+position=<-21008,  53106> velocity=< 2, -5>
16
+position=<-10443,  31912> velocity=< 1, -3>
17
+position=<-31584,  31919> velocity=< 3, -3>
18
+position=<-31604,  10726> velocity=< 3, -1>
19
+position=<-52786, -21055> velocity=< 5,  2>
20
+position=<-10394,  31918> velocity=< 1, -3>
21
+position=<-52786,  53109> velocity=< 5, -5>
22
+position=<-52770,  10722> velocity=< 5, -1>
23
+position=<-21007, -10464> velocity=< 2,  1>
24
+position=< 21392, -31657> velocity=<-2,  3>
25
+position=< 53180,  31913> velocity=<-5, -3>
26
+position=<-10393,  21319> velocity=< 1, -2>
27
+position=<-10430,  10724> velocity=< 1, -1>
28
+position=<-20985, -42245> velocity=< 2,  4>
29
+position=<-31610, -10468> velocity=< 3,  1>
30
+position=<-20989, -42247> velocity=< 2,  4>
31
+position=<-21006,  21317> velocity=< 2, -2>
32
+position=< 10752, -31651> velocity=<-1,  3>
33
+position=< 42577,  31912> velocity=<-4, -3>
34
+position=<-42196, -21059> velocity=< 4,  2>
35
+position=< 10744, -10460> velocity=<-1,  1>
36
+position=<-10443, -31658> velocity=< 1,  3>
37
+position=< 53185,  31912> velocity=<-5, -3>
38
+position=<-52790, -21063> velocity=< 5,  2>
39
+position=< 31990, -21060> velocity=<-3,  2>
40
+position=< 10776, -52845> velocity=<-1,  5>
41
+position=<-31636,  21324> velocity=< 3, -2>
42
+position=<-10395, -42249> velocity=< 1,  4>
43
+position=<-31591,  31912> velocity=< 3, -3>
44
+position=<-10430, -21063> velocity=< 1,  2>
45
+position=<-10422,  31912> velocity=< 1, -3>
46
+position=< 10800, -42250> velocity=<-1,  4>
47
+position=<-42199, -42248> velocity=< 4,  4>
48
+position=< 31950,  42515> velocity=<-3, -4>
49
+position=< 31982,  53104> velocity=<-3, -5>
50
+position=< 31982, -52845> velocity=<-3,  5>
51
+position=< 10752,  42510> velocity=<-1, -4>
52
+position=< 31958, -21054> velocity=<-3,  2>
53
+position=< 10752, -10467> velocity=<-1,  1>
54
+position=< 31977, -31649> velocity=<-3,  3>
55
+position=<-10438, -10460> velocity=< 1,  1>
56
+position=<-20983,  10726> velocity=< 2, -1>
57
+position=<-10385,  53109> velocity=< 1, -5>
58
+position=< 42590, -52839> velocity=<-4,  5>
59
+position=<-42180,  21317> velocity=< 4, -2>
60
+position=<-31592, -21063> velocity=< 3,  2>
61
+position=<-52782, -10466> velocity=< 5,  1>
62
+position=<-31604, -42251> velocity=< 3,  4>
63
+position=<-42198, -52848> velocity=< 4,  5>
64
+position=<-31632,  42513> velocity=< 3, -4>
65
+position=<-31601, -10468> velocity=< 3,  1>
66
+position=<-31632,  21320> velocity=< 3, -2>
67
+position=<-52773,  10725> velocity=< 5, -1>
68
+position=<-42205, -10459> velocity=< 4,  1>
69
+position=< 42533,  21322> velocity=<-4, -2>
70
+position=< 53181,  53106> velocity=<-5, -5>
71
+position=< 42533,  53102> velocity=<-4, -5>
72
+position=< 53185, -42248> velocity=<-5,  4>
73
+position=< 10797,  10730> velocity=<-1, -1>
74
+position=< 53137,  21326> velocity=<-5, -2>
75
+position=< 10776,  42508> velocity=<-1, -4>
76
+position=< 21387, -42249> velocity=<-2,  4>
77
+position=< 10805, -42250> velocity=<-1,  4>
78
+position=<-20990,  42512> velocity=< 2, -4>
79
+position=<-52801,  53102> velocity=< 5, -5>
80
+position=< 42554,  53111> velocity=<-4, -5>
81
+position=<-52809,  53106> velocity=< 5, -5>
82
+position=<-31588, -42249> velocity=< 3,  4>
83
+position=<-31595,  31921> velocity=< 3, -3>
84
+position=< 42553, -10468> velocity=<-4,  1>
85
+position=<-52818, -42249> velocity=< 5,  4>
86
+position=<-20999, -42244> velocity=< 2,  4>
87
+position=< 53127,  10731> velocity=<-5, -1>
88
+position=< 21347, -52842> velocity=<-2,  5>
89
+position=<-52794,  21323> velocity=< 5, -2>
90
+position=<-42214,  31912> velocity=< 4, -3>
91
+position=< 42558, -52847> velocity=<-4,  5>
92
+position=<-10414, -42244> velocity=< 1,  4>
93
+position=<-21025,  10728> velocity=< 2, -1>
94
+position=<-10398,  10727> velocity=< 1, -1>
95
+position=<-52794, -21056> velocity=< 5,  2>
96
+position=< 10800,  53103> velocity=<-1, -5>
97
+position=< 42556, -21059> velocity=<-4,  2>
98
+position=<-31610,  42516> velocity=< 3, -4>
99
+position=< 10780,  42507> velocity=<-1, -4>
100
+position=< 31987, -52840> velocity=<-3,  5>
101
+position=< 31952,  53102> velocity=<-3, -5>
102
+position=<-21033, -42250> velocity=< 2,  4>
103
+position=<-52773, -10466> velocity=< 5,  1>
104
+position=<-42199,  42511> velocity=< 4, -4>
105
+position=< 21355, -10467> velocity=<-2,  1>
106
+position=<-21029, -10459> velocity=< 2,  1>
107
+position=<-52775,  10727> velocity=< 5, -1>
108
+position=<-21009,  31915> velocity=< 2, -3>
109
+position=<-10389, -10464> velocity=< 1,  1>
110
+position=< 53156,  31921> velocity=<-5, -3>
111
+position=< 31995,  31920> velocity=<-3, -3>
112
+position=<-31620, -52839> velocity=< 3,  5>
113
+position=< 53158, -31654> velocity=<-5,  3>
114
+position=<-42205,  42512> velocity=< 4, -4>
115
+position=< 31950,  10725> velocity=<-3, -1>
116
+position=<-10430, -42250> velocity=< 1,  4>
117
+position=<-42206,  53102> velocity=< 4, -5>
118
+position=< 42573,  10730> velocity=<-4, -1>
119
+position=<-42178,  53111> velocity=< 4, -5>
120
+position=<-10385,  53106> velocity=< 1, -5>
121
+position=< 31955,  21320> velocity=<-3, -2>
122
+position=< 42558,  10731> velocity=<-4, -1>
123
+position=< 42585, -31656> velocity=<-4,  3>
124
+position=< 42558, -21063> velocity=<-4,  2>
125
+position=<-31612, -10461> velocity=< 3,  1>
126
+position=<-10398,  31921> velocity=< 1, -3>
127
+position=<-52765,  10724> velocity=< 5, -1>
128
+position=< 42553,  53109> velocity=<-4, -5>
129
+position=<-52810, -21061> velocity=< 5,  2>
130
+position=<-42181, -31654> velocity=< 4,  3>
131
+position=<-42175, -21058> velocity=< 4,  2>
132
+position=<-10427, -10468> velocity=< 1,  1>
133
+position=< 42529, -21055> velocity=<-4,  2>
134
+position=< 10752,  53109> velocity=<-1, -5>
135
+position=< 42561,  53107> velocity=<-4, -5>
136
+position=< 31958, -31649> velocity=<-3,  3>
137
+position=< 31968, -21063> velocity=<-3,  2>
138
+position=<-10402, -52840> velocity=< 1,  5>
139
+position=< 42565, -52848> velocity=<-4,  5>
140
+position=< 53184,  31916> velocity=<-5, -3>
141
+position=<-52797,  53111> velocity=< 5, -5>
142
+position=< 42558, -52847> velocity=<-4,  5>
143
+position=<-10394,  53106> velocity=< 1, -5>
144
+position=<-42199, -42252> velocity=< 4,  4>
145
+position=<-31592, -42250> velocity=< 3,  4>
146
+position=< 10765,  53104> velocity=<-1, -5>
147
+position=<-52794,  42509> velocity=< 5, -4>
148
+position=< 21371,  53107> velocity=<-2, -5>
149
+position=<-31616, -21063> velocity=< 3,  2>
150
+position=<-42170,  31913> velocity=< 4, -3>
151
+position=<-42199,  42513> velocity=< 4, -4>
152
+position=< 10797,  53104> velocity=<-1, -5>
153
+position=<-42175,  42511> velocity=< 4, -4>
154
+position=<-20993,  21326> velocity=< 2, -2>
155
+position=<-31588,  42513> velocity=< 3, -4>
156
+position=<-20989,  31919> velocity=< 2, -3>
157
+position=< 53140,  42509> velocity=<-5, -4>
158
+position=< 53172, -10464> velocity=<-5,  1>
159
+position=< 53128,  10724> velocity=<-5, -1>
160
+position=<-31592,  42512> velocity=< 3, -4>
161
+position=< 21347,  10724> velocity=<-2, -1>
162
+position=<-52818, -21058> velocity=< 5,  2>
163
+position=< 10794,  31912> velocity=<-1, -3>
164
+position=<-10414, -52845> velocity=< 1,  5>
165
+position=<-42219,  21326> velocity=< 4, -2>
166
+position=< 31952,  31912> velocity=<-3, -3>
167
+position=<-10413,  42507> velocity=< 1, -4>
168
+position=< 21387, -31657> velocity=<-2,  3>
169
+position=< 42557, -21054> velocity=<-4,  2>
170
+position=<-20997,  53104> velocity=< 2, -5>
171
+position=<-21014, -10468> velocity=< 2,  1>
172
+position=<-10442,  10723> velocity=< 1, -1>
173
+position=< 42572, -21054> velocity=<-4,  2>
174
+position=<-20991, -42249> velocity=< 2,  4>
175
+position=<-10435, -31649> velocity=< 1,  3>
176
+position=< 10770, -10463> velocity=<-1,  1>
177
+position=< 31958,  10730> velocity=<-3, -1>
178
+position=<-21015, -42244> velocity=< 2,  4>
179
+position=<-21039,  53111> velocity=< 2, -5>
180
+position=<-31592,  31919> velocity=< 3, -3>
181
+position=<-21022, -42249> velocity=< 2,  4>
182
+position=< 31966,  10729> velocity=<-3, -1>
183
+position=< 53167, -10468> velocity=<-5,  1>
184
+position=<-42183,  21324> velocity=< 4, -2>
185
+position=< 31955,  31915> velocity=<-3, -3>
186
+position=< 42572,  53111> velocity=<-4, -5>
187
+position=<-42170,  53102> velocity=< 4, -5>
188
+position=< 42590, -10466> velocity=<-4,  1>
189
+position=<-31609,  53106> velocity=< 3, -5>
190
+position=< 42533, -10467> velocity=<-4,  1>
191
+position=<-42215,  10731> velocity=< 4, -1>
192
+position=<-42170,  10722> velocity=< 4, -1>
193
+position=<-21004,  53102> velocity=< 2, -5>
194
+position=< 53167,  10722> velocity=<-5, -1>
195
+position=< 53132, -52844> velocity=<-5,  5>
196
+position=< 42529, -21055> velocity=<-4,  2>
197
+position=< 31960,  21322> velocity=<-3, -2>
198
+position=<-42175,  42507> velocity=< 4, -4>
199
+position=< 21342,  21326> velocity=<-2, -2>
200
+position=<-52774,  31916> velocity=< 5, -3>
201
+position=< 21355, -42248> velocity=<-2,  4>
202
+position=< 53140,  10727> velocity=<-5, -1>
203
+position=< 21368,  21317> velocity=<-2, -2>
204
+position=< 42585, -42246> velocity=<-4,  4>
205
+position=< 10805, -10459> velocity=<-1,  1>
206
+position=< 21383, -52845> velocity=<-2,  5>
207
+position=< 53133, -31649> velocity=<-5,  3>
208
+position=<-31580, -31658> velocity=< 3,  3>
209
+position=< 10792, -10463> velocity=<-1,  1>
210
+position=< 10768, -52840> velocity=<-1,  5>
211
+position=<-10420, -52848> velocity=< 1,  5>
212
+position=<-42203,  31912> velocity=< 4, -3>
213
+position=< 31974, -42245> velocity=<-3,  4>
214
+position=<-52778,  42515> velocity=< 5, -4>
215
+position=<-42170,  53106> velocity=< 4, -5>
216
+position=<-10398, -10462> velocity=< 1,  1>
217
+position=<-52799, -52848> velocity=< 5,  5>
218
+position=<-42175,  42515> velocity=< 4, -4>
219
+position=< 53142, -21059> velocity=<-5,  2>
220
+position=< 10772,  42510> velocity=<-1, -4>
221
+position=< 53137,  42516> velocity=<-5, -4>
222
+position=<-42187, -21062> velocity=< 4,  2>
223
+position=< 10805,  31914> velocity=<-1, -3>
224
+position=< 21348,  10731> velocity=<-2, -1>
225
+position=<-21023,  10726> velocity=< 2, -1>
226
+position=< 31950, -31655> velocity=<-3,  3>
227
+position=<-10386, -31654> velocity=< 1,  3>
228
+position=<-21025, -21062> velocity=< 2,  2>
229
+position=< 31966,  21318> velocity=<-3, -2>
230
+position=<-52776,  31912> velocity=< 5, -3>
231
+position=< 42569, -52841> velocity=<-4,  5>
232
+position=<-31592,  10724> velocity=< 3, -1>
233
+position=<-10429,  21317> velocity=< 1, -2>
234
+position=<-31584,  10729> velocity=< 3, -1>
235
+position=<-52818,  21320> velocity=< 5, -2>
236
+position=<-21016, -10468> velocity=< 2,  1>
237
+position=<-52791,  42507> velocity=< 5, -4>
238
+position=<-42199,  42515> velocity=< 4, -4>
239
+position=< 31982, -10467> velocity=<-3,  1>
240
+position=<-10442, -52848> velocity=< 1,  5>
241
+position=< 42565,  10726> velocity=<-4, -1>
242
+position=<-42187, -10468> velocity=< 4,  1>
243
+position=< 42561, -52841> velocity=<-4,  5>
244
+position=< 42549,  31916> velocity=<-4, -3>
245
+position=< 53180, -52842> velocity=<-5,  5>
246
+position=< 21347,  21326> velocity=<-2, -2>
247
+position=< 53151,  31921> velocity=<-5, -3>
248
+position=< 31938,  10726> velocity=<-3, -1>
249
+position=< 31942, -52848> velocity=<-3,  5>
250
+position=< 10788, -10464> velocity=<-1,  1>
251
+position=< 42590,  53103> velocity=<-4, -5>
252
+position=< 53180, -21055> velocity=<-5,  2>
253
+position=< 31935,  10731> velocity=<-3, -1>
254
+position=<-52802, -31651> velocity=< 5,  3>
255
+position=<-52776, -42249> velocity=< 5,  4>
256
+position=< 53185, -21062> velocity=<-5,  2>
257
+position=< 53159,  42511> velocity=<-5, -4>
258
+position=< 10772,  10722> velocity=<-1, -1>
259
+position=<-31593,  31912> velocity=< 3, -3>
260
+position=< 10795,  21322> velocity=<-1, -2>
261
+position=<-10436, -10459> velocity=< 1,  1>
262
+position=< 21388, -42249> velocity=<-2,  4>
263
+position=<-10405,  31921> velocity=< 1, -3>
264
+position=<-52801,  42513> velocity=< 5, -4>
265
+position=< 42573,  31915> velocity=<-4, -3>
266
+position=< 21355,  53109> velocity=<-2, -5>
267
+position=<-21025,  21323> velocity=< 2, -2>
268
+position=< 53140, -10467> velocity=<-5,  1>
269
+position=<-52767,  10726> velocity=< 5, -1>
270
+position=< 21347,  31912> velocity=<-2, -3>
271
+position=<-42183,  53107> velocity=< 4, -5>
272
+position=< 31942, -10460> velocity=<-3,  1>
273
+position=<-10401,  53102> velocity=< 1, -5>
274
+position=< 21400, -10459> velocity=<-2,  1>
275
+position=< 42579,  10722> velocity=<-4, -1>
276
+position=< 31936,  42516> velocity=<-3, -4>
277
+position=< 53128, -21056> velocity=<-5,  2>
278
+position=<-20997, -42253> velocity=< 2,  4>
279
+position=<-52777, -31658> velocity=< 5,  3>
280
+position=<-10430,  21325> velocity=< 1, -2>
281
+position=< 42545, -10464> velocity=<-4,  1>
282
+position=<-21017, -52839> velocity=< 2,  5>
283
+position=<-31584,  31912> velocity=< 3, -3>
284
+position=< 53168, -21056> velocity=<-5,  2>
285
+position=<-42199, -10459> velocity=< 4,  1>
286
+position=< 10803,  53106> velocity=<-1, -5>
287
+position=< 21371,  21317> velocity=<-2, -2>
288
+position=<-21040, -42244> velocity=< 2,  4>
289
+position=<-31577,  42511> velocity=< 3, -4>
290
+position=< 42573,  21322> velocity=<-4, -2>
291
+position=< 31990,  10728> velocity=<-3, -1>
292
+position=< 53175, -52844> velocity=<-5,  5>
293
+position=< 42561,  21323> velocity=<-4, -2>
294
+position=<-42223, -52840> velocity=< 4,  5>
295
+position=< 53152, -10468> velocity=<-5,  1>
296
+position=<-52785,  53111> velocity=< 5, -5>
297
+position=<-31632, -31656> velocity=< 3,  3>
298
+position=<-21009, -10466> velocity=< 2,  1>
299
+position=<-21025, -31651> velocity=< 2,  3>
300
+position=< 10795,  53106> velocity=<-1, -5>
301
+position=< 31978, -52844> velocity=<-3,  5>
302
+position=<-52774, -21059> velocity=< 5,  2>
303
+position=<-42211, -42253> velocity=< 4,  4>
304
+position=<-31580,  53107> velocity=< 3, -5>
305
+position=< 53172,  53102> velocity=<-5, -5>
306
+position=<-52773,  42508> velocity=< 5, -4>
307
+position=<-10398, -21054> velocity=< 1,  2>
308
+position=<-31607, -10466> velocity=< 3,  1>
309
+position=<-52801,  53108> velocity=< 5, -5>
310
+position=<-52813, -21054> velocity=< 5,  2>
311
+position=<-31600,  42511> velocity=< 3, -4>
312
+position=<-31631,  21317> velocity=< 3, -2>
313
+position=< 42532, -31649> velocity=<-4,  3>

+ 31 - 0
inputs/10_test.txt

@@ -0,0 +1,31 @@
1
+position=< 9,  1> velocity=< 0,  2>
2
+position=< 7,  0> velocity=<-1,  0>
3
+position=< 3, -2> velocity=<-1,  1>
4
+position=< 6, 10> velocity=<-2, -1>
5
+position=< 2, -4> velocity=< 2,  2>
6
+position=<-6, 10> velocity=< 2, -2>
7
+position=< 1,  8> velocity=< 1, -1>
8
+position=< 1,  7> velocity=< 1,  0>
9
+position=<-3, 11> velocity=< 1, -2>
10
+position=< 7,  6> velocity=<-1, -1>
11
+position=<-2,  3> velocity=< 1,  0>
12
+position=<-4,  3> velocity=< 2,  0>
13
+position=<10, -3> velocity=<-1,  1>
14
+position=< 5, 11> velocity=< 1, -2>
15
+position=< 4,  7> velocity=< 0, -1>
16
+position=< 8, -2> velocity=< 0,  1>
17
+position=<15,  0> velocity=<-2,  0>
18
+position=< 1,  6> velocity=< 1,  0>
19
+position=< 8,  9> velocity=< 0, -1>
20
+position=< 3,  3> velocity=<-1,  1>
21
+position=< 0,  5> velocity=< 0, -1>
22
+position=<-2,  2> velocity=< 2,  0>
23
+position=< 5, -2> velocity=< 1,  2>
24
+position=< 1,  4> velocity=< 2,  1>
25
+position=<-2,  7> velocity=< 2, -2>
26
+position=< 3,  6> velocity=<-1, -1>
27
+position=< 5,  0> velocity=< 1,  0>
28
+position=<-6,  0> velocity=< 2,  0>
29
+position=< 5,  9> velocity=< 1, -2>
30
+position=<14,  7> velocity=<-2,  0>
31
+position=<-3,  6> velocity=< 2, -1>

+ 1 - 0
inputs/10_test_one.txt

@@ -0,0 +1 @@
1
+position=< 0,  1> velocity=< 0,  0>

+ 247 - 0
src/day10.rs

@@ -0,0 +1,247 @@
1
+extern crate regex;
2
+
3
+use std::collections::HashSet;
4
+use std::error::Error;
5
+use std::fmt;
6
+use std::fs;
7
+use std::result;
8
+use std::str::FromStr;
9
+
10
+use regex::Regex;
11
+
12
+type Result<T> = result::Result<T, Box<Error>>;
13
+
14
+const INPUT: &str = "inputs/10.txt";
15
+
16
+#[derive(Debug, PartialEq, Clone)]
17
+struct Vector {
18
+    x: i32,
19
+    y: i32,
20
+}
21
+
22
+#[derive(Debug, PartialEq)]
23
+struct Point {
24
+    position: Vector,
25
+    velocity: Vector,
26
+}
27
+
28
+impl FromStr for Point {
29
+    type Err = Box<Error>;
30
+
31
+    fn from_str(s: &str) -> Result<Point> {
32
+        lazy_static! {
33
+            static ref RE: Regex = Regex::new(concat!(
34
+                r"position=<(?P<position_x>(\s|-)?\d+), (?P<position_y>(\s|-)?\d+)> ",
35
+                r"velocity=<(?P<velocity_x>(\s|-)?\d+), (?P<velocity_y>(\s|-)?\d+)>"
36
+            ))
37
+            .unwrap();
38
+        }
39
+
40
+        let captures = match RE.captures(s) {
41
+            None => {
42
+                return Err(From::from("Malformed points, no fields could be found"));
43
+            }
44
+            Some(captures) => captures,
45
+        };
46
+
47
+        Ok(Point {
48
+            position: Vector {
49
+                x: captures["position_x"].trim_start().parse()?,
50
+                y: captures["position_y"].trim_start().parse()?,
51
+            },
52
+            velocity: Vector {
53
+                x: captures["velocity_x"].trim_start().parse()?,
54
+                y: captures["velocity_y"].trim_start().parse()?,
55
+            },
56
+        })
57
+    }
58
+}
59
+
60
+#[derive(Debug, PartialEq)]
61
+struct Sky {
62
+    points: Vec<Point>,
63
+}
64
+
65
+impl FromStr for Sky {
66
+    type Err = Box<Error>;
67
+
68
+    fn from_str(s: &str) -> Result<Sky> {
69
+        Ok(Sky {
70
+            points: s
71
+                .trim_end()
72
+                .split('\n')
73
+                .map(|line| line.parse().unwrap())
74
+                .collect(),
75
+        })
76
+    }
77
+}
78
+
79
+impl Sky {
80
+    fn point_spread(&self) -> (Vector, Vector) {
81
+        let mut min = self.points[0].position.clone();
82
+        let mut max = self.points[0].position.clone();
83
+
84
+        for point in self.points.iter() {
85
+            if point.position.x < min.x {
86
+                min.x = point.position.x;
87
+            }
88
+            if point.position.y < min.y {
89
+                min.y = point.position.y;
90
+            }
91
+            if point.position.x > max.x {
92
+                max.x = point.position.x;
93
+            }
94
+            if point.position.y > max.y {
95
+                max.y = point.position.y;
96
+            }
97
+        }
98
+
99
+        (min, max)
100
+    }
101
+
102
+    fn move_points(&mut self, seconds: i32) {
103
+        for point in self.points.iter_mut() {
104
+            point.position.x += point.velocity.x * seconds;
105
+            point.position.y += point.velocity.y * seconds;
106
+        }
107
+    }
108
+}
109
+
110
+impl fmt::Display for Sky {
111
+    #[allow(clippy::write_with_newline)]
112
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
113
+        let (min, max) = self.point_spread();
114
+        let points_set: HashSet<(i32, i32)> = self
115
+            .points
116
+            .iter()
117
+            .map(|point| (point.position.x, point.position.y))
118
+            .collect();
119
+
120
+        for y in min.y..=max.y {
121
+            for x in min.x..=max.x {
122
+                if points_set.contains(&(x, y)) {
123
+                    write!(f, "#")?;
124
+                } else {
125
+                    write!(f, ".")?;
126
+                }
127
+            }
128
+            write!(f, "\n")?;
129
+        }
130
+        Ok(())
131
+    }
132
+}
133
+
134
+pub fn solve_parts() -> Result<(String, u32)> {
135
+    let mut sky = read_points_file(INPUT)?;
136
+    let (min, max) = sky.point_spread();
137
+    let mut min_spread = Vector {
138
+        x: (max.x - min.x).abs(),
139
+        y: (max.y - min.y).abs(),
140
+    };
141
+    let mut seconds = 0;
142
+
143
+    loop {
144
+        sky.move_points(1);
145
+        let (min, max) = sky.point_spread();
146
+        let spread_x = (max.x - min.x).abs();
147
+        let spread_y = (max.y - min.y).abs();
148
+
149
+        if spread_x > min_spread.x && spread_y > min_spread.y {
150
+            sky.move_points(-1);
151
+            return Ok((format!("{}", &sky), seconds));
152
+        }
153
+
154
+        if spread_x < min_spread.x {
155
+            min_spread.x = spread_x
156
+        }
157
+        if spread_y < min_spread.y {
158
+            min_spread.y = spread_y
159
+        }
160
+        seconds += 1;
161
+    }
162
+}
163
+
164
+fn read_points_file(filename: &str) -> Result<Sky> {
165
+    let points = fs::read_to_string(filename)?;
166
+    Ok(points.parse()?)
167
+}
168
+
169
+#[cfg(test)]
170
+mod tests {
171
+    use super::*;
172
+
173
+    const TEST_INPUT_ONE: &str = "inputs/10_test_one.txt";
174
+    const TEST_INPUT: &str = "inputs/10_test.txt";
175
+    const TEST_POINT: Point = Point {
176
+        position: Vector { x: 0, y: 1 },
177
+        velocity: Vector { x: 0, y: 0 },
178
+    };
179
+    fn test_sky() -> Sky {
180
+        Sky {
181
+            points: vec![TEST_POINT],
182
+        }
183
+    }
184
+
185
+    #[test]
186
+    fn parses_string_to_point() {
187
+        let point = "position=< 0,  1> velocity=< 0,  0>";
188
+        assert_eq!(point.parse::<Point>().unwrap(), TEST_POINT);
189
+    }
190
+
191
+    #[test]
192
+    fn reads_points_file() {
193
+        assert_eq!(read_points_file(TEST_INPUT_ONE).unwrap(), test_sky());
194
+    }
195
+
196
+    #[test]
197
+    fn displays_sky_with_one_point() {
198
+        assert_eq!(format!("{}", test_sky()), ".\n#\n");
199
+    }
200
+
201
+    #[test]
202
+    fn displays_sky() {
203
+        let sky = read_points_file(TEST_INPUT).unwrap();
204
+        print!("{}", &sky);
205
+        assert_eq!(
206
+            format!("{}", sky),
207
+            concat!(
208
+                "........#.............\n",
209
+                "................#.....\n",
210
+                ".........#.#..#.......\n",
211
+                "......................\n",
212
+                "#..........#.#.......#\n",
213
+                "...............#......\n",
214
+                "....#.................\n",
215
+                "..#.#....#............\n",
216
+                ".......#..............\n",
217
+                "......#...............\n",
218
+                "...#...#.#...#........\n",
219
+                "....#..#..#.........#.\n",
220
+                ".......#..............\n",
221
+                "...........#..#.......\n",
222
+                "#...........#.........\n",
223
+                "...#.......#..........\n",
224
+            )
225
+        );
226
+    }
227
+
228
+    #[test]
229
+    fn displays_message_in_sky() {
230
+        let mut sky = read_points_file(TEST_INPUT).unwrap();
231
+        sky.move_points(3);
232
+        print!("{}", &sky);
233
+        assert_eq!(
234
+            format!("{}", sky),
235
+            concat!(
236
+                "#...#..###\n",
237
+                "#...#...#.\n",
238
+                "#...#...#.\n",
239
+                "#####...#.\n",
240
+                "#...#...#.\n",
241
+                "#...#...#.\n",
242
+                "#...#...#.\n",
243
+                "#...#..###\n",
244
+            )
245
+        );
246
+    }
247
+}

+ 7 - 2
src/main.rs

@@ -12,6 +12,7 @@ mod day6;
12 12
 mod day7;
13 13
 mod day8;
14 14
 mod day9;
15
+mod day10;
15 16
 
16 17
 fn main() {
17 18
     // println!("Day 1:");
@@ -38,7 +39,11 @@ fn main() {
38 39
     // println!("Day 8:");
39 40
     // println!("{}", day8::solve_part1().unwrap());
40 41
     // println!("{}", day8::solve_part2().unwrap());
41
-    println!("Day 9:");
42
+    // println!("Day 9:");
42 43
     // println!("{}", day9::solve_part1().unwrap());
43
-    println!("{}", day9::solve_part2().unwrap());
44
+    // println!("{}", day9::solve_part2().unwrap());
45
+    println!("Day 10:");
46
+    let parts = day10::solve_parts().unwrap();
47
+    println!("{}", parts.0);
48
+    println!("{}", parts.1);
44 49
 }