adventofcode

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

commit
8e8e79228da54b61f1b9356a51bc8c22ec65311f
parent
10b4a7d7d1b166a1767a7d0b1d4d0b4634f35124
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2021-12-19 08:59
day 19

Diffstat

A 2021/19/input.txt 723 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2021/19/part1.rs 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2021/19/test.txt 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3 files changed, 1033 insertions, 0 deletions


diff --git a/2021/19/input.txt b/2021/19/input.txt

@@ -0,0 +1,723 @@
   -1     1 --- scanner 0 ---
   -1     2 579,799,416
   -1     3 48,82,-27
   -1     4 474,-502,534
   -1     5 652,-594,511
   -1     6 -609,574,-469
   -1     7 352,-544,-666
   -1     8 -780,740,353
   -1     9 -33,-102,-83
   -1    10 384,-640,-624
   -1    11 470,-559,544
   -1    12 468,864,533
   -1    13 670,759,-677
   -1    14 -700,873,335
   -1    15 -747,-486,-412
   -1    16 349,-584,-782
   -1    17 -382,-890,249
   -1    18 -567,658,-522
   -1    19 -689,659,-426
   -1    20 531,820,-584
   -1    21 -738,-569,-457
   -1    22 -369,-772,414
   -1    23 -816,800,310
   -1    24 601,763,-473
   -1    25 355,790,421
   -1    26 -629,-538,-431
   -1    27 -387,-903,381
   -1    28 
   -1    29 --- scanner 1 ---
   -1    30 961,715,-541
   -1    31 -390,653,-337
   -1    32 475,-505,-519
   -1    33 -398,393,554
   -1    34 -543,-651,892
   -1    35 917,-691,745
   -1    36 -333,512,638
   -1    37 -447,-609,924
   -1    38 949,600,-504
   -1    39 -487,-493,927
   -1    40 959,652,536
   -1    41 860,-802,675
   -1    42 425,-583,-486
   -1    43 31,89,-38
   -1    44 856,-598,606
   -1    45 -729,-629,-505
   -1    46 -381,635,-466
   -1    47 -728,-658,-697
   -1    48 940,447,580
   -1    49 423,-556,-430
   -1    50 921,566,529
   -1    51 -385,763,-451
   -1    52 82,-46,86
   -1    53 863,628,-559
   -1    54 -792,-638,-728
   -1    55 -441,535,654
   -1    56 
   -1    57 --- scanner 2 ---
   -1    58 -619,-740,-444
   -1    59 284,732,-285
   -1    60 349,769,-397
   -1    61 -800,371,856
   -1    62 -154,-142,35
   -1    63 -588,-753,-593
   -1    64 433,-771,646
   -1    65 426,648,604
   -1    66 -469,-701,964
   -1    67 -436,-703,873
   -1    68 -831,445,878
   -1    69 -68,-35,148
   -1    70 433,-910,547
   -1    71 321,677,-474
   -1    72 658,-831,-735
   -1    73 -708,471,-612
   -1    74 532,743,654
   -1    75 -599,-758,926
   -1    76 543,-753,-648
   -1    77 445,-815,-781
   -1    78 -682,-685,-597
   -1    79 491,-773,545
   -1    80 -814,389,-621
   -1    81 -712,458,817
   -1    82 -726,309,-547
   -1    83 422,838,592
   -1    84 
   -1    85 --- scanner 3 ---
   -1    86 -742,640,493
   -1    87 468,610,-347
   -1    88 -656,680,388
   -1    89 533,814,631
   -1    90 -501,744,-596
   -1    91 472,-555,-383
   -1    92 -55,12,40
   -1    93 603,-399,668
   -1    94 -422,891,-618
   -1    95 -505,-699,597
   -1    96 -520,646,478
   -1    97 -523,-607,-421
   -1    98 -487,-491,600
   -1    99 479,-501,677
   -1   100 475,661,-559
   -1   101 428,770,510
   -1   102 -526,-596,-325
   -1   103 443,-605,-422
   -1   104 374,-553,-286
   -1   105 548,-425,783
   -1   106 -570,841,-566
   -1   107 -401,-666,575
   -1   108 605,756,519
   -1   109 469,566,-488
   -1   110 -494,-573,-565
   -1   111 
   -1   112 --- scanner 4 ---
   -1   113 -24,-9,-13
   -1   114 693,825,-612
   -1   115 -659,674,730
   -1   116 726,696,493
   -1   117 -602,-470,716
   -1   118 -548,804,-616
   -1   119 -273,-440,-429
   -1   120 755,920,-722
   -1   121 591,-810,463
   -1   122 104,132,31
   -1   123 -798,656,824
   -1   124 701,-689,-711
   -1   125 -566,-637,674
   -1   126 800,-828,-711
   -1   127 901,636,510
   -1   128 -548,-422,677
   -1   129 592,-714,585
   -1   130 -775,678,794
   -1   131 -336,-418,-360
   -1   132 906,716,416
   -1   133 -738,825,-594
   -1   134 -360,-472,-355
   -1   135 -647,851,-605
   -1   136 802,-691,-653
   -1   137 743,730,-718
   -1   138 676,-767,543
   -1   139 
   -1   140 --- scanner 5 ---
   -1   141 295,-829,-370
   -1   142 -646,-497,-795
   -1   143 785,-566,682
   -1   144 331,-823,-362
   -1   145 396,624,-653
   -1   146 -345,390,-837
   -1   147 -854,-521,625
   -1   148 -776,-569,671
   -1   149 -719,302,694
   -1   150 775,-608,710
   -1   151 618,434,807
   -1   152 613,-547,645
   -1   153 -691,-468,-758
   -1   154 -857,329,748
   -1   155 366,768,-662
   -1   156 -46,-127,-7
   -1   157 -368,546,-822
   -1   158 -855,-613,723
   -1   159 477,-938,-370
   -1   160 727,347,755
   -1   161 803,431,840
   -1   162 -390,421,-837
   -1   163 -915,322,743
   -1   164 -713,-449,-683
   -1   165 322,664,-548
   -1   166 
   -1   167 --- scanner 6 ---
   -1   168 -478,-795,-399
   -1   169 636,601,800
   -1   170 475,790,-480
   -1   171 399,-509,961
   -1   172 48,51,76
   -1   173 -372,687,518
   -1   174 429,-773,-421
   -1   175 -854,749,-409
   -1   176 -751,809,-318
   -1   177 379,-786,-305
   -1   178 -764,-417,427
   -1   179 -712,-535,446
   -1   180 552,-546,960
   -1   181 -809,832,-531
   -1   182 653,710,892
   -1   183 483,781,-545
   -1   184 -104,95,187
   -1   185 378,-509,931
   -1   186 -505,589,580
   -1   187 -681,-426,472
   -1   188 499,783,-725
   -1   189 -347,-777,-366
   -1   190 452,-886,-397
   -1   191 -360,-782,-234
   -1   192 720,662,828
   -1   193 -418,474,502
   -1   194 
   -1   195 --- scanner 7 ---
   -1   196 -747,-527,-295
   -1   197 -383,523,528
   -1   198 722,-666,942
   -1   199 622,-640,-526
   -1   200 -722,-449,-374
   -1   201 822,-614,982
   -1   202 531,486,601
   -1   203 -473,-615,807
   -1   204 658,-592,-519
   -1   205 546,512,-555
   -1   206 801,-857,967
   -1   207 -487,406,-646
   -1   208 -20,-36,160
   -1   209 -491,411,-601
   -1   210 596,468,439
   -1   211 550,606,-623
   -1   212 -705,-445,-317
   -1   213 636,-516,-380
   -1   214 699,575,-610
   -1   215 -472,-687,821
   -1   216 522,380,519
   -1   217 -563,527,518
   -1   218 -336,449,-620
   -1   219 -74,-172,0
   -1   220 -502,-611,738
   -1   221 -473,453,641
   -1   222 
   -1   223 --- scanner 8 ---
   -1   224 -325,277,621
   -1   225 -346,432,631
   -1   226 648,-738,463
   -1   227 -284,-886,-509
   -1   228 610,-583,-878
   -1   229 429,537,390
   -1   230 -366,-908,-467
   -1   231 661,-654,541
   -1   232 567,-557,-727
   -1   233 605,-763,488
   -1   234 -379,-707,832
   -1   235 583,609,339
   -1   236 823,713,-542
   -1   237 888,705,-461
   -1   238 -262,393,-504
   -1   239 458,674,373
   -1   240 -329,-650,646
   -1   241 572,-602,-723
   -1   242 -237,503,-467
   -1   243 -288,-829,-492
   -1   244 -5,6,-132
   -1   245 -386,307,509
   -1   246 -383,-599,733
   -1   247 99,-170,-55
   -1   248 -249,384,-440
   -1   249 830,694,-667
   -1   250 
   -1   251 --- scanner 9 ---
   -1   252 597,-475,-339
   -1   253 821,675,845
   -1   254 -364,-312,543
   -1   255 414,576,-313
   -1   256 743,721,797
   -1   257 -328,-320,537
   -1   258 -749,800,-693
   -1   259 386,653,-405
   -1   260 -661,726,-773
   -1   261 -95,72,62
   -1   262 -643,791,-611
   -1   263 -647,-638,-624
   -1   264 822,773,753
   -1   265 -735,-677,-711
   -1   266 613,-745,869
   -1   267 658,-708,898
   -1   268 487,-413,-244
   -1   269 491,-425,-434
   -1   270 -646,695,819
   -1   271 349,464,-350
   -1   272 -510,-320,428
   -1   273 -818,732,800
   -1   274 680,-633,917
   -1   275 -766,-699,-637
   -1   276 74,149,-8
   -1   277 -808,760,758
   -1   278 
   -1   279 --- scanner 10 ---
   -1   280 671,-555,-655
   -1   281 672,548,433
   -1   282 -684,363,-477
   -1   283 628,600,354
   -1   284 720,502,355
   -1   285 792,-806,496
   -1   286 397,393,-396
   -1   287 -438,403,762
   -1   288 -573,-435,-449
   -1   289 -475,291,827
   -1   290 397,400,-473
   -1   291 434,477,-433
   -1   292 -559,-598,685
   -1   293 -464,-648,579
   -1   294 -625,390,-456
   -1   295 657,-513,-539
   -1   296 773,-881,518
   -1   297 -653,-440,-543
   -1   298 744,-918,563
   -1   299 -672,386,-603
   -1   300 -147,-172,17
   -1   301 647,-507,-645
   -1   302 -369,-586,689
   -1   303 -530,480,790
   -1   304 -593,-615,-526
   -1   305 -35,-50,-86
   -1   306 
   -1   307 --- scanner 11 ---
   -1   308 -708,-978,-663
   -1   309 715,-781,-742
   -1   310 680,759,-622
   -1   311 -262,303,742
   -1   312 819,750,-718
   -1   313 -406,333,733
   -1   314 881,-642,685
   -1   315 -701,-920,-668
   -1   316 654,-831,-823
   -1   317 557,760,713
   -1   318 565,725,753
   -1   319 940,-709,735
   -1   320 -683,664,-675
   -1   321 933,-652,865
   -1   322 162,-1,80
   -1   323 -484,-431,902
   -1   324 -599,740,-760
   -1   325 -596,555,-727
   -1   326 763,-827,-746
   -1   327 -366,259,628
   -1   328 -609,-453,917
   -1   329 -728,-782,-614
   -1   330 -640,-408,917
   -1   331 463,792,860
   -1   332 30,-171,-39
   -1   333 742,714,-656
   -1   334 
   -1   335 --- scanner 12 ---
   -1   336 -557,-594,-751
   -1   337 535,-288,-328
   -1   338 522,-780,851
   -1   339 577,462,-599
   -1   340 -378,644,873
   -1   341 506,-435,-371
   -1   342 562,-830,712
   -1   343 490,514,-708
   -1   344 -404,624,-594
   -1   345 620,-862,805
   -1   346 30,-32,-49
   -1   347 -485,-641,-711
   -1   348 -470,546,874
   -1   349 445,575,738
   -1   350 442,-439,-322
   -1   351 -423,587,-766
   -1   352 -722,-561,777
   -1   353 -794,-556,932
   -1   354 472,521,876
   -1   355 -426,598,795
   -1   356 -666,-473,931
   -1   357 465,526,934
   -1   358 -41,29,133
   -1   359 -673,-676,-778
   -1   360 -465,559,-756
   -1   361 574,429,-784
   -1   362 
   -1   363 --- scanner 13 ---
   -1   364 -512,-780,-383
   -1   365 -634,-328,271
   -1   366 850,517,723
   -1   367 409,-606,298
   -1   368 -639,-724,-396
   -1   369 380,-651,335
   -1   370 100,-55,35
   -1   371 -752,362,545
   -1   372 735,371,731
   -1   373 739,589,-529
   -1   374 -411,665,-757
   -1   375 656,-371,-623
   -1   376 827,524,-467
   -1   377 708,-458,-468
   -1   378 833,537,-431
   -1   379 -488,714,-796
   -1   380 -610,-752,-415
   -1   381 749,-364,-620
   -1   382 -509,-350,256
   -1   383 -478,-305,256
   -1   384 -856,406,431
   -1   385 361,-673,410
   -1   386 741,335,723
   -1   387 -436,839,-789
   -1   388 22,58,-107
   -1   389 -712,436,440
   -1   390 
   -1   391 --- scanner 14 ---
   -1   392 -460,675,-680
   -1   393 431,-518,-720
   -1   394 410,-453,-630
   -1   395 546,395,-372
   -1   396 -809,-922,-637
   -1   397 -476,-447,567
   -1   398 -385,609,-563
   -1   399 -679,-919,-628
   -1   400 496,378,-277
   -1   401 481,-504,704
   -1   402 -668,-866,-537
   -1   403 401,-490,-849
   -1   404 -432,672,-630
   -1   405 606,-464,582
   -1   406 711,311,823
   -1   407 -589,487,725
   -1   408 848,340,840
   -1   409 2,45,75
   -1   410 -564,530,750
   -1   411 559,334,-368
   -1   412 783,465,874
   -1   413 -533,-497,381
   -1   414 -480,543,672
   -1   415 -425,-501,480
   -1   416 451,-443,592
   -1   417 95,-118,129
   -1   418 
   -1   419 --- scanner 15 ---
   -1   420 901,-715,774
   -1   421 -447,800,-713
   -1   422 -499,-598,656
   -1   423 -530,755,-704
   -1   424 613,743,-575
   -1   425 -57,-132,9
   -1   426 863,-629,781
   -1   427 859,628,565
   -1   428 383,-740,-702
   -1   429 563,-720,-625
   -1   430 698,786,-655
   -1   431 388,-660,-608
   -1   432 802,739,635
   -1   433 -499,781,-595
   -1   434 -391,-575,672
   -1   435 -415,-629,-674
   -1   436 -438,-641,-548
   -1   437 697,690,-533
   -1   438 -545,430,383
   -1   439 -442,-688,-695
   -1   440 882,-510,730
   -1   441 -505,546,386
   -1   442 -456,-456,756
   -1   443 798,535,704
   -1   444 100,-5,81
   -1   445 -601,588,418
   -1   446 
   -1   447 --- scanner 16 ---
   -1   448 645,-660,-815
   -1   449 686,-400,877
   -1   450 -788,541,-551
   -1   451 -582,-777,-582
   -1   452 549,-417,906
   -1   453 -726,-490,687
   -1   454 0,107,10
   -1   455 -169,-72,58
   -1   456 621,-366,752
   -1   457 -751,-515,730
   -1   458 800,-659,-703
   -1   459 -545,700,768
   -1   460 725,515,512
   -1   461 -482,-755,-724
   -1   462 -571,851,725
   -1   463 -816,457,-490
   -1   464 737,678,-369
   -1   465 557,694,-371
   -1   466 -648,-739,-637
   -1   467 717,434,447
   -1   468 -642,-568,674
   -1   469 -880,524,-442
   -1   470 585,-617,-730
   -1   471 706,640,505
   -1   472 492,702,-362
   -1   473 -590,696,763
   -1   474 
   -1   475 --- scanner 17 ---
   -1   476 -786,419,-780
   -1   477 580,542,522
   -1   478 -753,-461,678
   -1   479 -671,506,-702
   -1   480 660,-476,-725
   -1   481 -723,-515,665
   -1   482 491,710,-689
   -1   483 -659,-635,-482
   -1   484 460,561,-702
   -1   485 4,11,-37
   -1   486 -133,118,35
   -1   487 -477,757,820
   -1   488 -550,-652,-390
   -1   489 -828,-586,678
   -1   490 -449,680,728
   -1   491 554,557,-634
   -1   492 598,607,360
   -1   493 539,-552,439
   -1   494 686,533,440
   -1   495 -412,869,783
   -1   496 617,-325,-699
   -1   497 543,-372,449
   -1   498 613,-462,562
   -1   499 -598,-719,-454
   -1   500 -573,373,-764
   -1   501 655,-480,-680
   -1   502 
   -1   503 --- scanner 18 ---
   -1   504 -626,741,779
   -1   505 -621,839,736
   -1   506 870,-429,299
   -1   507 -329,-456,-530
   -1   508 -481,-415,-436
   -1   509 474,-784,-723
   -1   510 769,358,-552
   -1   511 -484,-508,-443
   -1   512 862,-314,445
   -1   513 72,37,-49
   -1   514 707,453,-662
   -1   515 -564,805,649
   -1   516 862,-423,263
   -1   517 -328,-337,452
   -1   518 757,548,-556
   -1   519 437,-755,-678
   -1   520 544,738,582
   -1   521 -292,-331,465
   -1   522 483,751,701
   -1   523 -633,427,-669
   -1   524 -390,-425,517
   -1   525 505,825,670
   -1   526 -724,453,-680
   -1   527 -534,474,-658
   -1   528 549,-803,-745
   -1   529 
   -1   530 --- scanner 19 ---
   -1   531 885,-364,-767
   -1   532 -758,-757,-795
   -1   533 -620,501,549
   -1   534 -808,378,-727
   -1   535 -652,-436,692
   -1   536 -654,530,693
   -1   537 563,-461,767
   -1   538 -36,-26,43
   -1   539 -602,-465,731
   -1   540 -643,533,789
   -1   541 754,-346,-734
   -1   542 81,100,-56
   -1   543 697,508,518
   -1   544 614,-468,555
   -1   545 541,493,-604
   -1   546 -818,-793,-838
   -1   547 484,497,-614
   -1   548 872,-359,-899
   -1   549 -882,491,-615
   -1   550 -891,-677,-813
   -1   551 519,-462,626
   -1   552 -817,602,-732
   -1   553 844,429,496
   -1   554 576,675,-637
   -1   555 -600,-367,828
   -1   556 794,577,548
   -1   557 
   -1   558 --- scanner 20 ---
   -1   559 521,799,641
   -1   560 -814,-478,803
   -1   561 564,734,-498
   -1   562 -816,-536,666
   -1   563 -505,755,-478
   -1   564 416,854,546
   -1   565 -715,-478,664
   -1   566 626,864,-562
   -1   567 446,818,519
   -1   568 346,-834,447
   -1   569 322,-829,393
   -1   570 633,-584,-876
   -1   571 -483,786,-552
   -1   572 -488,391,596
   -1   573 724,-595,-850
   -1   574 -397,424,594
   -1   575 534,-573,-829
   -1   576 621,821,-464
   -1   577 -544,667,-565
   -1   578 -757,-471,-755
   -1   579 -47,63,-74
   -1   580 259,-760,415
   -1   581 -707,-577,-850
   -1   582 -435,554,651
   -1   583 -769,-467,-945
   -1   584 
   -1   585 --- scanner 21 ---
   -1   586 693,-762,-734
   -1   587 616,828,628
   -1   588 -684,-626,636
   -1   589 -595,479,-482
   -1   590 -383,525,-446
   -1   591 674,-607,-772
   -1   592 -568,-625,-730
   -1   593 -392,572,557
   -1   594 782,844,715
   -1   595 682,866,573
   -1   596 -445,-535,-656
   -1   597 -363,646,506
   -1   598 448,-368,481
   -1   599 56,54,26
   -1   600 -671,-572,606
   -1   601 -72,160,-43
   -1   602 513,604,-739
   -1   603 538,579,-696
   -1   604 476,-452,542
   -1   605 -684,-501,711
   -1   606 384,-435,433
   -1   607 -455,-715,-660
   -1   608 -471,488,-412
   -1   609 622,657,-683
   -1   610 -315,512,408
   -1   611 719,-611,-777
   -1   612 
   -1   613 --- scanner 22 ---
   -1   614 -426,-460,-817
   -1   615 430,-548,757
   -1   616 17,-21,65
   -1   617 645,-446,-810
   -1   618 -502,-376,-732
   -1   619 702,-493,-691
   -1   620 312,721,-517
   -1   621 477,-544,865
   -1   622 283,-543,859
   -1   623 -616,518,-622
   -1   624 676,-492,-734
   -1   625 332,738,-554
   -1   626 -96,88,-105
   -1   627 -863,-797,685
   -1   628 -934,800,393
   -1   629 -454,579,-687
   -1   630 498,874,776
   -1   631 -752,909,393
   -1   632 -611,-463,-784
   -1   633 473,807,749
   -1   634 535,829,715
   -1   635 -898,794,385
   -1   636 369,646,-663
   -1   637 -444,537,-659
   -1   638 -907,-693,571
   -1   639 -833,-653,676
   -1   640 
   -1   641 --- scanner 23 ---
   -1   642 614,503,499
   -1   643 -741,-573,-430
   -1   644 666,496,-326
   -1   645 586,590,-331
   -1   646 -874,485,504
   -1   647 70,134,-24
   -1   648 -764,665,-640
   -1   649 709,-743,589
   -1   650 -855,603,556
   -1   651 -860,543,-641
   -1   652 -739,-631,-531
   -1   653 680,-638,-489
   -1   654 -799,-406,850
   -1   655 870,-642,-477
   -1   656 -67,-30,81
   -1   657 801,-715,512
   -1   658 -878,-631,-432
   -1   659 -783,-619,896
   -1   660 764,-780,400
   -1   661 567,650,495
   -1   662 -829,494,587
   -1   663 555,524,472
   -1   664 -817,623,-556
   -1   665 646,573,-506
   -1   666 775,-532,-539
   -1   667 -721,-521,763
   -1   668 
   -1   669 --- scanner 24 ---
   -1   670 -804,350,366
   -1   671 456,-494,-642
   -1   672 363,-619,389
   -1   673 -411,-594,552
   -1   674 261,606,745
   -1   675 284,599,-445
   -1   676 341,-681,423
   -1   677 372,534,-507
   -1   678 278,586,-409
   -1   679 -878,381,388
   -1   680 -1,-117,40
   -1   681 -791,469,427
   -1   682 -127,5,-73
   -1   683 -670,-495,-397
   -1   684 435,-446,-785
   -1   685 543,-509,-828
   -1   686 -403,-518,594
   -1   687 -734,-428,-464
   -1   688 296,-644,362
   -1   689 -858,402,-681
   -1   690 376,752,753
   -1   691 -849,-457,-445
   -1   692 -892,315,-738
   -1   693 370,788,745
   -1   694 -794,272,-743
   -1   695 -418,-406,604
   -1   696 
   -1   697 --- scanner 25 ---
   -1   698 86,149,-150
   -1   699 -572,-670,-518
   -1   700 748,-704,-522
   -1   701 569,-536,361
   -1   702 -723,-522,310
   -1   703 563,566,-778
   -1   704 -419,589,553
   -1   705 -665,-309,333
   -1   706 -597,-464,-470
   -1   707 829,-696,-457
   -1   708 739,901,432
   -1   709 806,837,480
   -1   710 561,-471,352
   -1   711 -628,-622,-575
   -1   712 722,809,541
   -1   713 -623,602,-609
   -1   714 585,-716,359
   -1   715 623,-685,-515
   -1   716 -470,657,-672
   -1   717 -474,589,-578
   -1   718 412,592,-735
   -1   719 -286,527,455
   -1   720 1,56,27
   -1   721 567,611,-773
   -1   722 -332,511,668
   -1   723 -768,-400,393

