2
1
Fork 0

Day 19: Add C solution

This commit is contained in:
Mia Herkt 2021-12-20 08:14:34 +01:00
parent 4e22e92c78
commit 7a2aa865cc
Signed by: mia
GPG Key ID: 72E154B8622EC191
2 changed files with 1078 additions and 0 deletions

949
19/input.txt Normal file
View File

@ -0,0 +1,949 @@
--- scanner 0 ---
-731,-763,-425
832,-512,-437
571,657,-514
594,551,-569
-604,638,718
-536,524,776
629,721,-564
-623,-444,440
-708,-610,437
550,-524,759
355,515,510
-683,877,-615
763,-622,-365
-833,-795,-362
-663,840,-668
-676,876,-848
7,-92,-35
560,-560,695
-559,539,599
528,-504,779
-709,-874,-390
457,445,563
841,-410,-363
-742,-511,374
422,463,367
--- scanner 1 ---
598,477,221
687,-702,-850
-586,-650,-945
-588,-636,-820
-676,-819,603
431,-621,738
-790,449,456
339,566,-635
386,708,-671
466,672,-647
245,-629,714
-674,520,398
-20,-191,-108
624,398,329
-712,486,-889
-851,477,396
-791,580,-833
627,330,296
623,-679,-824
-859,-833,629
697,-847,-874
-463,-586,-905
-607,554,-853
-789,-836,551
-168,-4,-10
413,-642,724
--- scanner 2 ---
676,816,-834
614,746,-853
-592,-743,-408
-72,47,-39
-744,-404,762
444,-703,786
753,-784,-474
-534,-783,-416
735,717,-765
568,482,582
-343,434,-675
-488,758,370
545,517,368
-489,888,446
-642,-821,-498
-351,372,-463
384,-705,874
-827,-527,719
624,-720,837
88,-28,74
503,604,524
-640,-593,761
-419,427,-552
690,-818,-490
-353,831,437
650,-734,-583
--- scanner 3 ---
-561,681,-898
-696,-781,-955
674,322,-753
-631,640,-859
421,399,364
-559,-639,519
451,-574,320
-599,-747,467
-813,515,442
809,328,-802
478,-579,460
-710,-656,-826
455,-597,-612
-600,-812,-818
555,-700,367
593,379,413
382,-629,-639
810,259,-767
-46,21,-86
-662,548,550
-618,-569,546
-710,453,457
-805,672,-885
479,482,472
444,-658,-572
75,-100,-5
--- scanner 4 ---
-720,-688,-429
75,21,146
-524,-443,905
-455,739,547
28,-141,13
-697,-360,919
826,-631,876
-556,623,540
710,450,-593
-545,-345,887
697,394,-509
767,-745,773
875,-803,856
614,-573,-535
542,624,862
-794,439,-772
561,-428,-543
-746,370,-754
-683,-626,-394
469,634,823
-628,431,-669
-754,-741,-370
741,613,-533
489,522,847
-374,623,575
664,-373,-571
--- scanner 5 ---
699,-825,730
537,-594,-346
346,566,583
-631,-481,703
-787,-523,790
859,752,-606
585,-767,662
424,-689,-351
-648,384,-472
684,-648,707
-709,511,419
-683,421,-534
-38,84,173
-707,350,-419
-342,-793,-586
765,684,-628
-573,-546,825
493,-563,-373
-785,510,549
701,831,-589
-718,375,476
-335,-697,-642
383,619,603
-293,-795,-521
347,799,590
117,6,18
--- scanner 6 ---
-716,-702,538
795,547,748
-711,527,-540
601,413,-940
-863,-529,-512
388,-501,-871
-723,-534,-539
787,759,810
-637,-524,557
719,670,755
300,-440,423
580,395,-842
-816,-655,-616
345,-571,505
554,-554,-934
-633,593,601
-741,560,752
547,-535,-827
753,381,-925
359,-597,479
-819,444,-482
10,13,-72
-664,-594,498
-770,424,-654
-726,498,649
--- scanner 7 ---
-582,-761,459
-453,-839,-862
804,-878,437
-612,749,581
436,398,564
-487,-795,-703
807,842,-463
750,-880,275
-549,511,-891
718,787,-531
145,-81,-100
-503,-738,369
-600,814,464
429,-893,-497
-599,645,571
-540,-758,410
718,-866,393
461,-908,-649
-523,537,-905
595,780,-455
-506,-902,-696
417,468,502
505,497,623
12,47,-20
-392,455,-950
443,-810,-670
--- scanner 8 ---
53,162,-22
967,695,948
770,-615,-548
-670,-668,425
968,599,931
956,564,873
-402,599,-642
-440,-235,-401
840,-611,-438
684,602,-426
609,-449,832
691,788,-464
-498,984,913
895,-586,-503
-501,913,878
167,129,170
695,623,-587
493,-550,825
-523,556,-616
-368,-412,-433
-478,-443,-393
-7,18,134
-390,903,852
-353,475,-643
609,-631,797
-691,-717,496
-674,-800,467
--- scanner 9 ---
523,-356,773
-764,463,-560
-425,-730,874
668,-366,749
728,-640,-825
67,173,60
903,419,-683
-787,551,-542
-403,-811,707
889,413,-586
749,-622,-839
-763,407,-508
741,-808,-815
-699,745,628
-523,-387,-566
-489,-747,745
-606,801,513
-724,-387,-543
-647,-369,-544
-682,846,572
658,516,448
518,532,446
460,523,469
94,-8,-68
885,388,-755
691,-430,723
--- scanner 10 ---
632,619,803
-337,-640,-546
746,-937,-943
-81,54,-168
821,-857,548
706,756,751
683,-855,672
-733,363,-817
-615,381,-906
-584,435,-808
-329,-782,-669
586,461,-730
659,730,711
-493,496,495
766,-822,-830
-338,-687,-635
-589,-913,412
721,-864,422
-601,-806,278
397,451,-676
-10,-104,0
-604,404,408
487,463,-794
775,-762,-933
-602,583,413
-461,-925,315
--- scanner 11 ---
-746,899,-576
407,869,433
-547,-309,328
-416,-384,339
-316,-483,-310
399,485,-678
698,-432,802
-46,-77,89
-648,857,-455
-726,877,401
-478,-429,-312
-744,850,-511
608,-772,-282
433,544,-625
629,-790,-380
-729,896,666
525,784,494
-451,-326,327
46,69,-60
359,887,502
470,509,-563
-434,-515,-324
456,-804,-297
-788,819,534
779,-460,686
597,-425,686
--- scanner 12 ---
363,-267,559
256,-401,547
-772,-682,-877
314,-661,-725
19,64,-38
-676,-711,473
-685,590,-796
-833,-770,417
-719,-516,-940
529,557,295
387,680,287
-625,644,776
244,-304,419
347,841,-808
407,944,-817
-702,-725,499
-173,172,-77
-738,-523,-833
-613,761,711
-722,549,-776
232,954,-788
-643,639,-799
312,-537,-863
305,-411,-763
482,646,296
-626,751,607
--- scanner 13 ---
292,-495,571
651,919,779
-175,-32,46
-939,696,356
-690,411,-464
-384,-810,562
-785,-685,-485
-795,451,-566
773,-408,-583
-906,399,-435
781,-531,-441
-455,-767,470
772,-497,-536
357,-612,559
-950,531,445
-455,-745,448
595,860,622
649,453,-298
-917,726,512
-20,152,68
-778,-675,-648
-763,-609,-482
509,416,-417
569,874,648
461,-602,572
521,550,-310
--- scanner 14 ---
-322,-641,670
-349,354,-648
-625,714,619
812,-715,-617
-491,-748,669
821,527,-792
909,550,885
-599,728,593
-294,286,-737
87,-111,72
354,-956,679
-668,-679,-347
425,-891,793
862,-818,-726
-387,-758,682
887,580,729
425,-913,771
-639,-800,-435
-356,278,-525
-46,-32,-48
899,577,-702
896,-755,-710
920,385,796
861,469,-784
-738,-741,-366
-681,773,462
--- scanner 15 ---
-863,636,832
887,603,374
-66,-152,-18
-406,-515,-665
-501,-905,785
542,-591,-441
790,520,-691
562,-667,653
888,610,607
-680,319,-645
-611,-836,857
813,415,-771
732,-702,658
668,-644,708
-784,760,860
-380,-439,-590
66,2,27
-839,277,-736
811,556,-859
-752,658,797
-576,-505,-555
-746,345,-682
543,-455,-365
851,590,554
-399,-914,859
436,-477,-381
--- scanner 16 ---
695,-489,-727
-393,764,-274
513,-404,724
733,406,705
788,-449,-811
804,-386,-777
-591,-456,576
-715,-313,-340
-544,907,364
135,43,-46
-534,924,338
-559,835,455
-315,762,-398
444,-463,823
424,417,-730
695,626,745
-693,-291,-340
-378,843,-372
425,-525,753
454,414,-693
-604,-446,472
-601,-248,-269
465,460,-686
-592,-563,407
749,580,604
76,148,91
--- scanner 17 ---
455,-760,-649
670,-470,334
569,454,608
-358,-652,-715
-522,413,-718
578,-408,376
-499,503,-639
-510,818,236
-465,-659,-734
530,478,-610
534,643,-733
-435,-673,316
-123,-22,19
-481,808,411
630,-482,500
-421,-818,-768
541,457,-771
-573,-797,318
-490,705,351
-535,-547,309
-502,454,-681
385,-756,-759
330,-731,-694
20,-66,-142
736,518,636
522,517,683
--- scanner 18 ---
488,-495,-482
753,833,793
575,545,-722
437,-478,-662
-380,740,-476
-589,-884,-619
-447,-668,405
512,-794,706
66,67,-124
-535,581,492
-383,-610,455
555,-671,789
-392,808,-633
-659,-782,-672
-477,812,-495
741,783,712
-641,-817,-476
721,728,746
-433,523,401
513,-605,602
613,677,-617
188,-120,-51
-553,-645,460
400,-493,-422
-598,533,370
546,787,-712
--- scanner 19 ---
680,468,656
-895,-366,652
-732,-787,-709
-801,-610,-698
451,-753,587
600,-429,-518
-808,-712,-655
-85,174,-91
381,-734,525
480,-665,466
-787,899,-508
-696,913,386
-631,962,384
-752,920,482
499,-445,-344
-864,885,-423
-821,796,-468
523,758,-784
56,66,25
466,693,-633
593,624,698
715,682,633
501,782,-567
-897,-420,814
459,-483,-564
-883,-452,696
--- scanner 20 ---
397,-456,465
822,541,-705
-805,-570,-623
484,-683,-391
-592,793,-393
-867,737,670
-592,-860,531
-506,805,-437
-881,820,497
-560,807,-275
432,554,511
-12,12,62
780,662,-607
467,492,474
406,-399,601
773,606,-703
328,-770,-433
-893,-541,-502
-503,-915,463
330,-529,600
408,439,440
-715,-853,455
-849,835,649
542,-805,-456
-129,-146,27
-874,-471,-564
--- scanner 21 ---
533,528,-756
635,945,504
924,-707,-431
926,-248,469
-453,651,678
743,907,422
18,113,48
-426,-601,-285
-587,-409,730
-602,-306,668
934,-310,681
450,651,-713
-736,841,-422
788,-764,-440
858,-303,558
637,717,-755
-701,958,-484
685,867,414
-219,-659,-318
789,-634,-364
-609,608,678
-494,-457,635
-602,695,664
-672,954,-527
-322,-639,-423
--- scanner 22 ---
665,-972,357
157,-75,5
-645,524,554
-661,-821,715
552,-766,-295
572,402,640
534,-897,368
-544,439,-366
-641,414,484
569,492,-403
596,-852,-283
-616,479,429
-479,-856,715
6,-31,124
618,534,-400
434,-798,-281
593,563,629
-537,458,-259
-703,405,-322
-338,-477,-268
-580,-849,831
758,440,633
569,-955,356
528,455,-423
-490,-509,-253
-511,-491,-351
--- scanner 23 ---
388,-809,-352
-367,872,532
-415,-631,622
743,-603,724
-753,552,-643
562,-642,690
139,81,144
451,-707,-384
-381,-642,874
383,456,849
-411,-684,-537
416,-685,-273
-384,-613,831
-338,776,398
412,553,858
399,591,733
-264,869,422
-733,574,-623
-414,-599,-703
674,-497,728
48,-39,41
389,865,-737
-669,584,-587
463,856,-635
-348,-718,-636
391,787,-525
--- scanner 24 ---
-784,-392,606
-484,366,661
736,683,764
-663,-858,-769
833,-740,823
-553,-789,-841
821,-458,-849
-765,-867,-843
700,495,-558
87,-2,28
-325,324,752
790,830,797
705,-593,-833
836,-846,942
-418,392,698
830,-555,-820
1,-137,118
870,-733,933
662,640,-670
-380,807,-844
-301,683,-816
-588,-458,571
696,601,-489
-412,705,-781
-758,-468,681
661,785,811
--- scanner 25 ---
500,-759,-543
637,-476,865
844,524,-809
691,-401,789
755,549,-692
-670,-822,952
680,-578,858
374,779,921
-536,581,-571
-543,-454,-324
326,-743,-442
-738,485,812
-605,-435,-394
-832,-768,954
827,534,-783
396,700,869
-697,522,832
-24,26,176
-643,582,-740
-484,-523,-423
546,-705,-402
-526,594,-675
36,-123,83
-648,564,835
-714,-736,940
311,819,948
--- scanner 26 ---
-609,-865,-696
-730,-552,628
320,796,-676
-480,446,-760
-789,-814,-679
752,-686,698
86,-103,-33
-54,-53,105
601,-621,755
-543,462,-794
-688,-396,541
312,517,722
462,-422,-642
426,-451,-511
-557,806,840
535,-710,720
-619,825,770
366,785,-669
-849,-902,-681
532,555,762
-498,737,741
444,-531,-542
-665,-610,506
323,826,-713
-583,555,-710
486,501,621
--- scanner 27 ---
440,-949,710
-548,356,729
-860,601,-538
464,-767,-452
653,723,873
-846,-908,-728
440,436,-892
-730,-861,516
4,-62,-113
541,420,-718
407,-702,-603
581,741,842
484,727,848
442,-791,-669
-674,-844,415
458,-926,798
-923,-894,-813
-880,-805,-768
-93,-141,27
-550,496,745
400,474,-672
-571,298,738
-615,-768,460
-867,703,-581
-791,778,-527
406,-925,854
--- scanner 28 ---
647,354,627
754,-710,818
-32,-37,79
-607,574,728
706,-823,-325
-440,806,-361
811,-701,682
-630,680,673
686,-718,-428
-604,-428,344
627,391,574
-907,-614,-778
593,431,-839
681,-777,683
-481,-385,427
452,429,-751
557,452,-671
9,100,-69
-911,-657,-807
-554,700,-421
648,-856,-532
-665,510,678
640,355,394
-670,-386,531
-794,-719,-842
-418,699,-345
--- scanner 29 ---
345,-686,278
590,445,375
-10,-33,-90
730,443,391
-830,567,-808
-329,-599,712
-452,-400,-567
725,770,-497
-454,-606,663
788,466,382
580,746,-507
359,-589,272
557,720,-571
-688,531,-855
-520,-433,-570
-571,763,607
363,-758,247
-794,543,-728
-464,-557,820
-121,76,13
-599,-325,-596
-469,671,559
-529,590,644
520,-828,-781
507,-818,-949
499,-842,-763
--- scanner 30 ---
898,-783,-440
922,437,482
-471,-599,844
754,-763,593
74,-14,20
-699,-844,-819
905,-782,548
7,-163,-135
864,402,436
-386,-589,679
427,680,-886
405,573,-902
-465,303,-496
-661,-982,-715
-477,-574,623
-728,245,476
-719,-949,-922
541,574,-826
-570,326,-576
781,-845,-405
-555,248,370
-606,305,-408
907,-709,651
894,-740,-469
916,504,488
-697,342,327
--- scanner 31 ---
246,-795,-450
689,777,-513
-737,-654,-829
659,821,460
300,-430,432
-748,371,-546
-636,391,-522
-451,-517,506
555,774,586
-738,444,-507
-33,-82,-118
-476,718,803
329,-622,-464
-576,-488,551
231,-643,-482
-498,868,705
632,681,465
-737,-472,-794
-853,-553,-822
631,669,-596
5,80,24
344,-589,466
-506,-492,441
517,728,-493
-469,691,760
237,-596,485
--- scanner 32 ---
299,519,833
-547,650,-617
395,-426,414
-954,-698,761
643,-437,-429
-715,929,492
-555,612,-825
-856,-676,911
-911,-705,734
313,846,-260
-657,-723,-474
-658,986,590
267,489,859
-714,907,743
371,-538,434
342,863,-343
671,-321,-510
-592,-668,-449
-702,-598,-445
-134,142,-43
-587,540,-648
239,648,792
356,-436,487
678,-437,-611
-22,23,114
271,842,-392
--- scanner 33 ---
353,649,717
632,-572,-385
627,-425,511
569,-375,575
-478,613,-778
566,-759,-427
420,506,769
759,692,-309
455,702,787
742,512,-360
592,-430,681
-443,636,-564
-678,-709,356
744,452,-272
-665,-529,392
-606,857,594
-792,-285,-709
-685,-476,355
39,-2,98
-561,738,693
-31,148,10
-849,-421,-700
-565,571,-622
-538,915,708
443,-676,-384
-719,-420,-776

