Day 2: Gift Shop
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465


One last time with threads.
p1 isolated: 12ms
p2 isolated: 13ms
combined run: 25ms
typedef struct job_s { Mode mode; Point rng; usize total; } Job; static void* worker(void* a) { Job* job = a; (job->mode == MODE_ONE) ? one(job->rng, &job->total) : two(job->rng, &job->total); return nullptr; } static void solve(Mode mode) { FILE* input = fopen("input", "r"); c8 line[LINE_BUFSZ] = {}; fgets(line, sizeof(line), input); line[strcspn(line, "\n")] = 0; fclose(input); usize nrng = 1; for (strc s = line; *s; s++) { if (*s == ',') { nrng++; } } Job* jobs = calloc(nrng, sizeof(*jobs)); pthread_t* threads = calloc(nrng, sizeof(*threads)); usize idx = 0; strc tok = strtok(line, ","); while (tok) { sscanf(tok, "%zu-%zu", &jobs[idx].rng.x, &jobs[idx].rng.y); jobs[idx].mode = mode; tok = strtok(nullptr, ","); idx++; } for (usize i = 0; i < nrng; i++) { pthread_create(&threads[i], nullptr, worker, &jobs[i]); } usize total = 0; for (usize i = 0; i < nrng; i++) { pthread_join(threads[i], nullptr); total += jobs[i].total; } free(threads); free(jobs); printf("%zu\n", total); } i32 main(void) { solve(MODE_ONE); solve(MODE_TWO); }