adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
2494a9301f12add6a20594d3841e7fd76daf513c
parent
557e065dfb9cbb60a158ee15cd4809662a302f9e
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-01-03 15:44
2023-12-24

Diffstat

A 2023/24/input.txt 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/24/solution.rs 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/24/test.txt 5 +++++

3 files changed, 448 insertions, 0 deletions


diff --git a/2023/24/input.txt b/2023/24/input.txt

@@ -0,0 +1,300 @@
   -1     1 171178400007298, 165283791547432, 246565404194007 @ 190, 186, 60
   -1     2 250314870325177, 283762496814661, 272019235409859 @ 45, 15, 8
   -1     3 192727134181171, 456146317292988, 246796112051543 @ 22, -541, -70
   -1     4 242038752891431, 261287367655768, 330425420730235 @ 78, 27, -72
   -1     5 249342048426189, 348510396766234, 427773639329931 @ 16, -87, -346
   -1     6 353441545792997, 364847375466922, 274271275093711 @ -21, -148, 41
   -1     7 216330477538611, 390430996586104, 203558565797057 @ 88, -177, 135
   -1     8 217302962030132, 371849389666656, 389893932942344 @ -40, -94, -643
   -1     9 338035472989565, 290563655386666, 254888162205547 @ 15, -70, 68
   -1    10 135127435297741, 227334267994754, 56493469425395 @ 253, 118, 398
   -1    11 510490096303092, 286748658546796, 278346699011239 @ -252, -42, 28
   -1    12 245658192691337, 126219744558382, 289693949229921 @ 59, 282, -19
   -1    13 357218912023661, 210523813846414, 384706067363023 @ -7, 18, -74
   -1    14 196873545687587, 438027207999086, 268959231970119 @ -130, -598, -382
   -1    15 262527946671126, 48899071218248, 286155563522113 @ 28, 422, -14
   -1    16 168154171358017, 420211601846074, 298149145394039 @ 124, -456, -703
   -1    17 154460841373625, 50680906240460, 207768347612603 @ 215, 233, 120
   -1    18 237198500307821, 225124739533042, 372652743078019 @ -49, 373, -413
   -1    19 204999882972437, 411538300719986, 184551075701619 @ 128, -215, 165
   -1    20 330789988838027, 246547730418451, 293357309177197 @ -21, 15, 6
   -1    21 223467886869107, 301561070815154, 197296607248067 @ 104, -32, 140
   -1    22 384954918106030, 330771529215945, 508240983285145 @ -164, -79, -374
   -1    23 271097685713361, 295712012768378, 249718729161719 @ 51, -44, 62
   -1    24 178684585963757, 362144185513786, 225314309910739 @ -57, 230, -39
   -1    25 418637268959555, 377487863133928, 293747117350375 @ -98, -163, 18
   -1    26 280092460748739, 462754349746048, 353091167835528 @ 15, -294, -111
   -1    27 216390225172040, 367465542440328, 218345068257461 @ 8, -94, 98
   -1    28 417595578878351, 402066957298642, 400128913186903 @ -94, -192, -106
   -1    29 299195153691003, 292811179530154, 254092309725861 @ -62, 12, 35
   -1    30 179839211875757, 377887013577494, 220248131077276 @ -31, -16, 43
   -1    31 394589858277039, 299603683514093, 252398726668981 @ -125, -49, 58
   -1    32 350409639365638, 244977830805217, 355725007865484 @ -68, 33, -93
   -1    33 193677818367485, 363877188377834, 228578856674603 @ -25, 11, 15
   -1    34 306774715344789, 244484532681234, 474507959356871 @ 13, 16, -234
   -1    35 195634259420576, 335226862228994, 278068905197560 @ 122, -44, -41
   -1    36 194087659508123, 326990809559746, 168482058057403 @ 70, 80, 296
   -1    37 278475577441770, 215123100400185, 511755848090466 @ -14, 151, -445
   -1    38 222746690923202, 80409876651304, 288137052658270 @ 124, 238, 13
   -1    39 181340521167407, 356533948860748, 223376905651213 @ 114, -27, 73
   -1    40 366866994160937, 255403921740721, 313314400988479 @ -51, -9, -12
   -1    41 206303435821492, 345365299173321, 223794996589989 @ -20, 47, 66
   -1    42 387296718335393, 139326903697078, 401196960092255 @ -13, 66, -70
   -1    43 287017680190845, 246796186661923, 264719181979212 @ -47, 111, 11
   -1    44 264241831695917, 326931419123518, 243001990230367 @ -51, -19, 41
   -1    45 232710090210763, 434974624723869, 554896964146369 @ -17, -313, -938
   -1    46 170435042678291, 184601280160256, 348165154390189 @ 188, 215, -143
   -1    47 181632715199687, 355145293694416, 234453059649799 @ 74, 43, -10
   -1    48 477058810408049, 181906508412616, 277357464823330 @ -139, 50, 43
   -1    49 229951888005285, 316805144481786, 278158183109639 @ 21, 20, -58
   -1    50 450488216899277, 255126885144146, 352856048197715 @ -121, -25, -45
   -1    51 225598205443917, 243024191967018, 242995619031659 @ 24, 236, 32
   -1    52 255110587440941, 80838489106798, 383612363189927 @ 101, 171, -79
   -1    53 340215164932672, 440964542080834, 294200813226322 @ -56, -252, -5
   -1    54 309967849200329, 273421115262799, 370435419002329 @ 45, -51, -58
   -1    55 262529576604374, 364808856986216, 170351277757765 @ -58, -110, 226
   -1    56 221603381404287, 179413998943388, 317854638947211 @ 84, 247, -96
   -1    57 180889179692325, 316580512810900, 136376463248283 @ 13, 507, 824
   -1    58 424085370870509, 188251152457546, 281006551182763 @ -77, 40, 40
   -1    59 209562508983989, 301428518622118, 221974573745539 @ 77, 58, 92
   -1    60 338895833346416, 160224363933955, 308628157271113 @ 30, 51, 18
   -1    61 171903931717117, 355552441835566, 256714695985809 @ 145, 6, -105
   -1    62 176962845790328, 473059752967050, 220556402610563 @ 50, -916, 56
   -1    63 443007005776517, 457883536897906, 282749138372395 @ -156, -265, 24
   -1    64 452050976493113, 252737975726971, 230863207496443 @ -75, -45, 96
   -1    65 242308105688579, 296547755331841, 327822409163944 @ -65, 135, -263
   -1    66 382022547520677, 341519047742211, 331599836695789 @ -167, -95, -86
   -1    67 301456143949541, 292282047195586, 256192005940687 @ -5, -30, 49
   -1    68 234459985070789, 47655348757585, 143663381853745 @ 105, 297, 210
   -1    69 234234261207416, 405322625682766, 159106518545521 @ 98, -200, 194
   -1    70 191260521251342, 377145142428076, 383881362481381 @ 144, -150, -234
   -1    71 199215371791316, 415021238004643, 203005883766025 @ 118, -233, 138
   -1    72 276777919084051, 353026260788316, 232186402947397 @ -48, -95, 73
   -1    73 191703596963979, 375127419551047, 268806555888646 @ -17, -63, -269
   -1    74 436058213093331, 287292113684808, 180143624728097 @ -90, -67, 149
   -1    75 174822345871389, 387840727799466, 237984716063787 @ 132, -160, -6
   -1    76 330333551322585, 245768192841163, 357469574061115 @ 37, -33, -32
   -1    77 171014922240599, 168263331913763, 334220154545293 @ 191, 167, -74
   -1    78 438641441331191, 403546081173220, 320548896476656 @ -125, -194, -15
   -1    79 248081810807522, 443445824736136, 262227550578049 @ 20, -290, 10
   -1    80 175013712193887, 393720484845811, 215970602732519 @ -65, -213, 84
   -1    81 198122424277694, 87864281467192, 203048431512895 @ 168, 142, 124
   -1    82 178284087415295, 373664362784984, 217047454733061 @ -10, 31, 81
   -1    83 238660765948958, 316720980877558, 283543165071646 @ 36, -16, -39
   -1    84 162761644889659, 336124673178028, 176876070644717 @ 162, 603, 639
   -1    85 182113485479617, 262911785028666, 138658862601279 @ 90, 496, 509
   -1    86 202842404984285, 284636040754405, 351437669308258 @ 113, 57, -191
   -1    87 444550376319237, 236037143849191, 483216669107779 @ -71, -27, -152
   -1    88 289261508457377, 285916432040656, 284993888368039 @ -19, 6, -12
   -1    89 319111420060321, 395543592300380, 243460184781629 @ -93, -187, 57
   -1    90 165298073303873, 386089020274516, 218084317326433 @ 117, -90, 54
   -1    91 214300480112602, 399712128562184, 226388990755437 @ -56, -218, 54
   -1    92 175391069836670, 418704739624528, 230516507196943 @ -80, -666, -180
   -1    93 309873063168477, 357049146661503, 367653729430136 @ 49, -143, -51
   -1    94 298491513556625, 100592193274472, 38014414128269 @ 71, 109, 287
   -1    95 406390334957789, 226495634470330, 242283367727339 @ -145, 57, 72
   -1    96 307833328600365, 323674186958190, 225594296070431 @ 37, -101, 99
   -1    97 524916260724415, 319237286182938, 414039952164951 @ -234, -92, -130
   -1    98 236731834943487, 235848379733231, 434950964946044 @ 39, 163, -373
   -1    99 181752133878297, 318917093366366, 247341038572269 @ 43, 362, -133
   -1   100 182008526553797, 405352582564166, 87466572960079 @ 107, -241, 685
   -1   101 148088205857987, 39133407377496, 234768945974509 @ 239, 754, 58
   -1   102 312863713960203, 214834845457389, 381113977229023 @ -45, 113, -164
   -1   103 232500754901037, 242352935345986, 195109307824419 @ -11, 270, 170
   -1   104 325273577776517, 247924347482506, 353029236420379 @ 20, -16, -46
   -1   105 223611816102865, 319793832567945, 300083467532100 @ 21, 31, -139
   -1   106 286007424026045, 458493752752994, 377889197560371 @ -55, -319, -229
   -1   107 164539594166653, 340252020538282, 187484110881835 @ 153, 384, 406
   -1   108 304946489424548, 459601749573298, 513905379297130 @ 20, -268, -277
   -1   109 288196558389398, 368158505902138, 346116622330786 @ -52, -132, -155
   -1   110 327033103511703, 155795789560727, 142102039390541 @ -9, 127, 206
   -1   111 410968800615689, 393096691690690, 344230127737183 @ -192, -182, -95
   -1   112 335506469094485, 404639256991411, 500010007032505 @ -135, -205, -446
   -1   113 235110393001529, 138189274827316, 349658287136443 @ 115, 135, -56
   -1   114 428198570885917, 299339382932826, 444760847442859 @ -99, -74, -152
   -1   115 290379058283357, 88517456844490, 374065798845835 @ 54, 179, -77
   -1   116 163165394977794, 345482543054781, 306898575876926 @ 190, 55, -357
   -1   117 437405365488725, 204502204578718, 241571292920245 @ -67, 6, 85
   -1   118 279089400341912, 304994228698111, 304643844096319 @ 34, -53, -20
   -1   119 181304131795926, 337513539889693, 215932214351537 @ 12, 309, 98
   -1   120 288855349860909, 429514373912098, 441376575501699 @ 75, -219, -123
   -1   121 336413765319738, 245167607245178, 305343169924498 @ -42, 28, -17
   -1   122 375794628223373, 151752022506394, 77041336967003 @ -10, 63, 251
   -1   123 293029819388562, 331387825783096, 228833246043184 @ -96, -42, 79
   -1   124 345252713916029, 338607932208306, 371175529825531 @ 17, -125, -50
   -1   125 484764407052185, 497004810868650, 296535187509119 @ -187, -308, 12
   -1   126 196461515969227, 294399354761921, 357722278420989 @ 163, -59, -66
   -1   127 222247979450601, 244702590977905, 293235863566333 @ 13, 279, -134
   -1   128 227773543759811, 121922061331622, 270464070863531 @ 131, 128, 48
   -1   129 184119231985301, 308815721660932, 267897913503391 @ 137, 62, -44
   -1   130 176723602862752, 369545449006936, 229453559163129 @ 46, 30, -30
   -1   131 240049679693828, 268705613895623, 33734989952388 @ 80, 17, 401
   -1   132 334238137498957, 489242319053170, 320518093210199 @ -71, -336, -58
   -1   133 307024893070199, 354838483131152, 273745188637223 @ -154, -89, -34
   -1   134 196971236783537, 343476994289736, 156793906012119 @ -121, 245, 618
   -1   135 195198618527037, 395317981506666, 264675278567659 @ 34, -197, -134
   -1   136 198314743343218, 298285472194283, 172298017328560 @ -60, 467, 403
   -1   137 183692437623575, 328619690398420, 222646390281277 @ 27, 294, 50
   -1   138 331362586289507, 258331517730574, 257531722336235 @ -46, 18, 48
   -1   139 220700609712437, 352243544956666, 183577943394459 @ 14, -54, 210
   -1   140 287784347408819, 291667690183315, 296555778660100 @ -5, -13, -25
   -1   141 288888393633671, 247331268725743, 327500636321878 @ 11, 41, -61
   -1   142 309823475589790, 191577331211453, 327389263083987 @ 28, 61, -24
   -1   143 258495965171221, 291555004961190, 364203255115707 @ -119, 152, -384
   -1   144 195821341249365, 353602402741986, 226919407211411 @ -29, 70, 30
   -1   145 280565905255171, 348703057421146, 298497871092007 @ -128, -60, -122
   -1   146 258018537639353, 202109150622984, 313725136050198 @ 77, 74, -21
   -1   147 315339686666717, 464234663489266, 396750444960409 @ -15, -284, -150
   -1   148 170764748644631, 362692347104506, 234885708580021 @ 100, 100, -85
   -1   149 164959872274023, 366369261921178, 223103591713031 @ 162, 36, 38
   -1   150 95984771278188, 118354808815719, 38637833713598 @ 270, 83, 281
   -1   151 333731608363559, 353470969084456, 304274804473975 @ -109, -110, -52
   -1   152 468356529890034, 260749110679103, 182291106931484 @ -128, -37, 147
   -1   153 357930265131350, 426813287571580, 239062361560003 @ 16, -214, 88
   -1   154 285421514784519, 230213470455996, 282326779028325 @ 18, 65, 9
   -1   155 177384263747373, 370711764938450, 222727695365947 @ 67, -13, 46
   -1   156 310979080083217, 297460340131983, 355604932437714 @ -11, -43, -93
   -1   157 140830285452061, 186805412869407, 88334431928888 @ 241, 173, 329
   -1   158 435750958392734, 245603574609868, 184939177079542 @ -82, -26, 143
   -1   159 420408563596970, 271610083459309, 233926712839799 @ -58, -57, 92
   -1   160 418680733251721, 215861500433572, 263622387828083 @ -149, 63, 44
   -1   161 382242280677659, 182065284177977, 254525463475859 @ -13, 29, 72
   -1   162 318560594604693, 258899093977188, 397779880198825 @ 45, -43, -77
   -1   163 169826348189399, 388372346699532, 300516451932177 @ 140, -157, -459
   -1   164 201648167828337, 322069130241186, 155253410401199 @ 94, 10, 273
   -1   165 232088396704843, 374484294937561, 239140555583772 @ -105, -105, 5
   -1   166 319906977439818, 314507607137905, 224355436694023 @ 16, -87, 100
   -1   167 183968406152307, 353126671725291, 163299940318044 @ -77, 271, 707
   -1   168 183318092589672, 405627921951441, 235096360582349 @ -84, -349, -142
   -1   169 341897037770567, 307677889861864, 457931548060057 @ -36, -67, -215
   -1   170 315798562537085, 387753667918122, 116255143199083 @ 56, -176, 208
   -1   171 205738466963717, 262314021068566, 231532829296219 @ 155, -29, 92
   -1   172 194146339818536, 375189601322242, 221607473553721 @ -108, -28, 46
   -1   173 207906252055043, 317334468372928, 312143384858075 @ -37, 198, -384
   -1   174 306914081356287, 298560244698736, 317225988451069 @ 24, -63, -17
   -1   175 256301258125178, 225862366790977, 238410056519947 @ 80, 41, 80
   -1   176 331320973805117, 182334318865576, 251980751663149 @ 17, 54, 70
   -1   177 246911206527833, 312875001915793, 162844296392740 @ -27, 33, 251
   -1   178 431762900599962, 196350071915396, 479260992363294 @ -156, 82, -243
   -1   179 213659088701637, 382966121089906, 199830102046049 @ -11, -144, 171
   -1   180 324703646357908, 214526667305588, 230860891545356 @ -162, 218, 75
   -1   181 402831992361791, 397346425231993, 377672664304360 @ -189, -189, -155
   -1   182 235022182464121, 286997561032422, 317132769368563 @ -153, 322, -380
   -1   183 180025544566371, 315749639344522, 269860860422949 @ 183, -84, 42
   -1   184 144602209707578, 137184779124934, 255618464505340 @ 246, 456, 9
   -1   185 162547275352097, 356963841323746, 199620622581679 @ 174, 210, 277
   -1   186 171152835558464, 340604035365174, 253112136961614 @ 56, 488, -393
   -1   187 213247503453605, 340772274088242, 310305196982703 @ 131, -106, -27
   -1   188 185718416372413, 391413245590594, 191577624910311 @ -159, -174, 431
   -1   189 182213481990910, 353058747578267, 327174093197788 @ 132, -49, -269
   -1   190 171649662990662, 386264056927381, 308322281842219 @ 84, -123, -848
   -1   191 189972403591917, 454721508275618, 223704180994235 @ 19, -571, 54
   -1   192 403217515347277, 330685375312458, 289583002098171 @ -86, -106, 21
   -1   193 251911038445621, 66387926477252, 137758747642783 @ -59, 763, 334
   -1   194 394072933949337, 139439240089386, 385931844851719 @ -29, 76, -62
   -1   195 344994422742905, 341955713989086, 470792666877185 @ 23, -130, -145
   -1   196 271175050019191, 500906981481064, 400864329912582 @ 43, -342, -165
   -1   197 221645897619425, 361686416034854, 212459384775695 @ -148, -7, 123
   -1   198 287253157566953, 269951949978694, 141540017192425 @ 37, -16, 210
   -1   199 301218629848145, 466864931338735, 13216597025503 @ 37, -271, 356
   -1   200 190670167122337, 398038783512261, 236200004302744 @ 93, -203, 31
   -1   201 335903626290165, 226766383485543, 270669887606265 @ -23, 37, 38
   -1   202 400339015238096, 59002262717282, 181479838598325 @ -40, 164, 146
   -1   203 279843879606283, 388512299576758, 263490911982682 @ -225, -168, -65
   -1   204 275635414223777, 293077854642826, 230127985846879 @ -64, 52, 75
   -1   205 383331160220947, 191748724222726, 302036738324771 @ -26, 30, 20
   -1   206 155515410076851, 153834233221640, 277641174502692 @ 223, 674, -115
   -1   207 278140098669537, 255471147619736, 439789909399944 @ 61, -10, -169
   -1   208 224563831414301, 253405431402550, 252379010860723 @ 65, 126, 28
   -1   209 193398362626367, 256117220527615, 275143150180315 @ 39, 499, -192
   -1   210 448289256874427, 418475666065256, 391592646178154 @ -73, -206, -61
   -1   211 219524577966849, 329899329598966, 308896830008531 @ -53, 90, -300
   -1   212 343052166004172, 268774411433285, 281387458635363 @ -76, 11, 8
   -1   213 217254233295475, 344601116483300, 227401171378910 @ -53, 34, 53
   -1   214 204884862079284, 357648389382070, 201244440657873 @ -158, 96, 218
   -1   215 204882265701483, 287036185901841, 227662049238274 @ 55, 175, 67
   -1   216 431285529538982, 533386227812278, 134973976145143 @ -106, -344, 204
   -1   217 206617522118630, 412476100392666, 233463274299873 @ 26, -260, 38
   -1   218 311584989842865, 214622240362479, 210665386260311 @ 45, 11, 116
   -1   219 281927283689421, 273508445215956, 314612337412315 @ 33, -10, -32
   -1   220 209904504791927, 250004763798586, 220624391943889 @ -90, 660, 75
   -1   221 422513255881049, 211517791960798, 202552253476987 @ -147, 64, 128
   -1   222 306096173819267, 222938983915206, 265047722172553 @ 44, 10, 55
   -1   223 204491269272153, 343417877367733, 239654834039580 @ 61, -21, 29
   -1   224 233740971265241, 342870707735458, 354790260167563 @ -134, 46, -536
   -1   225 243798330015577, 283680775140112, 268457443803256 @ -11, 102, -29
   -1   226 240348917718136, 325887022374795, 264203098761186 @ -72, 49, -61
   -1   227 188864259049973, 350414068702228, 219428991604009 @ 5, 107, 77
   -1   228 309464262449789, 170790561635146, 261266510231179 @ -15, 150, 42
   -1   229 281562811131328, 271398815058267, 333543267757859 @ -78, 103, -168
   -1   230 534479628625989, 561320191286426, 479646898985899 @ -300, -410, -248
   -1   231 152360535815477, 251003255293101, 242309337872744 @ 233, 299, 17
   -1   232 203563063411517, 321331280764386, 292551801909919 @ 65, 50, -143
   -1   233 423871753618232, 123052173494296, 305418535491214 @ -96, 130, 7
   -1   234 202708691743565, 317065818938074, 426898773382411 @ 121, -28, -320
   -1   235 222456658454697, 249143609591392, 213230623934007 @ 99, 69, 114
   -1   236 218948907583925, 282776305815466, 122125337324275 @ -53, 300, 518
   -1   237 173792456439202, 381375277458276, 201127691658819 @ -8, -22, 312
   -1   238 256378905602112, 286569337191876, 286405508318789 @ 34, 10, -18
   -1   239 211513501222682, 349601807973436, 136936315685644 @ 98, -90, 277
   -1   240 159656770958813, 322360081635946, 174005365061563 @ 207, 400, 449
   -1   241 170015293188607, 372765462602560, 259191683834915 @ 139, -54, -184
   -1   242 438301796488997, 346545523798846, 360924446205919 @ -105, -129, -53
   -1   243 252378384998783, 235231748253504, 222751679830679 @ -13, 194, 92
   -1   244 285107337755803, 372400786411515, 226584113992138 @ -69, -137, 85
   -1   245 200306997624977, 500216714293266, 292832060179899 @ -37, -832, -360
   -1   246 293277241093997, 244134414187306, 222685351954651 @ -81, 140, 94
   -1   247 382776439638987, 316771114939036, 209742786728069 @ -32, -99, 117
   -1   248 214888697620757, 65946891742381, 119282762492299 @ 153, 149, 208
   -1   249 283953427333463, 316724967295110, 51293612519404 @ 83, -104, 277
   -1   250 232092686201087, 331066645056336, 218626826033319 @ 38, -37, 102
   -1   251 291216152875812, 215550447545236, 377236676220369 @ 52, 30, -82
   -1   252 296910331207913, 424659365983442, 131201925785215 @ -34, -238, 259
   -1   253 233529972873231, 45086350621612, 83047387589983 @ 16, 723, 454
   -1   254 322494683285353, 193719255559370, 255963896536295 @ -140, 244, 23
   -1   255 401889087754581, 181835018495314, 315829478257419 @ -30, 27, 12
   -1   256 310298522334737, 465096056199536, 428672039135219 @ -67, -314, -280
   -1   257 167070967448702, 393949635370401, 211270910691839 @ 140, -199, 140
   -1   258 348266477614717, 223342910467306, 297405367736299 @ -23, 27, 10
   -1   259 340245071866533, 359464102629333, 377488443910486 @ -87, -127, -155
   -1   260 194064346632584, 364273355221540, 163337418705196 @ 116, -106, 249
   -1   261 174996756645409, 411948148112885, 165427444152934 @ 61, -371, 577
   -1   262 191798464394247, 363118920600306, 222099529908049 @ -30, 32, 55
   -1   263 236360038014389, 143465118166762, 250823414259091 @ 95, 188, 58
   -1   264 400318739318181, 252104608519978, 185992624418083 @ -122, 12, 151
   -1   265 199511778210190, 330703342578598, 246275262856891 @ 28, 96, -32
   -1   266 410188600915153, 156486923116205, 476453488398514 @ -35, 49, -143
   -1   267 403443885022303, 340839703689596, 237131698258593 @ -102, -115, 83
   -1   268 205966597250419, 370766545619691, 164162068341777 @ -45, -65, 386
   -1   269 199592608139162, 251301110513356, 238043777033449 @ -66, 782, -50
   -1   270 543223300791101, 307692064576234, 388834124896939 @ -165, -98, -58
   -1   271 415984655409581, 290029579053786, 309062413009615 @ -43, -80, 19
   -1   272 303893795206514, 161095242482440, 168643190827927 @ 70, 42, 156
   -1   273 162619300043013, 230134901658198, 88693501999761 @ 201, 224, 426
   -1   274 205308296113457, 353149558691926, 182582949698979 @ 56, -51, 218
   -1   275 451084794924787, 196821710815236, 562134339689444 @ -129, 46, -291
   -1   276 226742902772880, 336586694334828, 253806603307990 @ -42, 26, -35
   -1   277 315792139646271, 267010555599958, 242564557653535 @ -24, 6, 70
   -1   278 178712631543352, 382282854562096, 173838641395304 @ 100, -126, 341
   -1   279 243735837601637, 346701777560786, 246741534377019 @ 11, -74, 36
   -1   280 210007641909725, 298444290411562, 264318664630011 @ 131, -36, 35
   -1   281 263172945206213, 268525789310326, 427841530693927 @ 87, -35, -139
   -1   282 220677187402635, 468970636318263, 43143998648027 @ 43, -389, 576
   -1   283 178580899449581, 347009510530906, 277318193707147 @ 100, 75, -246
   -1   284 177758811297412, 322584062403618, 169769943873243 @ 84, 292, 416
   -1   285 215590896798347, 334281345822656, 389832980042849 @ 128, -97, -141
   -1   286 376469200316606, 405928042087548, 366121130567146 @ -130, -202, -125
   -1   287 299345098043601, 313387338203029, 264642165681575 @ -203, 51, -36
   -1   288 218632913002013, 355096591649425, 249271783067287 @ -15, -41, -20
   -1   289 190649668742205, 134392939970218, 168841576007275 @ 102, 702, 268
   -1   290 273284435187787, 402773326831090, 299094035733625 @ 84, -192, 19
   -1   291 239419225455197, 328507115812526, 246498830555459 @ -55, 29, 6
   -1   292 232486478937895, 223967663304673, 169055331104021 @ 51, 183, 210
   -1   293 215124544210211, 351197210587726, 248088120987817 @ -24, -10, -29
   -1   294 163074260457836, 338333177896348, 232020615689744 @ 152, 654, -163
   -1   295 320688147068293, 310268963630560, 430029836481359 @ 37, -93, -118
   -1   296 261363761393453, 205939476692698, 335813167827991 @ -63, 316, -212
   -1   297 204019999799117, 354673051877586, 311692044098539 @ 143, -125, -32
   -1   298 170936382236750, 370764377080192, 251385303873748 @ 68, 78, -341
   -1   299 190760346748012, 288678268649194, 195033583529983 @ 34, 396, 220
   -1   300 252999337365221, 320136259627858, 244456776137521 @ -99, 56, 13