129
19/solution.c Normal file
View File

@ -0,0 +1,129 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
typedef struct beacon {
int x,y,z;
} beacon;
typedef struct scanner {
int nbeacons, known;
beacon *beacons;
} scanner;
inline static beacon transform(beacon b, int i) {
int x=b.x,y=b.y,z=b.z;
#define r(n,a,b,c) case n: return (beacon){a,b,c}
switch (i) {
r( 0, x, y, z); r( 1, x,-y,-z); r( 2, x, z,-y); r( 3, x,-z, y);
r( 4, y, x,-z); r( 5, y,-x, z); r( 6, y, z, x); r( 7, y,-z,-x);
r( 8, z, x, y); r( 9, z,-x,-y); r(10, z, y,-x); r(11, z,-y, x);
r(12,-x, y,-z); r(13,-x,-y, z); r(14,-x, z, y); r(15,-x,-z,-y);
r(16,-y, x, z); r(17,-y,-x,-z); r(18,-y, z,-x); r(19,-y,-z, x);
r(20,-z, x,-y); r(21,-z,-x, y); r(22,-z, y, x); r(23,-z,-y,-x);
}
return (beacon){0};
}
inline static beacon sub(beacon a, beacon b) {
return (beacon){a.x-b.x, a.y-b.y, a.z-b.z};
}
inline static int manhattan(beacon a, beacon b) {
return abs(a.x-b.x) + abs(a.y-b.y) + abs(a.z-b.z);
}
int main() {
scanner *scanners=NULL;
beacon *known_beacons;
int nscanners, known=1,knownb=0;
getchar();
while(scanf("-- scanner %d ---\n",&nscanners)==1) {
nscanners++;
scanners=realloc(scanners,nscanners*sizeof(scanner));
scanner *s = &scanners[nscanners-1];
s->beacons=NULL;
s->nbeacons=1;
s->known=nscanners==1;
beacon b;
while(scanf("%i,%i,%i",&b.x,&b.y,&b.z)==3) {
s->beacons=realloc(s->beacons,++s->nbeacons*sizeof(beacon));
s->beacons[s->nbeacons-1]=b;
knownb++;
}
memset(&s->beacons[0],0,sizeof(beacon));
scanf("%*[^-]");
}
known_beacons = malloc(knownb*sizeof(beacon));
knownb = scanners[0].nbeacons;
memcpy(known_beacons, scanners[0].beacons, knownb*sizeof(beacon));
while (known<nscanners) {
#pragma omp parallel for schedule(dynamic,10) collapse(2)
for (int i=0;i<nscanners;i++) {
for (int m=0;m<24;m++) {
if (scanners[i].known) continue;
for(int kb=0; kb<knownb; kb++) {
for(int tp=1;tp<scanners[i].nbeacons;tp++) {
int candidates=0;
beacon disp = sub(transform(scanners[i].beacons[tp],m), known_beacons[kb]);
for (int dp=1;dp<scanners[i].nbeacons;dp++) {
beacon c = sub(transform(scanners[i].beacons[dp],m),disp);
for (int ckb=0;ckb<knownb;ckb++) {
if (!memcmp(&c, &known_beacons[ckb], sizeof(beacon))){
candidates++;
if (candidates >= 12) {
#pragma omp critical
{
beacon tmp[scanners[i].nbeacons-1];
int ntmp=0;
for (int kdp=1;kdp<scanners[i].nbeacons;kdp++) {
beacon t = sub(transform(scanners[i].beacons[kdp],m),disp);
int found=0;
for (int kdc=0;kdc<knownb;kdc++)
if (!memcmp(&t, &known_beacons[kdc],sizeof(beacon))) {
found++;break;
}
if (!found)
tmp[ntmp++] = t;
}
memcpy(known_beacons+knownb,tmp,ntmp*sizeof(beacon));
knownb+=ntmp;
scanners[i].beacons[0] = (beacon){-disp.x,-disp.y,-disp.z};
scanners[i].known=1;
known++;
printf("%d/%d\n",known,nscanners);
}
goto next;
}
}
}
}
}
}
next:
}
}
}
printf("Silver: %d\n",knownb-1);
int G=0;
for(int i=0;i<nscanners;i++){
for(int j=0;j<nscanners;j++) {
int m = manhattan(scanners[i].beacons[0],scanners[j].beacons[0]);
if (m > G) G=m;
}
}
printf("Gold: %d\n",G);
for(int i=0;i<nscanners;i++)
free(scanners[i].beacons);
free(scanners);
free(known_beacons);
}