diff --git a/2021/19/part1.rs b/2021/19/part1.rs

@@ -0,0 +1,174 @@
   -1     1 use std::collections::HashSet;
   -1     2 use std::env::args;
   -1     3 use std::fs::File;
   -1     4 use std::io::BufRead;
   -1     5 use std::io::BufReader;
   -1     6 
   -1     7 struct Scanner {
   -1     8     beacons: Vec<[i32; 3]>,
   -1     9     position: [i32; 3],
   -1    10 }
   -1    11 
   -1    12 fn get_data() -> Vec<Vec<[i32; 3]>> {
   -1    13     let path = args().nth(1).unwrap();
   -1    14     let file = File::open(path).unwrap();
   -1    15 
   -1    16     let mut scanners = vec![];
   -1    17     let mut beacons = vec![];
   -1    18 
   -1    19     for line in BufReader::new(file).lines() {
   -1    20         match line.unwrap().split(",").collect::<Vec<&str>>()[..] {
   -1    21             [""] => {
   -1    22                 scanners.push(beacons);
   -1    23                 beacons = vec![];
   -1    24             },
   -1    25             [a, b, c] => {
   -1    26                 beacons.push([
   -1    27                     a.parse::<i32>().unwrap(),
   -1    28                     b.parse::<i32>().unwrap(),
   -1    29                     c.parse::<i32>().unwrap(),
   -1    30                 ])
   -1    31             },
   -1    32             [_] => {},
   -1    33             _ => unreachable!(),
   -1    34         }
   -1    35     }
   -1    36     scanners.push(beacons);
   -1    37 
   -1    38     return scanners;
   -1    39 }
   -1    40 
   -1    41 fn apply_rotation(beacon: [i32; 3], rotation: u8) -> [i32; 3] {
   -1    42     let [x, y, z] = beacon;
   -1    43     let [x1, y1, z1] = match rotation / 4 {
   -1    44         0 => [ x,  y,  z],
   -1    45         1 => [-z,  y,  x],
   -1    46         2 => [-x,  y, -z],
   -1    47         3 => [ z,  y, -x],
   -1    48         4 => [ x, -z,  y],
   -1    49         5 => [ x,  z, -y],
   -1    50         _ => unreachable!(),
   -1    51     };
   -1    52     return match rotation % 4 {
   -1    53         0 => [ x1,  y1, z1],
   -1    54         1 => [-y1,  x1, z1],
   -1    55         2 => [-x1, -y1, z1],
   -1    56         3 => [ y1, -x1, z1],
   -1    57         _ => unreachable!(),
   -1    58     };
   -1    59 }
   -1    60 
   -1    61 fn apply_position(beacons: &Vec<[i32; 3]>, position: [i32; 3], rotation: u8) -> Vec<[i32; 3]> {
   -1    62     let [dx, dy, dz] = position;
   -1    63     beacons
   -1    64         .iter()
   -1    65         .map(|beacon| apply_rotation(*beacon, rotation))
   -1    66         .map(|[x, y, z]| [x + dx, y + dy, z + dz])
   -1    67         .collect()
   -1    68 }
   -1    69 
   -1    70 fn in_scanner_range(beacon: [i32; 3], a: [i32; 3], b: [i32; 3]) -> bool {
   -1    71     let [x, y, z] = beacon;
   -1    72     let [ax, ay, az] = a;
   -1    73     let [bx, by, bz] = b;
   -1    74     (
   -1    75         (ax <= bx && bx - 1000 <= x && x <= ax + 1000)
   -1    76         || (bx <= ax && ax - 1000 <= x && x <= bx + 1000)
   -1    77     ) && (
   -1    78         (ay <= by && by - 1000 <= y && y <= ay + 1000)
   -1    79         || (by <= ay && ay - 1000 <= y && y <= by + 1000)
   -1    80     ) && (
   -1    81         (az <= bz && bz - 1000 <= z && z <= az + 1000)
   -1    82         || (bz <= az && az - 1000 <= z && z <= bz + 1000)
   -1    83     )
   -1    84 }
   -1    85 
   -1    86 fn check_overlap(a: &Scanner, b: &Vec<[i32; 3]>, b_position: [i32; 3], b_rotation: u8) -> bool {
   -1    87     let a_position = a.position;
   -1    88     let a_area: HashSet<[i32; 3]> = a.beacons.clone().into_iter().filter(|beacon|
   -1    89         in_scanner_range(*beacon, a_position, b_position)
   -1    90     ).collect();
   -1    91     let n = a_area.len();
   -1    92     if n < 12 {
   -1    93         return false;
   -1    94     }
   -1    95 
   -1    96     // TODO PERF: if match we could reuse this
   -1    97     let b_mapped = apply_position(b, b_position, b_rotation);
   -1    98     let b_area: HashSet<[i32; 3]> = b_mapped.into_iter().filter(|beacon|
   -1    99         in_scanner_range(*beacon, a_position, b_position)
   -1   100     ).collect();
   -1   101 
   -1   102     return b_area.len() == n && a_area.intersection(&b_area).count() == n;
   -1   103 }
   -1   104 
   -1   105 fn find_overlap(a: &Scanner, b: &Vec<[i32; 3]>) -> Option<([i32; 3], u8)> {
   -1   106     for rotation in 0..24 {
   -1   107         for beacon in b.iter() {
   -1   108             let [bx1, by1, bz1] = apply_rotation(*beacon, rotation);
   -1   109             // PERF: we can skip up to 11 beacons because we need to match at least 12
   -1   110             for [ax1, ay1, az1] in a.beacons[11..].iter() {
   -1   111                 let pos = [ax1 - bx1, ay1 - by1, az1 - bz1];
   -1   112                 if check_overlap(a, b, pos, rotation) {
   -1   113                     return Some((pos, rotation));
   -1   114                 }
   -1   115             }
   -1   116         }
   -1   117     }
   -1   118     return None;
   -1   119 }
   -1   120 
   -1   121 fn main() {
   -1   122     let mut unsettled = get_data();
   -1   123     let mut queue: Vec<Scanner> = vec![];
   -1   124     let mut settled: Vec<Scanner> = vec![];
   -1   125 
   -1   126     let first = unsettled.pop().unwrap();
   -1   127     queue.push(Scanner {
   -1   128         beacons: first,
   -1   129         position: [0, 0, 0],
   -1   130     });
   -1   131 
   -1   132     while queue.len() > 0 {
   -1   133         println!("unsettled: {}  queued: {}  settled: {}", unsettled.len(), queue.len(), settled.len());
   -1   134         let cur = queue.pop().unwrap();
   -1   135         let mut i = 0;
   -1   136         while i < unsettled.len() {
   -1   137             match find_overlap(&cur, &unsettled[i]) {
   -1   138                 None => i += 1,
   -1   139                 Some((position, rotation)) => {
   -1   140                     let beacons = unsettled.remove(i);
   -1   141                     let mapped = apply_position(&beacons, position, rotation);
   -1   142                     queue.push(Scanner {
   -1   143                         beacons: mapped,
   -1   144                         position,
   -1   145                     });
   -1   146                 },
   -1   147             }
   -1   148         }
   -1   149         settled.push(cur);
   -1   150     }
   -1   151 
   -1   152     assert_eq!(unsettled.len(), 0);
   -1   153 
   -1   154     let mut beacons = HashSet::new();
   -1   155     for scanner in settled.iter() {
   -1   156         for beacon in scanner.beacons.iter() {
   -1   157             beacons.insert(beacon);
   -1   158         }
   -1   159     }
   -1   160     println!("{}", beacons.len());
   -1   161 
   -1   162     let mut max_distance = 0;
   -1   163     for a in settled.iter() {
   -1   164         let [ax, ay, az] = a.position;
   -1   165         for b in settled.iter() {
   -1   166             let [bx, by, bz] = b.position;
   -1   167             let d = (ax - bx).abs() + (ay - by).abs() + (az - bz).abs();
   -1   168             if d > max_distance {
   -1   169                 max_distance = d;
   -1   170             }
   -1   171         }
   -1   172     }
   -1   173     println!("{}", max_distance);
   -1   174 }

