From c9a946c54d678033ebe706dff187d5996b2420f1 Mon Sep 17 00:00:00 2001 From: dobiadi <50926840+dobiadi@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:15:30 +0100 Subject: [PATCH] Day5 C --- day5/c/day5 | Bin 0 -> 16960 bytes day5/c/day5.c | 196 +++++++++++++++++++++++++++++++++++++++++++++++ day5/input.txt | 197 ++++++++++++++++++++++++++++++++++++++++++++++++ day5/sample.txt | 33 ++++++++ 4 files changed, 426 insertions(+) create mode 100755 day5/c/day5 create mode 100644 day5/c/day5.c create mode 100644 day5/input.txt create mode 100644 day5/sample.txt diff --git a/day5/c/day5 b/day5/c/day5 new file mode 100755 index 0000000000000000000000000000000000000000..f36e9ecc5a4f86868e0d264a9d30f0000bcb1e87 GIT binary patch literal 16960 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 +#include +#include +#include +#include + +#define LINE_MAX_LENGTH 512 +#define MAX_RANGE_PER_MAPPING 64 +#define MAX_MAPPINGS 64 +#define MAX_SEEDS 128 +#define NUM_0_CHARCODE 48 +#define NUM_9_CHARCODE NUM_0_CHARCODE + 9 + +const char* resources[] = { + "seed", + "soil", + "fertilizer", + "water", + "light", + "temperature", + "humidity", + "location" +}; + +#define RESOURCES_LEN (sizeof(resources) / sizeof(resources[0])) + +struct mapping { + unsigned long source; + unsigned long destination; + unsigned long mappings[MAX_RANGE_PER_MAPPING][3]; + int mapping_num; +}; + +struct mapping* create_mapping(unsigned long src, unsigned long dst); + +int main() { + char *p, *buf, c; + int firstline = 1, seed_num = 0; + unsigned long seeds[MAX_SEEDS]; + + struct mapping **mappings; + int mappings_num = 0; + + mappings = (struct mapping**)malloc(MAX_MAPPINGS * sizeof(struct mapping*)); + + buf = (char *)malloc(LINE_MAX_LENGTH); + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + + int src = 0, dst = 0; + struct mapping *curr; + + while ((c = getchar()) != EOF) { + *p++ = c; + if (c == '\n') { + if (firstline) { + if (buf[0] == '\n') { + firstline = 0; + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + continue; + } + + p = buf; + while (*p < NUM_0_CHARCODE || *p > NUM_9_CHARCODE) p++; + while (*p != '\0') { + sscanf(p, "%lu", &seeds[seed_num]); + seed_num++; + + while (*p != ' ' && *p != '\n') p++; + p++; + } + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + continue; + } + + if (src == dst) { + char tmp1[64], tmp2[64]; + memset(tmp1, 0 , 64); + memset(tmp2, 0 , 64); + sscanf(buf, "%[^-]-to-%s map", tmp1, tmp2); + + for (unsigned long i = 0; i < RESOURCES_LEN; i++) { + if (strcmp(tmp1, resources[i]) == 0) { + src = i; + } + if (strcmp(tmp2, resources[i]) == 0) { + dst = i; + } + } + curr = create_mapping(src, dst); + } else if (buf[0] == '\n') { + mappings[mappings_num] = curr; + mappings_num++; + src = dst = 0; + } else { + unsigned long src_start, dst_start, range; + sscanf(buf, "%lu %lu %lu", &dst_start, &src_start, &range); + curr->mappings[curr->mapping_num][0] = dst_start; + curr->mappings[curr->mapping_num][1] = src_start; + curr->mappings[curr->mapping_num][2] = range; + curr->mapping_num++; + } + + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + } + } + mappings[mappings_num] = curr; + mappings_num++; + + // Part 1 + + unsigned long part1 = ULONG_MAX; + int location_idx = 7; + + for (int i = 0; i < seed_num; i++) { + int cur_resource = 0; + unsigned long cur_value = seeds[i]; + while (cur_resource != location_idx) { + for (int j = 0; j < mappings_num; j++) { + if (cur_resource != mappings[j]->source) { + continue; + } + + for (int k = 0; k < mappings[j]->mapping_num; k++) { + if (cur_value >= mappings[j]->mappings[k][1] && cur_value < mappings[j]->mappings[k][1] + mappings[j]->mappings[k][2]) { + cur_value = mappings[j]->mappings[k][0] + (cur_value - mappings[j]->mappings[k][1]); + break; + } + } + + cur_resource = mappings[j]->destination; + } + } + + if (part1 > cur_value) { + part1 = cur_value; + } + } + + printf("%lu\n", part1); + + // Part 2 + + unsigned long part2 = ULONG_MAX; + + // I know it could be done more efficiently than checking every single number but it only runs + // for about an hour an a single core so if I use all 12 threads in my machine it only takes 5 mins + for (int i = 0; i < seed_num; i+=2) { +#pragma omp parallel for + for (unsigned long s = seeds[i]; s < seeds[i] + seeds[i+1]; s++) { + int cur_resource = 0; + unsigned long cur_value = s; + while (cur_resource != location_idx) { + for (int j = 0; j < mappings_num; j++) { + if (cur_resource != mappings[j]->source) { + continue; + } + + for (int k = 0; k < mappings[j]->mapping_num; k++) { + if (cur_value >= mappings[j]->mappings[k][1] && cur_value < mappings[j]->mappings[k][1] + mappings[j]->mappings[k][2]) { + cur_value = mappings[j]->mappings[k][0] + (cur_value - mappings[j]->mappings[k][1]); + break; + } + } + + cur_resource = mappings[j]->destination; + } + } + +#pragma omp critical + if (part2 > cur_value) { + part2 = cur_value; + } + } + } + + printf("%lu\n", part2); + + free(buf); + for (int i = 0; i < mappings_num; i++) { + free(mappings[i]); + } + free(mappings); +} + +struct mapping* create_mapping(unsigned long src, unsigned long dst) { + struct mapping *mapping; + mapping = (struct mapping*)malloc(sizeof(struct mapping)); + memset(mapping, 0, sizeof(struct mapping)); + mapping->source = src; + mapping->destination = dst; + return mapping; +} diff --git a/day5/input.txt b/day5/input.txt new file mode 100644 index 0000000..d1aabaa --- /dev/null +++ b/day5/input.txt @@ -0,0 +1,197 @@ +seeds: 3127166940 109160474 3265086325 86449584 1581539098 205205726 3646327835 184743451 2671979893 17148151 305618297 40401857 2462071712 203075200 358806266 131147346 1802185716 538526744 635790399 705979250 + +seed-to-soil map: +931304316 1786548802 232453384 +3500539319 2322065235 6421609 +496396007 147739714 266329192 +3169724489 768672891 39526579 +3689153715 1361862036 346985 +1936948751 3328259881 542896984 +3209251068 3154345676 173914205 +1163757700 2814318523 24125066 +2484210664 1362209021 231487475 +3991904247 2133571422 188493813 +1187882766 4045525873 83717994 +861951350 3084992710 69352966 +2715698139 2838443589 43714032 +3830303258 4025104215 20421658 +768672891 1268583577 93278459 +4180398060 2019002186 114569236 +3689500700 1593696496 10659519 +1271600760 808199470 460384107 +166497091 526585653 102729094 +3700160219 3894961176 130143039 +2966889400 2882157621 202835089 +147739714 414068906 18757377 +3850724916 4133608796 141179331 +2759412171 2328486844 183672918 +2479845735 4129243867 4364929 +3480360150 4274788127 20179169 +402636637 432826283 93759370 +3383165273 2717123646 97194877 +3506960928 1604356015 182192787 +269226185 629314747 133410452 +2943085089 3871156865 23804311 +1731984867 2512159762 204963884 + +soil-to-fertilizer map: +3368312743 826425240 243745914 +1045038113 3682756471 174490549 +3931158487 1530223690 363808809 +1219528662 2460222182 131099318 +3020480207 1894032499 63879875 +121779694 248970341 36319877 +1993634034 2662348686 86667553 +3612058657 1323325837 196530127 +1531175223 2604354699 57993987 +158099571 121779694 127190647 +1867147432 3317666386 126486602 +2080301587 2768963716 548702670 +1402482267 1070171154 21180243 +2959841028 4051272297 60639179 +834756529 1966243663 128160296 +3911211010 2749016239 19947477 +962916825 3857247020 82121288 +2629004257 3444152988 238603483 +826425240 1957912374 8331289 +1350627980 3939368308 51854287 +1589169210 4214533702 80433594 +2867607740 2094403959 92233288 +1669602804 1125781209 197544628 +3084360082 1519855964 10367726 +1483712212 1091351397 34429812 +3094727808 2186637247 273584935 +1423662510 3991222595 60049702 +3808588784 4111911476 102622226 +1518142024 2591321500 13033199 + +fertilizer-to-water map: +206818393 1973789958 18543481 +2641351404 1992333439 41420268 +58400970 2574944960 107826712 +3710426911 4065366707 42793360 +4217161704 4274048011 20919285 +1926695368 705931711 328031436 +1449580741 1210970895 50549447 +907984567 1421828853 15115545 +769748018 1108192216 102778679 +451427938 35457870 38201654 +2254726804 2033892789 137829519 +923239194 1513967644 270588891 +3753220271 4108160067 165887944 +499804857 310274559 109862756 +3061525238 3535532059 426476055 +1193828085 73659524 196024324 +872526697 0 35457870 +1766386857 1261520342 160308511 +4057593930 3283950856 159567774 +1389852409 646203379 59728332 +3919108215 3962008114 103358593 +1577153434 1784556535 189233423 +4022466808 3443518630 35127122 +489629592 1098016951 10175265 +923100112 2033753707 139082 +2392556323 2390203683 158894869 +1500130188 1436944398 77023246 +2577297600 1033963147 64053804 +609667613 2171722308 160080405 +3488001293 3061525238 222425618 +2551451192 2549098552 25846408 +4238080989 3478645752 56886307 +166227682 269683848 40590711 +0 2331802713 58400970 +225361874 420137315 226066064 + +water-to-light map: +1833244152 0 764535859 +212138399 2132863085 224047237 +445686952 1600446740 163005122 +3322180377 2914685303 488586806 +2739726430 3712513349 582453947 +3946546331 3589340640 8839399 +1441711040 799272484 245821386 +1038755613 1763451862 6623730 +608692074 1587251997 13194743 +701103180 2356910322 39153476 +1687532426 1045093870 145711726 +2597780011 764535859 34736625 +740256656 1490869662 54307168 +0 1920724686 212138399 +2632516636 1545176830 9229765 +668257778 1554406595 32845402 +3955385730 2739726430 39179725 +4180633986 3598180039 114333310 +3810767183 2778906155 135779148 +1291061946 1770075592 150649094 +436185636 1481368346 9501316 +1045379343 2396063798 245682603 +794563824 1237176557 244191789 +621886817 1190805596 46370961 +3994565455 3403272109 186068531 + +light-to-temperature map: +432141642 1268486741 19474646 +3617581823 3276436954 357008111 +3505110084 3786131308 49942802 +0 1287961387 432141642 +3096011130 1808659179 409098954 +1347993824 2675880000 161612192 +3019335150 3199760974 76675980 +3555052886 3137232037 62528937 +2778092757 1720103029 88556150 +451616288 2217758133 458121867 +1509606016 0 1268486741 +909738155 3836074110 138515824 +1048253979 2837492192 299739845 +2866648907 3633445065 152686243 + +temperature-to-humidity map: +646729740 1519504972 559297346 +1894539176 2990410634 44298872 +232257988 972432123 414471752 +2277879451 278205785 108711195 +1775790220 132298732 118748956 +3371687162 2663455233 326955401 +1612056920 272509895 5695890 +1208383109 3703499740 147415518 +4070380190 4053129082 69974785 +4155541210 3305585510 139426086 +81956384 386916980 150301604 +3987543096 896459472 75972651 +2148980475 1386903875 128898976 +1617752810 3445011596 154599732 +4063515747 2078802318 6864443 +2392568787 3599611328 101532389 +2386590646 4123103867 5978141 +2494101176 2122546980 187027686 +2681128862 2085666761 36880219 +4140354975 2648268998 15186235 +1772352542 3051742077 3437678 +1355798627 3850915258 202213824 +3720104770 3055179755 250405755 +3032992830 2309574666 338694332 +1206027086 3701143717 2356023 +1938838048 537218584 44257139 +1558012451 81956384 50342348 +3970510525 3034709506 17032571 +1608354799 1515802851 3702121 +1983095187 4129082008 165885288 +3698642563 251047688 21462207 +2718009081 581475723 314983749 + +humidity-to-location map: +971626884 4275486551 19480745 +1218249913 2090555906 502249162 +2914848039 2902831882 224865747 +3341591733 2819947352 82884530 +991107629 2592805068 227142284 +3424476263 606585628 95279547 +4279176998 2064757318 10971709 +3139713786 4068790015 201877947 +606585628 701865175 365041256 +3534582689 3291885426 744594309 +1916997152 1066906431 997850887 +1752809355 3127697629 164187797 +1720499075 4036479735 32310280 +4290148707 4270667962 4818589 +3519755810 2075729027 14826879 diff --git a/day5/sample.txt b/day5/sample.txt new file mode 100644 index 0000000..f756727 --- /dev/null +++ b/day5/sample.txt @@ -0,0 +1,33 @@ +seeds: 79 14 55 13 + +seed-to-soil map: +50 98 2 +52 50 48 + +soil-to-fertilizer map: +0 15 37 +37 52 2 +39 0 15 + +fertilizer-to-water map: +49 53 8 +0 11 42 +42 0 7 +57 7 4 + +water-to-light map: +88 18 7 +18 25 70 + +light-to-temperature map: +45 77 23 +81 45 19 +68 64 13 + +temperature-to-humidity map: +0 69 1 +1 0 69 + +humidity-to-location map: +60 56 37 +56 93 4