diff --git a/2023/24/solution.rs b/2023/24/solution.rs

@@ -0,0 +1,143 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 use std::convert::TryInto;
   -1     5 
   -1     6 fn parse_input() -> Vec<([i64; 3], [i64; 3])> {
   -1     7     return lib::iter_input().map(|line| {
   -1     8         let (a, b) = line.split_once('@').unwrap();
   -1     9         let p: Vec<i64> = a.split(',').map(|s| s.trim().parse().unwrap()).collect();
   -1    10         let d: Vec<i64> = b.split(',').map(|s| s.trim().parse().unwrap()).collect();
   -1    11         return (
   -1    12             p.try_into().unwrap(),
   -1    13             d.try_into().unwrap(),
   -1    14         );
   -1    15     }).collect();
   -1    16 }
   -1    17 
   -1    18 fn intersect(h1: ([i64; 3], [i64; 3]), h2: ([i64; 3], [i64; 3])) -> bool {
   -1    19     // 200_000_000_000_000 <= x1 + t1*dx1 = x2 + t2*dx2 <= 400_000_000_000_000
   -1    20     // 200_000_000_000_000 <= y1 + t1*dy1 = y2 + t2*dy2 <= 400_000_000_000_000
   -1    21     // t1 = (x2 - x1 + t2*dx2) / dx1
   -1    22     // y1 + (x2 - x1 + t2*dx2) / dx1 * dy1 = y2 + t2*dy2
   -1    23     // y1 + x2*dy1/dx1 - x1*dy1/dx1 + t2*dx2*dy1/dx1 = y2 + t2*dy2
   -1    24     // y1 - y2 + x2*dy1/dx1 - x1*dy1/dx1 = t2*dy2 - t2*dx2*dy1/dx1
   -1    25     // y1 - y2 + x2*dy1/dx1 - x1*dy1/dx1 = t2 * (dy2 - dx2*dy1/dx1)
   -1    26     // t2 = ((y1 - y2) + (x2 - x1)*dy1/dx1) / (dy2 - dx2*dy1/dx1)
   -1    27     // t2 = ((y1 - y2)*dx1 - (x1 - x2)*dy1) / (dy2*dx1 - dx2*dy1)
   -1    28 
   -1    29     // in xy, lines intersect if they are not parallel
   -1    30     // dy1 / dx1 != dy2 / dx2
   -1    31     // dy1 * dx2 != dy2 * dx1
   -1    32 
   -1    33     let ([x1, y1, _z1], [dx1, dy1, _dz1]) = h1;
   -1    34     let ([x2, y2, _z2], [dx2, dy2, _dz2]) = h2;
   -1    35 
   -1    36     let d = dy1 * dx2 - dx1 * dy2;
   -1    37     if d == 0 {
   -1    38         return false;
   -1    39     }
   -1    40 
   -1    41     let dt1 = (y2 - y1) * dx2 - (x2 - x1) * dy2;
   -1    42     if (dt1 < 0 && d >= 0) || (dt1 >= 0 && d < 0) {
   -1    43         return false;
   -1    44     }
   -1    45 
   -1    46     let dt2 = (y2 - y1) * dx1 - (x2 - x1) * dy1;
   -1    47     if (dt2 < 0 && d >= 0) || (dt2 >= 0 && d < 0) {
   -1    48         return false;
   -1    49     }
   -1    50 
   -1    51     let x = x1 as f64 + dx1 as f64 * dt1 as f64 / d as f64;
   -1    52     let y = y1 as f64 + dy1 as f64 * dt1 as f64 / d as f64;
   -1    53 
   -1    54     // let min = 7.0;
   -1    55     // let max = 27.0;
   -1    56     let min = 200_000_000_000_000.0;
   -1    57     let max = 400_000_000_000_000.0;
   -1    58 
   -1    59     return x >= min && x <= max && y >= min && y <= max;
   -1    60 }
   -1    61 
   -1    62 fn part1(hail: &Vec<([i64; 3], [i64; 3])>) -> i64 {
   -1    63     let mut count = 0;
   -1    64     for i in 0..hail.len() {
   -1    65         for j in 0..i {
   -1    66             if intersect(hail[i], hail[j]) {
   -1    67                 count += 1;
   -1    68             }
   -1    69         }
   -1    70     }
   -1    71     return count;
   -1    72 }
   -1    73 
   -1    74 fn solve<const N: usize>(matrix: &[[f64; N]; N], b: &[f64; N]) -> [f64; N] {
   -1    75     let mut tmp = matrix.clone();
   -1    76     let mut result = b.clone();
   -1    77 
   -1    78     for k in 0..N {
   -1    79         result[k] = result[k] / tmp[k][k];
   -1    80         for j in (k..N).rev() {
   -1    81             tmp[k][j] = tmp[k][j] / tmp[k][k];
   -1    82         }
   -1    83 
   -1    84         for i in (k + 1)..N {
   -1    85             result[i] = result[i] - result[k] * tmp[i][k];
   -1    86             for j in (k..N).rev() {
   -1    87                 tmp[i][j] = tmp[i][j] - tmp[k][j] * tmp[i][k];
   -1    88             }
   -1    89         }
   -1    90     }
   -1    91 
   -1    92     for k in (0..N).rev() {
   -1    93         for i in 0..k {
   -1    94             result[i] = result[i] - result[k] * tmp[i][k];
   -1    95         }
   -1    96     }
   -1    97 
   -1    98     return result;
   -1    99 }
   -1   100 
   -1   101 
   -1   102 fn part2(hail: &Vec<([i64; 3], [i64; 3])>) -> i64 {
   -1   103     // x + ti*dx = xi + ti*dxi
   -1   104     // y + ti*dy = yi + ti*dyi
   -1   105     // z + ti*dz = zi + ti*dzi
   -1   106 
   -1   107     // (p - pi) / (di - d)   = ti
   -1   108     // (x - xi) / (dxi - dx) = ti
   -1   109 
   -1   110     // (p - pi) / (di - d) = (x - xi) / (dxi - dx)
   -1   111     // p*dxi - d*xi - x*di + dx*pi + x*d - p*dx = pi*dxi - xi*di
   -1   112     // p*(dxi - dxj) - d*(xi - xj) - x*(di - dj) + dx*(pi - pj) = pi*dxi - xi*di - pj*dxj + xj*dj
   -1   113 
   -1   114     let mut matrix = [[0.0; 4]; 4];
   -1   115     let mut b = [0.0; 4];
   -1   116 
   -1   117     let ([xj, yj, zj], [dxj, dyj, dzj]) = hail[0];
   -1   118     let pj = xj + yj + zj;
   -1   119     let dj = dxj + dyj + dzj;
   -1   120 
   -1   121     for i in 0..4 {
   -1   122         let ([xi, yi, zi], [dxi, dyi, dzi]) = hail[i + 1];
   -1   123         let pi = xi + yi + zi;
   -1   124         let di = dxi + dyi + dzi;
   -1   125 
   -1   126         matrix[i][0] = (dxi - dxj) as f64;
   -1   127         matrix[i][1] = (xj - xi) as f64;
   -1   128         matrix[i][2] = (dj - di) as f64;
   -1   129         matrix[i][3] = (pi - pj) as f64;
   -1   130         b[i] = (pi * dxi - xi * di - pj * dxj + xj * dj) as f64;
   -1   131     }
   -1   132 
   -1   133     let result = solve(&matrix, &b);
   -1   134 
   -1   135     return result[0] as i64;
   -1   136 }
   -1   137 
   -1   138 fn main() {
   -1   139     let hail = parse_input();
   -1   140 
   -1   141     println!("part1: {}", part1(&hail));
   -1   142     println!("part2: {}", part2(&hail));
   -1   143 }

diff --git a/2023/24/test.txt b/2023/24/test.txt

@@ -0,0 +1,5 @@
   -1     1 19, 13, 30 @ -2,  1, -2
   -1     2 18, 19, 22 @ -1, -1, -2
   -1     3 20, 25, 34 @ -2, -2, -4
   -1     4 12, 31, 28 @ -1, -2, -1
   -1     5 20, 19, 15 @  1, -5, -3