diff --git a/2021/19/test.txt b/2021/19/test.txt

@@ -0,0 +1,136 @@
   -1     1 --- scanner 0 ---
   -1     2 404,-588,-901
   -1     3 528,-643,409
   -1     4 -838,591,734
   -1     5 390,-675,-793
   -1     6 -537,-823,-458
   -1     7 -485,-357,347
   -1     8 -345,-311,381
   -1     9 -661,-816,-575
   -1    10 -876,649,763
   -1    11 -618,-824,-621
   -1    12 553,345,-567
   -1    13 474,580,667
   -1    14 -447,-329,318
   -1    15 -584,868,-557
   -1    16 544,-627,-890
   -1    17 564,392,-477
   -1    18 455,729,728
   -1    19 -892,524,684
   -1    20 -689,845,-530
   -1    21 423,-701,434
   -1    22 7,-33,-71
   -1    23 630,319,-379
   -1    24 443,580,662
   -1    25 -789,900,-551
   -1    26 459,-707,401
   -1    27 
   -1    28 --- scanner 1 ---
   -1    29 686,422,578
   -1    30 605,423,415
   -1    31 515,917,-361
   -1    32 -336,658,858
   -1    33 95,138,22
   -1    34 -476,619,847
   -1    35 -340,-569,-846
   -1    36 567,-361,727
   -1    37 -460,603,-452
   -1    38 669,-402,600
   -1    39 729,430,532
   -1    40 -500,-761,534
   -1    41 -322,571,750
   -1    42 -466,-666,-811
   -1    43 -429,-592,574
   -1    44 -355,545,-477
   -1    45 703,-491,-529
   -1    46 -328,-685,520
   -1    47 413,935,-424
   -1    48 -391,539,-444
   -1    49 586,-435,557
   -1    50 -364,-763,-893
   -1    51 807,-499,-711
   -1    52 755,-354,-619
   -1    53 553,889,-390
   -1    54 
   -1    55 --- scanner 2 ---
   -1    56 649,640,665
   -1    57 682,-795,504
   -1    58 -784,533,-524
   -1    59 -644,584,-595
   -1    60 -588,-843,648
   -1    61 -30,6,44
   -1    62 -674,560,763
   -1    63 500,723,-460
   -1    64 609,671,-379
   -1    65 -555,-800,653
   -1    66 -675,-892,-343
   -1    67 697,-426,-610
   -1    68 578,704,681
   -1    69 493,664,-388
   -1    70 -671,-858,530
   -1    71 -667,343,800
   -1    72 571,-461,-707
   -1    73 -138,-166,112
   -1    74 -889,563,-600
   -1    75 646,-828,498
   -1    76 640,759,510
   -1    77 -630,509,768
   -1    78 -681,-892,-333
   -1    79 673,-379,-804
   -1    80 -742,-814,-386
   -1    81 577,-820,562
   -1    82 
   -1    83 --- scanner 3 ---
   -1    84 -589,542,597
   -1    85 605,-692,669
   -1    86 -500,565,-823
   -1    87 -660,373,557
   -1    88 -458,-679,-417
   -1    89 -488,449,543
   -1    90 -626,468,-788
   -1    91 338,-750,-386
   -1    92 528,-832,-391
   -1    93 562,-778,733
   -1    94 -938,-730,414
   -1    95 543,643,-506
   -1    96 -524,371,-870
   -1    97 407,773,750
   -1    98 -104,29,83
   -1    99 378,-903,-323
   -1   100 -778,-728,485
   -1   101 426,699,580
   -1   102 -438,-605,-362
   -1   103 -469,-447,-387
   -1   104 509,732,623
   -1   105 647,635,-688
   -1   106 -868,-804,481
   -1   107 614,-800,639
   -1   108 595,780,-596
   -1   109 
   -1   110 --- scanner 4 ---
   -1   111 727,592,562
   -1   112 -293,-554,779
   -1   113 441,611,-461
   -1   114 -714,465,-776
   -1   115 -743,427,-804
   -1   116 -660,-479,-426
   -1   117 832,-632,460
   -1   118 927,-485,-438
   -1   119 408,393,-506
   -1   120 466,436,-512
   -1   121 110,16,151
   -1   122 -258,-428,682
   -1   123 -393,719,612
   -1   124 -211,-452,876
   -1   125 808,-476,-593
   -1   126 -575,615,604
   -1   127 -485,667,467
   -1   128 -680,325,-822
   -1   129 -627,-443,-432
   -1   130 872,-547,-609
   -1   131 833,512,582
   -1   132 807,604,487
   -1   133 839,-516,451
   -1   134 891,-625,532
   -1   135 -652,-548,-490
   -1   136 30,-46,-14