From 7a2aa865cc537d5da29ec8bdcac51205a878d876 Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Mon, 20 Dec 2021 08:14:34 +0100 Subject: [PATCH] Day 19: Add C solution --- 19/input.txt | 949 ++++++++++++++++++++++++++++++++++++++++++++++++++ 19/solution.c | 129 +++++++ 2 files changed, 1078 insertions(+) create mode 100644 19/input.txt create mode 100644 19/solution.c diff --git a/19/input.txt b/19/input.txt new file mode 100644 index 0000000..4e5af1e --- /dev/null +++ b/19/input.txt @@ -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 \ No newline at end of file diff --git a/19/solution.c b/19/solution.c new file mode 100644 index 0000000..6f45173 --- /dev/null +++ b/19/solution.c @@ -0,0 +1,129 @@ +#include +#include +#include +#include + +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= 12) { +#pragma omp critical +{ + beacon tmp[scanners[i].nbeacons-1]; + int ntmp=0; + for (int kdp=1;kdp G) G=m; + } + } + + printf("Gold: %d\n",G); + + for(int i=0;i