diff --git a/CMakeLists.txt b/CMakeLists.txt index a95f9bd..fbb04a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,5 +3,5 @@ project(aoc_2021 C) set(CMAKE_C_STANDARD 99) -add_executable(aoc_2021 src/main.c src/day_1.c src/day.h src/day_2.c src/puzzle_input.c src/puzzle_input.h src/day_3.c src/day_4.c) +add_executable(aoc_2021 src/main.c src/day_1.c src/day.h src/day_2.c src/puzzle_input.c src/puzzle_input.h src/day_3.c src/day_4.c src/day_5.c) target_link_libraries(aoc_2021 m) diff --git a/inputs/day_5.txt b/inputs/day_5.txt new file mode 100644 index 0000000..0f41bb1 --- /dev/null +++ b/inputs/day_5.txt @@ -0,0 +1,500 @@ +527,299 -> 430,299 +828,228 -> 81,228 +40,126 -> 842,928 +30,390 -> 30,741 +196,853 -> 196,599 +388,795 -> 388,300 +326,398 -> 326,766 +63,865 -> 63,407 +119,453 -> 282,453 +478,396 -> 824,396 +934,189 -> 612,189 +739,122 -> 306,555 +394,970 -> 394,249 +213,693 -> 213,336 +955,11 -> 688,11 +632,211 -> 818,211 +324,662 -> 66,404 +652,773 -> 811,614 +964,746 -> 402,184 +105,959 -> 850,214 +454,852 -> 594,852 +685,669 -> 124,669 +95,11 -> 873,789 +737,266 -> 484,266 +547,701 -> 764,484 +290,20 -> 290,164 +103,870 -> 283,870 +762,582 -> 762,431 +69,154 -> 55,154 +584,37 -> 308,37 +200,218 -> 200,336 +50,871 -> 766,155 +256,212 -> 919,875 +421,779 -> 959,241 +987,42 -> 304,725 +139,791 -> 330,600 +728,53 -> 845,53 +807,907 -> 423,907 +765,642 -> 868,642 +701,279 -> 701,75 +29,890 -> 542,890 +929,105 -> 59,975 +23,355 -> 485,817 +597,440 -> 454,440 +770,338 -> 629,338 +856,203 -> 856,858 +262,806 -> 951,806 +976,879 -> 976,179 +91,879 -> 950,20 +378,216 -> 378,440 +300,794 -> 507,794 +174,890 -> 907,157 +850,37 -> 171,37 +61,375 -> 117,375 +350,984 -> 460,984 +454,361 -> 672,361 +118,802 -> 118,448 +225,929 -> 974,180 +880,69 -> 341,608 +52,986 -> 891,147 +367,529 -> 367,707 +302,385 -> 674,385 +970,122 -> 145,947 +526,676 -> 214,364 +463,651 -> 463,708 +861,779 -> 168,86 +11,965 -> 913,63 +461,63 -> 944,63 +610,532 -> 199,121 +715,594 -> 512,594 +107,94 -> 490,94 +913,558 -> 404,558 +25,55 -> 911,941 +861,443 -> 861,329 +411,113 -> 884,113 +125,636 -> 740,636 +55,157 -> 815,917 +901,744 -> 547,744 +86,340 -> 86,866 +64,698 -> 270,698 +519,324 -> 371,324 +857,634 -> 857,35 +384,137 -> 28,137 +859,981 -> 859,302 +351,757 -> 351,204 +460,557 -> 460,792 +954,581 -> 112,581 +303,405 -> 303,599 +445,588 -> 246,588 +664,114 -> 664,107 +556,397 -> 556,714 +210,112 -> 939,841 +477,953 -> 180,656 +913,536 -> 913,333 +405,152 -> 552,152 +805,848 -> 805,12 +759,318 -> 759,163 +443,167 -> 231,167 +906,336 -> 906,122 +470,781 -> 546,705 +536,359 -> 814,81 +445,167 -> 935,167 +226,729 -> 730,729 +940,876 -> 510,446 +433,87 -> 533,87 +437,887 -> 186,887 +609,217 -> 431,217 +766,388 -> 663,388 +397,826 -> 82,826 +411,324 -> 411,437 +632,75 -> 632,290 +583,646 -> 836,899 +118,703 -> 118,307 +907,275 -> 721,275 +321,191 -> 321,362 +168,594 -> 168,55 +857,290 -> 284,290 +879,232 -> 879,456 +578,206 -> 28,756 +47,144 -> 47,777 +815,521 -> 445,151 +765,680 -> 523,438 +139,817 -> 534,422 +372,539 -> 36,539 +900,758 -> 900,987 +248,835 -> 558,835 +259,774 -> 472,774 +375,436 -> 172,436 +265,754 -> 265,556 +753,161 -> 753,307 +677,648 -> 677,743 +79,427 -> 79,34 +391,304 -> 754,304 +339,275 -> 339,548 +596,584 -> 596,684 +677,656 -> 64,43 +789,409 -> 814,434 +420,436 -> 822,436 +842,552 -> 181,552 +931,124 -> 69,986 +976,147 -> 97,147 +854,673 -> 400,219 +622,300 -> 622,339 +331,503 -> 331,585 +450,795 -> 489,756 +47,883 -> 920,10 +387,843 -> 793,843 +87,452 -> 583,948 +84,77 -> 610,603 +145,147 -> 903,147 +203,971 -> 203,67 +797,171 -> 713,171 +472,559 -> 872,959 +116,349 -> 116,43 +82,654 -> 461,275 +208,641 -> 208,25 +212,474 -> 198,488 +521,396 -> 187,396 +56,916 -> 937,916 +359,806 -> 888,806 +841,220 -> 841,857 +288,791 -> 288,610 +254,584 -> 254,37 +302,485 -> 743,926 +414,590 -> 510,686 +899,600 -> 132,600 +923,543 -> 93,543 +597,103 -> 918,103 +130,143 -> 920,933 +741,216 -> 867,216 +915,852 -> 723,852 +519,842 -> 541,842 +197,407 -> 197,526 +214,775 -> 214,728 +854,345 -> 938,345 +719,820 -> 788,751 +46,937 -> 758,225 +685,173 -> 685,354 +192,500 -> 500,500 +947,663 -> 335,51 +810,675 -> 209,74 +329,753 -> 62,753 +651,866 -> 614,866 +760,627 -> 258,627 +491,645 -> 491,473 +988,17 -> 22,983 +921,951 -> 14,44 +176,591 -> 176,750 +401,129 -> 381,129 +145,329 -> 145,905 +286,116 -> 273,103 +91,185 -> 91,756 +634,752 -> 634,14 +252,645 -> 290,645 +954,645 -> 954,350 +115,177 -> 115,121 +52,682 -> 52,51 +638,966 -> 841,763 +851,854 -> 152,155 +77,433 -> 599,955 +309,964 -> 309,426 +413,958 -> 413,235 +150,831 -> 150,118 +981,383 -> 422,942 +748,776 -> 748,631 +509,127 -> 509,231 +595,136 -> 301,136 +458,838 -> 458,912 +608,290 -> 239,290 +57,921 -> 946,32 +524,756 -> 317,963 +567,425 -> 567,443 +832,716 -> 740,716 +182,218 -> 650,686 +421,936 -> 127,642 +342,366 -> 441,267 +672,754 -> 376,754 +758,724 -> 758,379 +602,795 -> 349,795 +409,887 -> 988,308 +508,13 -> 561,66 +582,946 -> 369,733 +332,542 -> 136,346 +295,256 -> 926,256 +839,846 -> 839,698 +649,333 -> 522,333 +837,625 -> 837,184 +64,85 -> 618,639 +210,930 -> 414,930 +428,651 -> 214,651 +832,362 -> 832,926 +92,385 -> 92,799 +132,978 -> 747,978 +545,867 -> 545,947 +256,708 -> 239,725 +830,962 -> 570,962 +356,150 -> 781,575 +116,29 -> 965,878 +342,546 -> 53,835 +576,170 -> 780,170 +40,767 -> 656,151 +417,514 -> 417,114 +60,517 -> 60,137 +715,760 -> 557,760 +508,329 -> 508,371 +467,427 -> 19,427 +227,531 -> 742,16 +332,450 -> 867,450 +274,323 -> 524,323 +539,677 -> 460,677 +224,403 -> 224,845 +373,916 -> 366,916 +400,84 -> 400,895 +824,502 -> 824,804 +835,967 -> 347,479 +838,639 -> 838,798 +386,247 -> 616,17 +165,445 -> 408,445 +941,849 -> 913,849 +792,469 -> 792,600 +630,521 -> 630,344 +338,418 -> 298,458 +163,571 -> 527,571 +102,290 -> 911,290 +213,745 -> 213,267 +225,795 -> 778,242 +986,988 -> 10,12 +239,445 -> 239,829 +526,714 -> 526,225 +224,774 -> 953,45 +467,915 -> 467,291 +395,148 -> 204,339 +871,549 -> 392,549 +817,452 -> 939,330 +942,19 -> 942,937 +166,627 -> 207,627 +901,306 -> 901,158 +103,339 -> 466,339 +351,19 -> 815,19 +677,659 -> 203,185 +270,25 -> 46,25 +318,461 -> 318,129 +283,428 -> 884,428 +696,966 -> 893,966 +388,237 -> 381,230 +172,978 -> 172,18 +434,499 -> 156,777 +630,682 -> 501,682 +272,340 -> 251,361 +410,94 -> 410,885 +863,920 -> 747,920 +986,985 -> 14,13 +369,626 -> 256,513 +638,496 -> 571,496 +196,609 -> 638,609 +710,959 -> 454,959 +642,578 -> 642,468 +457,720 -> 379,798 +88,86 -> 88,320 +361,352 -> 157,556 +55,57 -> 450,57 +532,204 -> 532,750 +76,856 -> 658,274 +818,750 -> 397,329 +829,801 -> 128,100 +843,892 -> 433,892 +516,438 -> 516,59 +216,534 -> 216,914 +767,973 -> 56,973 +288,91 -> 342,91 +51,52 -> 417,418 +979,570 -> 497,570 +438,471 -> 579,330 +751,57 -> 751,619 +199,403 -> 118,403 +811,903 -> 251,343 +294,47 -> 950,703 +457,107 -> 967,617 +976,42 -> 34,984 +84,194 -> 265,194 +944,341 -> 131,341 +935,398 -> 276,398 +716,135 -> 513,135 +846,690 -> 846,950 +786,858 -> 786,960 +491,677 -> 491,57 +283,781 -> 15,513 +51,736 -> 557,230 +503,825 -> 928,825 +70,980 -> 960,90 +947,135 -> 732,350 +968,873 -> 336,241 +955,185 -> 157,983 +887,644 -> 887,530 +315,315 -> 604,604 +728,163 -> 728,67 +759,286 -> 759,55 +255,73 -> 653,471 +156,942 -> 983,115 +840,877 -> 69,106 +828,451 -> 828,117 +742,655 -> 349,655 +576,664 -> 576,427 +74,960 -> 962,72 +293,169 -> 711,169 +151,771 -> 929,771 +860,908 -> 427,475 +169,466 -> 279,356 +557,25 -> 24,25 +500,93 -> 108,93 +332,119 -> 463,119 +24,385 -> 739,385 +527,866 -> 985,866 +212,781 -> 595,398 +548,774 -> 730,774 +774,514 -> 30,514 +627,45 -> 627,885 +73,932 -> 984,21 +95,616 -> 811,616 +464,401 -> 458,401 +774,442 -> 534,202 +407,422 -> 407,211 +444,86 -> 444,358 +184,541 -> 184,325 +679,97 -> 841,259 +235,895 -> 571,895 +454,517 -> 121,517 +487,243 -> 564,243 +216,237 -> 953,974 +202,136 -> 202,536 +117,848 -> 762,203 +676,557 -> 89,557 +940,456 -> 940,548 +931,426 -> 899,426 +31,398 -> 145,398 +211,537 -> 589,159 +853,977 -> 673,977 +713,863 -> 216,366 +311,814 -> 335,814 +330,879 -> 127,879 +897,585 -> 185,585 +503,64 -> 677,64 +623,886 -> 254,517 +795,989 -> 795,516 +508,712 -> 904,316 +964,892 -> 101,29 +797,38 -> 797,901 +911,10 -> 632,10 +646,831 -> 284,831 +424,187 -> 957,720 +365,751 -> 538,578 +821,840 -> 38,57 +868,799 -> 242,799 +343,181 -> 555,393 +280,880 -> 280,795 +419,294 -> 419,79 +595,545 -> 595,775 +285,516 -> 285,816 +137,933 -> 137,61 +278,245 -> 610,577 +282,142 -> 21,142 +723,720 -> 251,248 +552,461 -> 654,461 +833,546 -> 785,546 +503,129 -> 450,76 +455,436 -> 653,436 +236,132 -> 926,822 +559,754 -> 559,615 +262,169 -> 275,169 +942,551 -> 942,273 +178,709 -> 178,69 +11,476 -> 811,476 +238,664 -> 238,867 +121,514 -> 278,514 +348,300 -> 348,453 +981,905 -> 981,139 +870,71 -> 870,69 +12,693 -> 931,693 +438,676 -> 110,348 +167,436 -> 167,839 +419,146 -> 170,146 +231,183 -> 231,278 +766,967 -> 700,967 +834,624 -> 445,624 +392,639 -> 392,808 +739,176 -> 161,176 +186,126 -> 186,451 +675,709 -> 675,629 +613,483 -> 981,483 +495,21 -> 581,107 +626,234 -> 111,234 +28,291 -> 28,883 +65,932 -> 942,55 +988,977 -> 54,43 +108,523 -> 108,820 +936,893 -> 211,168 +51,935 -> 957,29 +949,892 -> 108,51 +478,32 -> 228,32 +473,107 -> 82,498 +449,401 -> 449,645 +833,110 -> 295,648 +982,138 -> 982,111 +438,447 -> 661,224 +208,745 -> 917,36 +287,934 -> 832,389 +974,17 -> 974,105 +391,251 -> 517,377 +57,256 -> 57,704 +580,217 -> 626,171 +468,383 -> 348,383 +185,127 -> 185,851 +633,878 -> 20,265 +659,85 -> 659,698 +64,828 -> 64,592 +216,812 -> 287,812 +707,396 -> 707,167 +173,54 -> 173,723 +467,963 -> 936,963 +61,123 -> 371,433 +794,52 -> 794,595 +604,653 -> 244,293 +352,840 -> 90,840 +354,383 -> 788,383 +770,280 -> 770,621 +494,486 -> 897,486 +126,252 -> 361,252 +97,618 -> 491,224 +945,262 -> 945,72 +138,495 -> 138,107 +767,561 -> 304,561 +59,981 -> 841,199 +902,846 -> 499,846 +883,22 -> 128,22 +699,173 -> 840,32 +889,22 -> 113,798 +647,896 -> 647,226 +221,928 -> 221,66 +633,145 -> 648,130 +91,935 -> 91,162 +87,36 -> 983,932 +882,916 -> 638,916 +942,72 -> 38,976 +159,401 -> 123,437 +762,452 -> 762,721 +228,515 -> 130,613 +751,353 -> 387,717 +256,449 -> 256,811 +176,866 -> 176,778 +894,985 -> 894,462 +831,708 -> 148,25 +140,920 -> 574,920 +639,873 -> 585,873 +791,716 -> 224,149 +117,691 -> 117,158 +825,689 -> 873,641 +656,191 -> 134,191 +862,818 -> 78,34 +22,952 -> 961,13 +982,555 -> 982,21 \ No newline at end of file diff --git a/src/day.h b/src/day.h index 7b7769f..7be662a 100644 --- a/src/day.h +++ b/src/day.h @@ -5,5 +5,6 @@ int day_1(); int day_2(); int day_3(); int day_4(); +int day_5(); #endif //AOC_2021_DAY_H diff --git a/src/day_5.c b/src/day_5.c new file mode 100644 index 0000000..c0ccdc3 --- /dev/null +++ b/src/day_5.c @@ -0,0 +1,138 @@ +#include +#include +#include + +#include "puzzle_input.h" +#include "day.h" + +//#define DEBUG + +#define MAX_VENT_LINES 1000 +#define GRID_SIZE 1000 + +typedef struct { + int64_t start_x; + int64_t start_y; + int64_t end_x; + int64_t end_y; +} range_t; + +parse_ret_t parse_vent_line(char * buffer, void * data, uint16_t index) { + range_t * range_data = (range_t *)data; + range_t *range = &range_data[index]; + parse_ret_t res; + + char * start = strtok(buffer, " -> "); + char * end = strtok(NULL, " -> "); + + res = parse_long(strtok(start, ","), &range->start_x, 10); + + if (res != PARSER_OK) { + return res; + } + + res = parse_long(strtok(NULL, ","), &range->start_y, 10); + + if (res != PARSER_OK) { + return res; + } + + res = parse_long(strtok(end, ","), &range->end_x, 10); + + if (res != PARSER_OK) { + return res; + } + + res = parse_long(strtok(NULL, ","), &range->end_y, 10); + + if (res != PARSER_OK) { + return res; + } + + return PARSER_OK; +} + +int day_5() { + range_t data[MAX_VENT_LINES]; + uint16_t len; + uint8_t part1_grid[GRID_SIZE][GRID_SIZE] = {0}; + uint8_t part2_grid[GRID_SIZE][GRID_SIZE] = {0}; + + parse_ret_t res = read_input_single_line("../inputs/day_5.txt", (void *)data, MAX_VENT_LINES, parse_vent_line, &len); + + if (res != PARSER_OK) { + printf("Error parsing input: %d", res); + return -1; + } + + for (int line_ndx = 0; line_ndx < len; line_ndx++) { + range_t * line = &data[line_ndx]; + int x = (int)line->start_x; + int y = (int)line->start_y; + + int x_done = 0; + int y_done = 0; + while (!x_done || !y_done) { + if (line->start_x == line->end_x || line->start_y == line->end_y) { + part1_grid[x][y]++; + } + + part2_grid[x][y]++; + if (x == line->end_x) { + x_done = 1; + } + else { + if (line->start_x < line->end_x) { + x++; + } + else { + x--; + } + } + + if (y == line->end_y) { + y_done = 1; + } + else { + if (line->start_y < line->end_y) { + y++; + } + else { + y--; + } + } + } + } + + uint16_t danger_points_p1 = 0; + uint16_t danger_points_p2 = 0; + for (int x = 0; x < GRID_SIZE; x++) { + for (int y = 0; y < GRID_SIZE; y++) { +#ifdef DEBUG + + if (part2_grid[y][x] == 0) { + printf("."); + } + else { + printf("%d", part2_grid[y][x]); + } +#endif + + if (part1_grid[x][y] >= 2) { + danger_points_p1++; + } + + if (part2_grid[x][y] >= 2) { + danger_points_p2++; + } + } +#ifdef DEBUG + printf("\n"); +#endif + } + + printf("PART 1: There are %d danger zones\n", danger_points_p1); + printf("PART 2: There are %d danger zones\n", danger_points_p2); + + return 0; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 8200fdd..ab43528 100644 --- a/src/main.c +++ b/src/main.c @@ -28,6 +28,9 @@ int main(int argc, char * argv[]) { case 4: day_4(); break; + case 5: + day_5(); + break; default: printf("Invalid day ding dong!\n"); return -2; diff --git a/src/puzzle_input.c b/src/puzzle_input.c index cfe536e..2c16cf7 100644 --- a/src/puzzle_input.c +++ b/src/puzzle_input.c @@ -73,6 +73,8 @@ parse_ret_t read_input_single_line(const char * file_path, void * data, uint16_t } buffer_ndx = 0; + + memset(buffer, 0, BUFFER_SIZE); } else { buffer[buffer_ndx] = (char)c;