Day 3: Mull It Over
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
Got the code a little shorter:
Code
#include "common.h" static int parse_mul(const char **stringp, int *ap, int *bp) { const char *cur = *stringp, *end; if (strncmp(cur, "mul(", 4)) { return 0; } cur += 4; *ap = (int)strtol(cur, (char **)&end, 10); if (end == cur) { return 0; } cur = end; if (*cur != ',') { return 0; } cur += 1; *bp = (int)strtol(cur, (char **)&end, 10); if (end == cur) { return 0; } cur = end; if (*cur != ')') { return 0; } cur += 1; *stringp = cur; return 1; } int main(int argc, char **argv) { static char buf[32*1024]; const char *p; size_t nr; int p1=0,p2=0, a,b, dont=0; if (argc > 1) DISCARD(freopen(argv[1], "r", stdin)); nr = fread(buf, 1, sizeof(buf), stdin); assert(!ferror(stdin)); assert(nr != sizeof(buf)); buf[nr] = '\0'; for (p = buf; *p; ) if (parse_mul(&p, &a, &b)) { p1 += a*b; p2 += a*b*!dont; } else if (!strncmp(p, "do()", 4)) { dont = 0; p += 4; } else if (!strncmp(p, "don't()", 7)) { dont = 1; p += 7; } else p++; printf("03: %d %d\n", p1, p2); }