2023 - Day 24
This commit is contained in:
parent
72e4c18b31
commit
fbd9e84f5f
|
@ -8,6 +8,7 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.75"
|
anyhow = "1.0.75"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
|
nalgebra = "0.32.3"
|
||||||
regex = "1.10.2"
|
regex = "1.10.2"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
300
2023/input/24/input
Normal file
300
2023/input/24/input
Normal file
|
@ -0,0 +1,300 @@
|
||||||
|
225004689740965, 150875733412640, 116049940893518 @ 275, 389, 375
|
||||||
|
338282582546422, 191340608518886, 340003210160681 @ -162, 84, -46
|
||||||
|
276063330011297, 506267063607948, 451688278442130 @ -9, -360, -275
|
||||||
|
184895220833040, 346432574551322, 295370687370609 @ 190, -100, -32
|
||||||
|
191652244794317, 228752744289266, 232281189081226 @ -31, 21, 81
|
||||||
|
243836903069805, 200950090690864, 278486291904150 @ -28, 88, 22
|
||||||
|
99537538414359, 156839976263080, 330139497485318 @ 130, 130, -37
|
||||||
|
326389764039501, 504331313318919, 418345965619340 @ -131, -307, -163
|
||||||
|
148876210640065, 290152398181516, 301374612836089 @ 33, -38, 6
|
||||||
|
142515087922560, 255308120704690, 257170878718743 @ 68, 8, 52
|
||||||
|
295642841582982, 242101259588587, 104022418418097 @ -64, 55, 272
|
||||||
|
212300793229561, 261391853816696, 365490993544222 @ 18, 12, -93
|
||||||
|
165229346379582, 248276965460071, 161312784455361 @ 228, 79, 212
|
||||||
|
146531979069180, 97089275376773, 332003690930340 @ 22, 161, -23
|
||||||
|
120800899092132, 184913721524842, 473900231780358 @ 46, 68, -169
|
||||||
|
245193974976343, 210971062189687, 268026939360343 @ -33, 73, 36
|
||||||
|
442753793796843, 328612846899973, 283609914942486 @ -197, 51, -361
|
||||||
|
386255632768587, 458845472549101, 186183322563756 @ -53, -509, 253
|
||||||
|
31284818403777, 378560063574625, 130525938014247 @ 121, -131, 182
|
||||||
|
215792555249349, 255251601506749, 291132823173402 @ 53, 35, -5
|
||||||
|
440576428992381, 341794624061173, 283489603116870 @ -195, -71, -297
|
||||||
|
406821058032927, 358552748013016, 243495622599474 @ -84, -158, 37
|
||||||
|
333985935471117, 348387381803596, 196037336476056 @ 173, -110, 229
|
||||||
|
194315236713487, 480470439040782, 378290083309208 @ 51, -280, -115
|
||||||
|
423624567819357, 338961555301801, 243582531901236 @ 61, -23, -31
|
||||||
|
94275761968037, 416415875088596, 405203801734006 @ 101, -177, -111
|
||||||
|
182423650573104, 175953021338356, 485228050020492 @ 54, 122, -247
|
||||||
|
132946860128942, 343413209165262, 326300668034478 @ 36, -96, -17
|
||||||
|
372535536228591, 339775824243596, 291460134306860 @ -5, -78, -127
|
||||||
|
234895872588063, 62247228662200, 328601789968998 @ -48, 226, -29
|
||||||
|
219739080638176, 286527796435798, 280981600608968 @ 12, -20, 17
|
||||||
|
189527420319587, 44893660278076, 188459541975566 @ 71, 322, 143
|
||||||
|
380267121502632, 171933783462296, 62327709907551 @ -50, 486, 658
|
||||||
|
147002248372043, 129217307469322, 20610734515794 @ 72, 163, 337
|
||||||
|
378116309343993, 323069130988612, 248918730482046 @ 12, -7, 19
|
||||||
|
319333653031698, 278859269969079, 223866268814703 @ 52, 75, 106
|
||||||
|
236992756588085, 304463145397792, 340194522655246 @ -12, -44, -61
|
||||||
|
361033750565555, 283496102799226, 443655113595562 @ -186, -23, -175
|
||||||
|
235897203512717, 294114281232674, 253551760349992 @ -39, -37, 56
|
||||||
|
408102536955573, 333380318039952, 224743862672053 @ 133, 14, 168
|
||||||
|
293102890051939, 344678920502642, 319027665541226 @ -52, -97, -51
|
||||||
|
314560583563263, 247853680623604, 53638099642518 @ 168, 228, 683
|
||||||
|
358957968197762, 345732142415154, 247473914297280 @ 176, -100, 13
|
||||||
|
97749293379345, 58712595993126, 391620120825632 @ 43, 177, -72
|
||||||
|
322867629724035, 340590948643122, 203289896708124 @ 172, -81, 190
|
||||||
|
80125950337563, 291162150272609, 183137679036856 @ 67, -45, 129
|
||||||
|
258374458616771, 177916772961046, 144952832827550 @ -106, 67, 167
|
||||||
|
278357116203837, 305712540709126, 313477667351106 @ 25, -25, -67
|
||||||
|
264809045616867, 264739862065576, 262895162556366 @ 124, 82, 15
|
||||||
|
336748098976080, 273218710413310, 322060564461324 @ 30, 104, -167
|
||||||
|
429928385950838, 314414397421203, 244915322264740 @ -58, 209, -27
|
||||||
|
372274398572112, 231105491529412, 287140067936409 @ -124, 146, -34
|
||||||
|
300041946642210, 361805878294414, 348779219055194 @ 94, -140, -213
|
||||||
|
82333630198830, 239193100253797, 257911560955197 @ 188, 41, 48
|
||||||
|
226279166994495, 154940662484512, 108839076271560 @ -50, 110, 216
|
||||||
|
236988945746136, 219126354714877, 501245149354293 @ -46, 49, -232
|
||||||
|
290809399876260, 49865784333280, 261940365787665 @ 108, 638, 10
|
||||||
|
192479192269869, 89960784106480, 410601225475806 @ 72, 264, -171
|
||||||
|
154572048488187, 298722566659266, 216167781614996 @ 16, -49, 98
|
||||||
|
61402524224229, 314643942049666, 423478145912151 @ 85, -68, -106
|
||||||
|
358766524042277, 346694443835744, 276844061172806 @ -19, -102, -46
|
||||||
|
256397938412229, 266514037892864, 308510441425550 @ -38, 6, -19
|
||||||
|
111247170663991, 233159373163332, 468697849329816 @ 74, 24, -176
|
||||||
|
344810608922213, 303615399145216, 281518317463374 @ -63, -8, -23
|
||||||
|
362788311911379, 251466951828550, 193750060069434 @ -150, 55, 145
|
||||||
|
399463771643109, 390830800397568, 348214912693582 @ -56, -300, -427
|
||||||
|
410955878203009, 271492271760398, 451677568130560 @ -193, 83, -454
|
||||||
|
295197906839637, 437418987102341, 193165330189036 @ -59, -237, 141
|
||||||
|
154537540976799, 195927505433626, 181308919987650 @ 52, 77, 141
|
||||||
|
325985149258473, 250194915217672, 334102012662690 @ 108, 204, -238
|
||||||
|
124543315501773, 231620946800590, 338561758249206 @ 17, 11, -21
|
||||||
|
335269288780847, 561799450130906, 273598366143466 @ -160, -351, 33
|
||||||
|
406349536830357, 371696898098416, 244982099083326 @ -5, -260, 13
|
||||||
|
429820668866290, 271277644477337, 428343413274584 @ -246, 63, -343
|
||||||
|
285494082255787, 310483982523226, 238112394898756 @ 6, -35, 72
|
||||||
|
427654917316453, 283119550914376, 289816166586310 @ -171, 202, -189
|
||||||
|
183305780754531, 169697372808382, 507117795342356 @ -26, 79, -196
|
||||||
|
297993284172727, 148019247408016, 478413943821759 @ -109, 142, -218
|
||||||
|
448790421243093, 337156090194256, 245685544768734 @ -213, 32, -103
|
||||||
|
148786447967448, 318009921450292, 479155605119109 @ 14, -70, -172
|
||||||
|
179096144122083, 244536042632162, 235756205266522 @ 64, 35, 77
|
||||||
|
244534188760433, 150524896619640, 152520925860732 @ -45, 138, 178
|
||||||
|
292496348928869, 340309322862336, 330659178034254 @ -138, -93, -17
|
||||||
|
238428943280004, 398422698354598, 128738013198711 @ 18, -176, 234
|
||||||
|
313779278881410, 287246060199107, 290633760886106 @ -50, 5, -21
|
||||||
|
343288891378891, 429120523686379, 473870061316574 @ -25, -305, -513
|
||||||
|
446216226005587, 312289649316651, 248176797177231 @ -177, 407, -134
|
||||||
|
163307384848257, 225448720602800, 322389319780406 @ 31, 38, -21
|
||||||
|
311268063816389, 463933000929952, 394657123402262 @ -111, -254, -132
|
||||||
|
399765834273075, 254798002778062, 319132923186840 @ -106, 223, -222
|
||||||
|
349356303383841, 65751874037920, 238304141643426 @ 88, 934, 64
|
||||||
|
426197942876982, 275075125500838, 175524119141824 @ -134, 316, 425
|
||||||
|
244846911821769, 323674066198300, 382631479290586 @ -38, -71, -106
|
||||||
|
385903898932938, 293744669483637, 303997079396164 @ 28, 149, -255
|
||||||
|
122406691475152, 265274118970726, 228903355635336 @ 74, -8, 85
|
||||||
|
428147883934287, 336265506735295, 236428743456129 @ -49, -11, 58
|
||||||
|
155366097136407, 212516717519496, 138064536136086 @ 223, 134, 247
|
||||||
|
290272064856077, 53447685751876, 200629668873066 @ -21, 397, 136
|
||||||
|
289398699960341, 335225479948172, 258338577180554 @ -87, -85, 48
|
||||||
|
246644560074906, 346069755754627, 184752533814789 @ -18, -99, 146
|
||||||
|
325161489522083, 312478142191119, 272239125652590 @ 27, -15, -17
|
||||||
|
302526838060353, 250137788997644, 293451658437046 @ 34, 111, -51
|
||||||
|
381454405428627, 309591627716605, 247524198319020 @ -69, 15, 37
|
||||||
|
126242659748529, 415333404708478, 502742367002526 @ 43, -171, -201
|
||||||
|
391122049921137, 340901601859651, 268790805641181 @ 57, -73, -116
|
||||||
|
408757147462249, 380607987804743, 399264436774194 @ -223, -157, -197
|
||||||
|
447450951270780, 284852883292954, 255232938787050 @ -218, 628, -173
|
||||||
|
406627106978321, 345331129547776, 278775433455838 @ -252, -98, 35
|
||||||
|
102526860990768, 109719841541566, 426220057678866 @ 104, 172, -141
|
||||||
|
271417363832745, 226632607078180, 157778251273146 @ -48, 65, 184
|
||||||
|
380523128506570, 154723202351541, 260313283860234 @ 74, 867, -53
|
||||||
|
238921206316929, 132829025707360, 47904689664486 @ 244, 438, 549
|
||||||
|
307266763229071, 270719901259624, 186135881961708 @ 150, 130, 226
|
||||||
|
230319046492045, 395641124538336, 193363618743976 @ 57, -178, 144
|
||||||
|
392920766921985, 250496505188886, 306460703608653 @ -215, 32, -20
|
||||||
|
175231757780249, 44786823183916, 276624943135376 @ 63, 292, 24
|
||||||
|
313832948811675, 318445186003239, 306518285955873 @ 103, -21, -128
|
||||||
|
306551125497277, 524521381609762, 241622859608944 @ -79, -365, 68
|
||||||
|
400554436289624, 347460919638512, 297202409231189 @ 104, -114, -394
|
||||||
|
389736340819305, 335315093086228, 265059063401646 @ -48, -59, -41
|
||||||
|
59503995507231, 201984360420538, 424714963719588 @ 103, 48, -115
|
||||||
|
297143002633785, 96825557449276, 268699929004798 @ -62, 277, 27
|
||||||
|
390931858919397, 287914464138976, 302923821502446 @ -7, 167, -238
|
||||||
|
214729565570253, 278072872648670, 319237187952896 @ 25, -7, -36
|
||||||
|
96351544542113, 114755362054564, 394569159543638 @ 134, 181, -115
|
||||||
|
253200235356037, 258399369622746, 348809514314886 @ 101, 75, -149
|
||||||
|
382994713688163, 275642293727644, 356448448140994 @ -158, 40, -163
|
||||||
|
148649354883135, 340481142733222, 248790450117468 @ 142, -91, 58
|
||||||
|
134854692785701, 187209426614464, 175332404267278 @ 113, 106, 155
|
||||||
|
382031589203352, 338688148083646, 244506915572916 @ -60, -76, 45
|
||||||
|
369770189029605, 317508155457520, 250790362193010 @ 53, 18, 10
|
||||||
|
372683763999567, 414017337323254, 290899929550854 @ 6, -355, -133
|
||||||
|
147854567396103, 296200494966013, 360438786344609 @ 19, -47, -52
|
||||||
|
176792353279606, 312467680727934, 476850067726169 @ -12, -64, -172
|
||||||
|
302158177857665, 261529363847256, 256986683221090 @ -45, 42, 41
|
||||||
|
249078363310055, 282217233889320, 271610559471576 @ -52, -22, 34
|
||||||
|
221596566426841, 219861193819496, 360675578753842 @ -58, 32, -52
|
||||||
|
179819260650432, 199340653470439, 329496686830650 @ -34, 43, -13
|
||||||
|
276958462187159, 486380812406192, 159075856045308 @ -108, -250, 160
|
||||||
|
144557079593697, 131195974673911, 166883422178271 @ 9, 115, 146
|
||||||
|
490712615276709, 481688438412223, 460171428210714 @ -363, -337, -317
|
||||||
|
284673415638495, 320722646046907, 349991504659375 @ -113, -71, -48
|
||||||
|
184676509506952, 270068378274990, 290179021025201 @ -34, -24, 24
|
||||||
|
345990299479461, 297990031232524, 222968799598746 @ -107, -14, 99
|
||||||
|
233819171964981, 152061935722588, 108309431253774 @ -47, 123, 223
|
||||||
|
285477411975405, 291008044172421, 261721579922515 @ -35, -13, 36
|
||||||
|
407602868256117, 224700153604072, 183502997645982 @ -119, 368, 275
|
||||||
|
291327574782249, 286013931920310, 431294230944710 @ -137, -39, -117
|
||||||
|
443300983193571, 324683157114472, 251351540903257 @ -185, 118, -100
|
||||||
|
189572883657070, 462200497610916, 280153455698611 @ 18, -238, 24
|
||||||
|
308690692200416, 333877160265007, 236361595096541 @ 44, -71, 74
|
||||||
|
418654017001235, 348182837861720, 229046306673408 @ 50, -126, 130
|
||||||
|
378681238387569, 296901565820215, 156807910380587 @ -23, 79, 362
|
||||||
|
409371660135117, 326653269520726, 231465493326930 @ 121, 77, 105
|
||||||
|
426752119836365, 343370672093228, 244558686803006 @ -33, -79, -21
|
||||||
|
375852403443021, 293233964850016, 265899535913214 @ 92, 162, -79
|
||||||
|
326707607783589, 316318773568392, 309836065113046 @ 13, -27, -106
|
||||||
|
142911217221157, 261672665797202, 40658695646315 @ 21, -12, 278
|
||||||
|
244255603614037, 327276038377380, 279588160520382 @ 201, -55, -29
|
||||||
|
365680112763191, 94848689754348, 298094328264472 @ 24, 816, -154
|
||||||
|
330900038715639, 333095401980622, 263888598778833 @ -37, -72, 16
|
||||||
|
233128904088757, 257737506484816, 140807291739982 @ -34, 7, 191
|
||||||
|
296148164930181, 562101587574141, 250704068764416 @ -11, -493, 49
|
||||||
|
194944987544711, 293883929666758, 290731532680414 @ -42, -47, 23
|
||||||
|
322305098222037, 370061146918651, 477144215849956 @ -59, -143, -363
|
||||||
|
182728803240756, 281103277585801, 285622771243386 @ 18, -23, 19
|
||||||
|
383519700815905, 345082260451353, 403471475241446 @ -15, -97, -601
|
||||||
|
321303031096657, 382801663317526, 207761312476516 @ -33, -173, 132
|
||||||
|
82652246408061, 397368423356176, 12561618050022 @ 58, -148, 292
|
||||||
|
386132571381159, 290050051464719, 201828131188626 @ 79, 209, 259
|
||||||
|
179334089326071, 197614868629114, 332406359271651 @ -5, 60, -26
|
||||||
|
262093968892863, 107075329722362, 414807233851420 @ 34, 315, -234
|
||||||
|
229016437887321, 253800281514190, 442412418387360 @ -21, 15, -178
|
||||||
|
435464268415533, 304740242014684, 308396918820801 @ -83, 370, -776
|
||||||
|
434507208806365, 509232372383340, 444474239318010 @ -265, -381, -284
|
||||||
|
268752689610051, 291591481519324, 295468449312780 @ 122, 24, -60
|
||||||
|
388988596465428, 462487948867582, 429870272877633 @ -122, -416, -452
|
||||||
|
66784011152624, 361184408854064, 406644902129688 @ 92, -114, -95
|
||||||
|
417437370920109, 239344427883568, 200940613813092 @ 9, 790, 358
|
||||||
|
258122981051685, 455818141956768, 500343012517998 @ -47, -240, -263
|
||||||
|
428885056879621, 395958064188608, 336285404809233 @ -267, -162, -50
|
||||||
|
371904496065333, 505347295365256, 482265546690900 @ -83, -518, -572
|
||||||
|
268921212718412, 421249637667076, 105902059281656 @ -94, -182, 221
|
||||||
|
245666370615068, 296820628562753, 359611784427307 @ 32, -21, -120
|
||||||
|
266636285971089, 251550010433302, 261367259665596 @ -57, 23, 44
|
||||||
|
381991540551663, 283471564116926, 250211504748680 @ 22, 177, 8
|
||||||
|
107026635297788, 445380665254476, 456350458942680 @ 48, -198, -143
|
||||||
|
436947285540239, 350951442595312, 282325390191614 @ -78, -170, -537
|
||||||
|
145398660803727, 195609983658656, 242158434889096 @ 130, 110, 68
|
||||||
|
297475449394982, 131750381092515, 165719703479968 @ -84, 195, 173
|
||||||
|
382981082215082, 318082716962228, 217519872859947 @ -184, -54, 106
|
||||||
|
274508569926281, 337480597564942, 249069272308048 @ 113, -80, 45
|
||||||
|
409006873082037, 404306234256766, 306773089718196 @ 101, -620, -563
|
||||||
|
304326995325327, 252632813540085, 317502450159756 @ -29, 69, -71
|
||||||
|
335336102392062, 349032727458751, 147869871751056 @ -10, -107, 289
|
||||||
|
224490789327707, 138112263823786, 214964316118086 @ -13, 160, 103
|
||||||
|
257483144012212, 310616650691101, 220817557849225 @ 126, -23, 108
|
||||||
|
378616249658565, 487631090875856, 211845741661518 @ -137, -403, 127
|
||||||
|
256962996060820, 363038059754788, 382290100571323 @ 102, -134, -222
|
||||||
|
376113767407764, 419697564588036, 503311772819474 @ -68, -318, -717
|
||||||
|
411690063697784, 334901544443134, 250358939380980 @ -30, -32, -23
|
||||||
|
378730592174173, 292937924939892, 216595109883586 @ -21, 95, 144
|
||||||
|
386233907852537, 102017803023726, 148605073075956 @ -49, 797, 394
|
||||||
|
401023678402335, 326392143373252, 250508593182692 @ -80, -20, 12
|
||||||
|
187386788876757, 222440010076216, 5544716539566 @ 107, 89, 427
|
||||||
|
211506671096437, 295843684641176, 394227297865006 @ 59, -25, -157
|
||||||
|
170237159382989, 228511580730636, 335783635953320 @ 17, 32, -34
|
||||||
|
293589456751485, 294178241627518, 249641359155174 @ -7, -5, 51
|
||||||
|
439854842455119, 383935112515580, 293031876578902 @ -218, -316, -253
|
||||||
|
295518506383932, 200374788948199, 229951840543641 @ -114, 71, 84
|
||||||
|
394189872421409, 331448531001974, 256407864771135 @ -31, -36, -20
|
||||||
|
311925984995885, 332357949681136, 293917117060350 @ 30, -68, -59
|
||||||
|
389447608973881, 380513707763144, 244720406589022 @ -126, -192, 51
|
||||||
|
366016540138437, 277293281705376, 413687743953006 @ 130, 233, -794
|
||||||
|
298178291530224, 268217681216719, 304180593974067 @ -38, 31, -38
|
||||||
|
308018243676123, 296892693397840, 274894177156788 @ -130, -42, 32
|
||||||
|
60232254901961, 170686288518732, 262671045190162 @ 89, 74, 51
|
||||||
|
124745624448567, 151652758178730, 163358199121217 @ 31, 96, 150
|
||||||
|
321860786503481, 302448169248892, 261445808573098 @ -12, -5, 20
|
||||||
|
205692521446297, 89407037159596, 410049214010034 @ 36, 247, -158
|
||||||
|
239982788772333, 137286217774368, 174295345603502 @ -56, 138, 147
|
||||||
|
86731844681439, 259688488792764, 210340217835198 @ 70, -12, 103
|
||||||
|
170808423768189, 228588666791260, 293948466808818 @ 19, 33, 12
|
||||||
|
441057939686395, 343398690648711, 549228030221401 @ -265, -93, -736
|
||||||
|
302443946246812, 240143840858176, 379420862083931 @ -22, 94, -186
|
||||||
|
345088720716403, 315552253051151, 268545755397918 @ 159, 27, -65
|
||||||
|
423724795313077, 308659354107536, 180782338151766 @ -63, 186, 493
|
||||||
|
406798864217260, 293663253737166, 320278735045387 @ -88, 132, -304
|
||||||
|
195154781190237, 364862205409626, 254799516896806 @ -47, -117, 59
|
||||||
|
178932977335797, 251708835992206, 247843728908376 @ 45, 19, 62
|
||||||
|
253349271834117, 283691186580304, 303498852558606 @ -9, -9, -21
|
||||||
|
376761673051257, 285602705599686, 270257629743006 @ -41, 101, -41
|
||||||
|
300882491178039, 290243550583162, 189772203039720 @ -68, -15, 146
|
||||||
|
235369194657157, 421562658281976, 408227743490686 @ -55, -183, -115
|
||||||
|
188646633711105, 318918710332479, 369157982422215 @ 73, -61, -110
|
||||||
|
395512774201357, 315616825750976, 285497663723286 @ 96, 102, -266
|
||||||
|
421677117457729, 302462002478370, 260176983480688 @ -57, 221, -114
|
||||||
|
177175197731565, 341281080915196, 331441656855726 @ 43, -93, -41
|
||||||
|
325478665927397, 441871023252256, 224988749860460 @ 21, -338, 102
|
||||||
|
402136003642932, 333799366036756, 296817265196841 @ 8, -30, -290
|
||||||
|
182104997730129, 336028786762480, 74550271859558 @ 52, -86, 285
|
||||||
|
292043981673693, 259010054670568, 310880696340486 @ -98, 9, -16
|
||||||
|
327463887597202, 275386444030262, 281725872502210 @ 96, 120, -69
|
||||||
|
180350572694521, 204046517624548, 270869833505754 @ 15, 64, 37
|
||||||
|
261796476524925, 143723242270984, 124690998413814 @ -90, 121, 198
|
||||||
|
382022380467301, 363084132643328, 342504705272910 @ -51, -159, -293
|
||||||
|
359686755049611, 309851948068594, 254216163279732 @ 18, 21, 12
|
||||||
|
432383902550757, 325288945907500, 237103658765274 @ -139, 49, 58
|
||||||
|
199141995287962, 12205123960005, 135322914113123 @ 276, 653, 302
|
||||||
|
388209037680334, 326840502219633, 280212599819923 @ 90, 11, -192
|
||||||
|
398309490013959, 467459019065502, 435027019897864 @ -245, -216, -115
|
||||||
|
438077885264229, 338437435266016, 251421696960654 @ -147, -33, -83
|
||||||
|
142623030672997, 313922309635776, 172051026248046 @ 197, -48, 178
|
||||||
|
211793103082053, 258637524078497, 413519499042315 @ -11, 5, -134
|
||||||
|
316227539793914, 330807868031342, 320059762270916 @ -90, -76, -51
|
||||||
|
363745515105897, 308033947226491, 241876133298636 @ 9, 29, 53
|
||||||
|
229073101043463, 182441744874760, 375616182031518 @ -6, 114, -105
|
||||||
|
311663766702322, 293169473612442, 266993157354132 @ -64, -12, 25
|
||||||
|
165743821901955, 245775966807730, 293803407552466 @ 40, 19, 9
|
||||||
|
349142785799508, 280261145006550, 287389255673128 @ 124, 164, -135
|
||||||
|
299220074031339, 172470550513459, 207086145840829 @ -65, 163, 120
|
||||||
|
51599932704531, 110067755093612, 120750763264579 @ 187, 186, 216
|
||||||
|
362339688007455, 128526862135900, 213561367782111 @ 123, 898, 174
|
||||||
|
318235966547318, 236743583502987, 172190463362498 @ -150, 21, 147
|
||||||
|
243218064862137, 146112647037076, 312898709705706 @ -12, 173, -28
|
||||||
|
248532762868587, 127913038997386, 306713186523936 @ -89, 124, 5
|
||||||
|
356833591049452, 288318963368346, 175747488009196 @ -36, 56, 237
|
||||||
|
429258217460035, 281264286545936, 199918966637106 @ -81, 462, 379
|
||||||
|
288595615758281, 286112367984743, 301320148789454 @ 17, 15, -49
|
||||||
|
434137829300957, 385164566787576, 251517643175406 @ -90, -513, -101
|
||||||
|
226684015769909, 393228920796224, 237234101626834 @ 5, -162, 75
|
||||||
|
277608974085399, 484613028229744, 346163443971816 @ -86, -266, -56
|
||||||
|
439564663355742, 339477585210058, 360927913554417 @ -264, -84, -224
|
||||||
|
243540738730971, 359735080690960, 250444934709888 @ -65, -114, 61
|
||||||
|
414936626664123, 309300663907822, 216629185840824 @ -56, 125, 188
|
||||||
|
397872703252389, 212898395772056, 240610671804790 @ -131, 297, 60
|
||||||
|
123154693229737, 203455201989076, 290045021180228 @ 51, 52, 20
|
||||||
|
268437039198703, 312957758717668, 372983507517126 @ -58, -56, -101
|
||||||
|
290041101495914, 452525408726809, 261168521158394 @ 18, -305, 27
|
||||||
|
94022340218020, 214444823962799, 233285115180485 @ 78, 39, 80
|
||||||
|
187758784146701, 308231925236552, 42842321977264 @ 17, -54, 306
|
||||||
|
298993330355122, 276052686620461, 298685552862006 @ -10, 31, -41
|
||||||
|
332169842700025, 298970888104540, 302981537331018 @ -70, -11, -50
|
||||||
|
194328822595255, 76283873425353, 136668594275728 @ 239, 459, 281
|
||||||
|
120250832193905, 241032280181964, 229456138785466 @ 50, 11, 84
|
||||||
|
151422919814977, 301022504515816, 378981998111542 @ 111, -38, -117
|
||||||
|
96990387183037, 372867516983776, 14714289836806 @ 168, -134, 366
|
||||||
|
274942199061477, 481640626788556, 14527007819946 @ -11, -317, 432
|
||||||
|
224838145952262, 313821556817251, 263551720120806 @ 14, -55, 39
|
||||||
|
403167845873627, 244787413886076, 196299464895806 @ -30, 432, 279
|
||||||
|
423651938100112, 435225368641841, 336353363207841 @ -264, -201, -38
|
||||||
|
289166585859768, 74894176976193, 138452721266517 @ 130, 605, 328
|
||||||
|
431669875459573, 325370084156409, 252462190860946 @ -27, 143, -141
|
||||||
|
390448274978984, 338265610742420, 231189470189675 @ 98, -54, 98
|
||||||
|
237855310336712, 79275006966921, 512264534723696 @ -64, 191, -223
|
||||||
|
430777549022346, 301130642558299, 294289756858713 @ -166, 153, -262
|
||||||
|
222272412127973, 253877615323776, 267895382908238 @ 18, 27, 33
|
||||||
|
165432519670262, 95007658128776, 226194378092481 @ 24, 182, 88
|
||||||
|
281007118242885, 330242484331812, 296563154696266 @ -35, -75, -16
|
||||||
|
359290360054469, 394969290711776, 300557072988910 @ -60, -223, -88
|
5
2023/input/24/test-1
Normal file
5
2023/input/24/test-1
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
19, 13, 30 @ -2, 1, -2
|
||||||
|
18, 19, 22 @ -1, -1, -2
|
||||||
|
20, 25, 34 @ -2, -2, -4
|
||||||
|
12, 31, 28 @ -1, -2, -1
|
||||||
|
20, 19, 15 @ 1, -5, -3
|
221
2023/src/bin/day24.rs
Normal file
221
2023/src/bin/day24.rs
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
#![feature(test)]
|
||||||
|
extern crate nalgebra as na;
|
||||||
|
use std::{str::FromStr, convert::Infallible, collections::HashMap};
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use aoc::Solver;
|
||||||
|
use na::{SMatrix, SVector};
|
||||||
|
|
||||||
|
// -- Runners --
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
Day::solve()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_test1() -> Result<()> {
|
||||||
|
Day::test(Day::part1, "test-1", 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_solution() -> Result<()> {
|
||||||
|
Day::test(Day::part1, "input", 13149)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_test1() -> Result<()> {
|
||||||
|
Day::test(Day::part2, "test-1", 47)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_solution() -> Result<()> {
|
||||||
|
Day::test(Day::part2, "input", 1033770143421619)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Benchmarks
|
||||||
|
extern crate test;
|
||||||
|
#[bench]
|
||||||
|
#[ignore]
|
||||||
|
fn part1_bench(b: &mut test::Bencher) {
|
||||||
|
Day::benchmark(Day::part1, b)
|
||||||
|
}
|
||||||
|
#[bench]
|
||||||
|
#[ignore]
|
||||||
|
fn part2_bench(b: &mut test::Bencher) {
|
||||||
|
Day::benchmark(Day::part2, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
struct Hailstone {
|
||||||
|
px: f64,
|
||||||
|
py: f64,
|
||||||
|
pz: f64,
|
||||||
|
vx: f64,
|
||||||
|
vy: f64,
|
||||||
|
vz: f64
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hailstone {
|
||||||
|
fn intersect_2d(&self, other: &Hailstone) -> Option<(f64, f64)> {
|
||||||
|
let dx = self.px - other.px;
|
||||||
|
let dy = self.py - other.py;
|
||||||
|
|
||||||
|
let d = self.vy * other.vx - self.vx * other.vy;
|
||||||
|
|
||||||
|
let t1 = (other.vy*dx - other.vx * dy) / d;
|
||||||
|
let t2 = (self.vy * dx - self.vx*dy) / d;
|
||||||
|
|
||||||
|
if t1.is_sign_negative() || t2.is_sign_negative() {
|
||||||
|
// Intersection is in the past
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = self.px + self.vx * t1;
|
||||||
|
let y = self.py + self.vy * t1;
|
||||||
|
|
||||||
|
if x.is_infinite() || y.is_infinite() {
|
||||||
|
// Paths are parallel
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some((x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Hailstone {
|
||||||
|
type Err = Infallible;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let parts: Vec<f64> = s.split([',', '@']).map(|part| part.trim().parse().unwrap()).collect();
|
||||||
|
|
||||||
|
Ok(Hailstone {
|
||||||
|
px: parts[0],
|
||||||
|
py: parts[1],
|
||||||
|
pz: parts[2],
|
||||||
|
vx: parts[3],
|
||||||
|
vy: parts[4],
|
||||||
|
vz: parts[5],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mode(numbers: &[usize]) -> usize {
|
||||||
|
let mut occurrences = HashMap::<_, usize>::new();
|
||||||
|
|
||||||
|
for &value in numbers {
|
||||||
|
*occurrences.entry(value).or_insert(0) += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{occurrences:?}");
|
||||||
|
|
||||||
|
occurrences.into_iter().max_by_key(|&(_, count)| count).map(|(value, _)| value).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Solution --
|
||||||
|
pub struct Day;
|
||||||
|
impl aoc::Solver for Day {
|
||||||
|
type Output1 = usize;
|
||||||
|
type Output2 = usize;
|
||||||
|
|
||||||
|
fn day() -> u8 {
|
||||||
|
24
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> Self::Output1 {
|
||||||
|
let hailstones: Vec<_> = input.lines().flat_map(Hailstone::from_str).collect();
|
||||||
|
|
||||||
|
let range = if hailstones.len() == 5 {
|
||||||
|
7.0..=27.0
|
||||||
|
} else {
|
||||||
|
200000000000000.0..=400000000000000.0
|
||||||
|
};
|
||||||
|
|
||||||
|
hailstones.iter().enumerate().flat_map(|(index_a, a)| {
|
||||||
|
hailstones.iter().enumerate().filter(|(index_b, _)| index_b < &index_a).filter_map(|(_, b)| {
|
||||||
|
a.intersect_2d(b)
|
||||||
|
}).collect::<Vec<_>>()
|
||||||
|
}).filter(|&(x, y)| range.contains(&x) && range.contains(&y)).count()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> Self::Output2 {
|
||||||
|
let h: Vec<_> = input.lines().flat_map(Hailstone::from_str).collect();
|
||||||
|
|
||||||
|
// Key insight for part 2 is
|
||||||
|
// p_rock + v_rock * t_i = p_i + v_i * t_i
|
||||||
|
// for every hailstone i
|
||||||
|
//
|
||||||
|
// This can be rewritten as
|
||||||
|
// p_rock - p_i = t_i * (v_i - v_rock)
|
||||||
|
// and since t_i is a scalar this means that
|
||||||
|
// (p_rock - p_i) is parallel to (v_i - v_rock)
|
||||||
|
// and therefore
|
||||||
|
// c_i = (p_rock - p_i) x (v_i - v_rock) = 0
|
||||||
|
// This holds true for every hailstone i, so
|
||||||
|
// c_i = c_j
|
||||||
|
// c_i = c_k
|
||||||
|
// with i != j != k
|
||||||
|
// Writing out these equations leads to a set of six linear equations
|
||||||
|
// And can therefore be written in matrix form
|
||||||
|
// A * solution = constant
|
||||||
|
// And the solution can now be found using
|
||||||
|
// solution = A^-1 * constant
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
let j = 1;
|
||||||
|
// Due to numerical instability we run this with several different options for the third
|
||||||
|
// hailstone
|
||||||
|
let solutions: Vec<_> = (2..h.len()).map(|k| {
|
||||||
|
// Constant in the matrix
|
||||||
|
let c1 = h[i].vz - h[j].vz;
|
||||||
|
let c2 = h[i].py - h[j].py;
|
||||||
|
let c3 = h[j].vy - h[i].vy;
|
||||||
|
let c4 = h[j].pz - h[i].pz;
|
||||||
|
let c5 = h[i].vx - h[j].vx;
|
||||||
|
let c6 = h[j].px - h[i].px;
|
||||||
|
|
||||||
|
let c7 = h[i].vz - h[k].vz;
|
||||||
|
let c8 = h[i].py - h[k].py;
|
||||||
|
let c9 = h[k].vy - h[i].vy;
|
||||||
|
let c10 = h[k].pz - h[i].pz;
|
||||||
|
let c11 = h[i].vx - h[k].vx;
|
||||||
|
let c12 = h[k].px - h[i].px;
|
||||||
|
|
||||||
|
// Setup the matrix
|
||||||
|
let matrix = SMatrix::<f64, 6, 6>::new(
|
||||||
|
0.0, c1, c3, 0.0, c4, c2,
|
||||||
|
-c1, 0.0, c5, -c4, 0.0, c6,
|
||||||
|
-c3, -c5, 0.0, -c2, -c6, 0.0,
|
||||||
|
0.0, c7, c9, 0.0, c10, c8,
|
||||||
|
-c7, 0.0, c11, -c10, 0.0, c12,
|
||||||
|
-c9, -c11, 0.0, -c8, -c12, 0.0
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get the inverse of the matrix
|
||||||
|
let inverse = matrix.try_inverse().unwrap();
|
||||||
|
|
||||||
|
// Constant on the rhs
|
||||||
|
let k1 = h[i].py*h[i].vz - h[j].py*h[j].vz + h[j].pz*h[j].vy - h[i].pz*h[i].vy;
|
||||||
|
let k2 = h[i].pz*h[i].vx - h[j].pz*h[j].vx + h[j].px*h[j].vz - h[i].px*h[i].vz;
|
||||||
|
let k3 = h[i].px*h[i].vy - h[j].px*h[j].vy + h[j].py*h[j].vx - h[i].py*h[i].vx;
|
||||||
|
let k4 = h[i].py*h[i].vz - h[k].py*h[k].vz + h[k].pz*h[k].vy - h[i].pz*h[i].vy;
|
||||||
|
let k5 = h[i].pz*h[i].vx - h[k].pz*h[k].vx + h[k].px*h[k].vz - h[i].px*h[i].vz;
|
||||||
|
let k6 = h[i].px*h[i].vy - h[k].px*h[k].vy + h[k].py*h[k].vx - h[i].py*h[i].vx;
|
||||||
|
|
||||||
|
// Put them into a vector
|
||||||
|
let k = SVector::<f64, 6>::new(k1, k2, k3, k4, k5, k6);
|
||||||
|
|
||||||
|
// Calclate the solution
|
||||||
|
let solution = inverse * k;
|
||||||
|
|
||||||
|
// The sum of all elements of the starting position is the answer
|
||||||
|
(solution[0] + solution[1] + solution[2]).round() as usize
|
||||||
|
}).collect();
|
||||||
|
|
||||||
|
// The most common solution is the actual solution
|
||||||
|
mode(&solutions)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user