From ac39960ba344d36d37e82bec193e72b21cc4c6f1 Mon Sep 17 00:00:00 2001 From: kirreen Date: Thu, 7 Dec 2023 03:39:47 +0100 Subject: [PATCH] fixed day 5, only needed unsigned long ints.. also its multithreaded --- day1/day1a.c | 2 - day5/day5b.c | 105 +++++++++++++++++++++++++ day5/optDay5b.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++ day5/output | 20 ----- day5/output.2 | 20 ----- day5/run | Bin 15816 -> 16240 bytes 6 files changed, 303 insertions(+), 42 deletions(-) create mode 100644 day5/day5b.c create mode 100644 day5/optDay5b.c delete mode 100644 day5/output delete mode 100644 day5/output.2 diff --git a/day1/day1a.c b/day1/day1a.c index bd098d6..c1893af 100644 --- a/day1/day1a.c +++ b/day1/day1a.c @@ -20,7 +20,6 @@ int main() } else if (inChar >= '0' && inChar <= '9' && numIndex == 1) { numbers[1] = inChar; } else if (inChar == EOF || inChar == '\n' || inChar == '\0') { - //fputs(numbers, output); sum += (numbers[0] - '0') * 10 + (numbers[1] - '0'); numIndex = 0; numbers[0] = '0'; @@ -30,5 +29,4 @@ int main() fclose(input); printf("%d\n", sum); - } diff --git a/day5/day5b.c b/day5/day5b.c new file mode 100644 index 0000000..e107582 --- /dev/null +++ b/day5/day5b.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include + +#define SEEDS 20 + +unsigned int remap(FILE *input, char *row, unsigned int seed); + +// för varje seed: +// är den i rangen seed to soil? if so, = soil + i +// testa varje range så och reassigna on hit, sen spara i location array +// Lägsta i array är svaret + +// vi har: +// lista med seed +// 7 maps + +// lagra seeds i array +// array som säger om seed är omvandlat i current map +// för varje rad i map, kolla varje seed (om det ej omvandlat) +// vid nästa map, nolla omvandlatArray + +// del b: Lagra inte seeds. för varje seed, kör igenom alla maps. efter alla maps, +// spara siffran om den är lägre än tidigare. + + +int main() +{ + unsigned int minimum = UINT_MAX; + unsigned int seedRanges[SEEDS] = {0}; + char row[250]; + char c; + + FILE *input; + input = fopen("./input", "r"); + + int seed = 0; + while (c = fgetc(input) != '\n') { + while (isdigit(c = fgetc(input))) { + seedRanges[seed] = seedRanges[seed] * 10 + (c - '0'); + } + fseek(input, -1L, SEEK_CUR); // currently stepping two steps forward so yeah + if (seedRanges[seed] != 0) seed++; + } + // for (int i = 0; i < seed; i++) + // printf("Seed %d: %u\n", i + 1, seedArray[i]); + + // for each seed-range pair, run remap for each seed + for (int i = 16; i < 18; i += 2) { + printf("%d\n", i); + unsigned int new; + for ( int j = 0; j < seedRanges[i + 1]; j++) { + rewind(input); + new = remap(input, row, seedRanges[i] + j); + if (new < minimum) minimum = new; + } + printf("Range %u-%u done\n", seedRanges[i], seedRanges[i] + seedRanges[i + 1]); + printf("%u\n", minimum); + } + + printf("%u\n", minimum); +} + +// Change this function to take one seed, run through all remaps for it, then return value +unsigned int remap(FILE *input, char *row, unsigned int seed) +{ + while (fgets(row, 250, input) != NULL) { + if (strstr(row, "map") || strstr(row, "seeds:") || row[0] == '\n') continue; + fgets(row, 250, input); + unsigned int i = 0; + while (!isdigit(row[i])) i++; + + unsigned int dest = 0; + for (; isdigit(row[i]); i++) { + dest = dest * 10 + row[i] - '0'; + } + while (!isdigit(row[i])) i++; + unsigned int source = 0; + for (; isdigit(row[i]); i++) { + source = source * 10 + row[i] - '0'; + } + while (!isdigit(row[i])) i++; + unsigned int range = 0; + for (; isdigit(row[i]); i++) { + range = range * 10 + row[i] - '0'; + } + range -= 1; + + // printf("Dest: %u, Source: %u, range: %u\n", dest, source, range + 1); + // TODO: Edgecase här - om range 0 kan den false positives + if (seed >= source && seed <= source + range) { + // printf("Seed %d: %u is in range, moving to %u\n", i + 1, seedArray[i], dest + seedArray[i] - source); + seed = dest + seed - source; + // printf("Seed %d: %u\n", i + 1, seedArray[i]); + // printf("seed found! next map %u\n", seed); + while (fgets(row, 250, input) && !strstr(row, "map")); + continue; + } + } + rewind(input); + return seed; +} diff --git a/day5/optDay5b.c b/day5/optDay5b.c new file mode 100644 index 0000000..49dec25 --- /dev/null +++ b/day5/optDay5b.c @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include +#include +#include + +#define SEEDS 20 + +typedef struct { + unsigned long int len; + unsigned long int *dest; + unsigned long int *source; + unsigned long int *range; +} map; +typedef struct { + unsigned long int seed; + unsigned long int range; + unsigned long int *min; + map **ruleList; +} mt_args; + +unsigned long int remap(unsigned long int seed, map **remaps); +map *storeRules(FILE *input, char *row, int n); +void gotoMap(FILE *input, int n); +void *threadedRange(mt_args *args); + +// del b: Lagra inte seeds. för varje seed, kör igenom alla maps. efter alla maps, +// spara siffran om den är lägre än tidigare. + +// optimization ideas: +// Store rules as *array[7] of remapArrays[rules * 3 ints] +// ...and int len[7] that holds the length of each remap +// spawn thread per range +// ^ this is to avoid changing the logic to handle ranges lol + +// lagra 7 map-pekare +// struct map: int len, dest[], source[], range[] +// len antal rules + +// skapa gotoMap-funktion (rullar streamen till map n) +// skapa funktion för att mappa och returnera _en map_ +// ^ kalla dessa 7 gånger + +int main() +{ + unsigned long int minimum = UINT_MAX; + unsigned long int seedRanges[SEEDS] = {0}; + char row[250]; + char c; + + FILE *input; + input = fopen("./input", "r"); + + int seed = 0; + while (c = fgetc(input) != '\n') { + while (isdigit(c = fgetc(input))) { + seedRanges[seed] = seedRanges[seed] * 10 + (c - '0'); + } + fseek(input, -1L, SEEK_CUR); // currently stepping two steps forward so yeah + if (seedRanges[seed] != 0) seed++; + } + + map *ruleList[7]; // Get pointers to 7 populated ruleList + for (int i = 0; i < 7; i++) ruleList[i] = storeRules(input, row, i); + fclose(input); + + /* Debug, print rules + for (int i = 0; i < 7; i++) { + for (int j = 0; j < ruleList[i]->len; j++) { + printf("%u %u %u\n", ruleList[i]->dest[j], ruleList[i]->source[j], ruleList[i]->range[j]); + } + } + */ + + pthread_t *thread_id = malloc (sizeof(pthread_t) * 10); + unsigned long int smallest[10] = {0}; + + // for each seed-range pair, run remap for each seed + for (int i = 0; i < 19; i += 2) { + printf("%d\n", i); + // unsigned long int new; + + mt_args *args = malloc(sizeof(mt_args)); + args->seed = seedRanges[i]; + args->range = seedRanges[i + 1]; + args->min = &smallest[i / 2]; + args->ruleList = ruleList; + pthread_create(&thread_id[i / 2], NULL, &threadedRange, args); + + /* + for (int j = 0; j < seedRanges[i + 1]; j++) { + new = remap(seedRanges[i] + j, ruleList); + if (new < minimum) minimum = new; + } + */ + // printf("Range %u-%u done\n", seedRanges[i], seedRanges[i] + seedRanges[i + 1]); + // printf("min: %u\n", minimum); + // printf("new: %u\n", new); + } + + for (int i = 0; i < 10; i++) { + printf("joining %d: \n", i); + pthread_join(thread_id[i], NULL); + printf("%u\n", smallest[i]); + } + + for (int i = 0; i < 10; i++) { + if (smallest[i] < minimum) minimum = smallest[i]; + } + + printf("smallest: %u\n", minimum); +} + +void *threadedRange(mt_args *args) +{ + unsigned long int minimum = UINT_MAX; + unsigned long int new = 0; + // printf("seedstart: %u range: %u\n", args->seed, args->range); + for (unsigned long int i = 0; i < args->range; i++) { + new = remap(args->seed + i, args->ruleList); + // if (new == 0) printf("wtf %u\n", args->seed + i); + if (new < minimum) minimum = new; + } + args->min[0] = minimum; +} + +// Change this function to take one seed, run through all remaps for it, then return value +unsigned long int remap(unsigned long int seed, map **remaps) +{ + unsigned long int oldSeed = seed; + for (int i = 0; i < 7; i++) { + // printf("Dest: %u, Source: %u, range: %u\n", dest, source, range + 1); + for (int j = 0; j < remaps[i]->len; j++) { + if (seed >= remaps[i]->source[j] && seed <= remaps[i]->source[j] + remaps[i]->range[j]) { + //printf("Map %d: %u is in range, moving to %u\n", i + 1, seed, remaps[i]->dest[j] + seed - remaps[i]->source[j]); + seed = remaps[i]->dest[j] + seed - remaps[i]->source[j]; + // if (seed == 0) printf("Seed %u became 0 on map %d\n", oldSeed, i); + break; + // printf("Seed %d: %u\n", i + 1, seedArray[i]); + // printf("seed found! next map %u\n", seed); + } + } + } + return seed; +} + +map *storeRules(FILE *input, char *row, int n) +{ + unsigned long int len = 0; + gotoMap(input, n); + while (fgets(row, 250, input) != NULL) { + if (strstr(row, "seeds:") || row[0] == '\n') break; + len++; + } + + gotoMap(input, n); + map *ruleList = malloc(sizeof(unsigned long int) + 3 * sizeof(unsigned long int*)); + ruleList->dest = calloc(len, sizeof(unsigned long int)); + ruleList->source = calloc(len, sizeof(unsigned long int)); + ruleList->range = calloc(len, sizeof(unsigned long int)); + + int i = 0; + while (fgets(row, 250, input) != NULL) { + if (strstr(row, "seeds:") || row[0] == '\n') break; + int j = 0; + while (!isdigit(row[j])) j++; + + for (; isdigit(row[j]); j++) { + ruleList->dest[i] = ruleList->dest[i] * 10 + row[j] - '0'; + } + while (!isdigit(row[j])) j++; + + for (; isdigit(row[j]); j++) { + ruleList->source[i] = ruleList->source[i] * 10 + row[j] - '0'; + } + while (!isdigit(row[j])) j++; + + for (; isdigit(row[j]); j++) { + ruleList->range[i] = ruleList->range[i] * 10 + row[j] - '0'; + } + i++; + } + + ruleList->len = len; + return ruleList; +} + +void gotoMap(FILE *input, int n) +{ + char row[250]; + rewind(input); + while (fgets(row, 250, input) != NULL) { + if (strstr(row, "map")) n--; + if (n < 0) break; + } +} diff --git a/day5/output b/day5/output deleted file mode 100644 index 803245a..0000000 --- a/day5/output +++ /dev/null @@ -1,20 +0,0 @@ -1663131502 -3701339508 -1591272448 -971042070 -3779692809 -1373066113 -3664261935 -2396801877 -2017638440 -3700090039 -642320287 -2197425575 -3037672564 -1931439146 -1241009111 -903350816 -3402116899 -3705255266 -535088217 -896607734 diff --git a/day5/output.2 b/day5/output.2 deleted file mode 100644 index 0a14ec6..0000000 --- a/day5/output.2 +++ /dev/null @@ -1,20 +0,0 @@ -1241009111 -1373066113 -1591272448 -1663131502 -1931439146 -2017638440 -2197425575 -2396801877 -3037672564 -3402116899 -3664261935 -3700090039 -3701339508 -3705255266 -3779692809 -535088217 -642320287 -896607734 -903350816 -971042070 diff --git a/day5/run b/day5/run index 5f9bf9ac287507a8d3e906250c2171b67d5f00d3..65d0232044303bdff6d14a98863483276b7e85ac 100755 GIT binary patch literal 16240 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 Mj@=;*`5Ht11DlBsN&o-=