Day 2: Red-Nosed Reports
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://blocks.programming.dev/ 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/22323136
- 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
C
First went through the input in one pass, number by number, but unfortunately that wouldn’t fly for part 2.
Code
#include "common.h" static int issafe(int *lvs, int n, int skip) { int safe=1, asc=0,prev=0, ns=0,i; for (i=0; safe && i<n; i++) { if (i == skip) { ns = 1; continue; } if (i-ns > 0) safe = safe && lvs[i] != prev && lvs[i] > prev-4 && lvs[i] < prev+4; if (i-ns == 1) asc = lvs[i] > prev; if (i-ns > 1) safe = safe && (lvs[i] > prev) == asc; prev = lvs[i]; } return safe; } int main(int argc, const char **argv) { char buf[64], *rest, *tok; int p1=0,p2=0, lvs[16],n=0, i; if (argc > 1) DISCARD(freopen(argv[1], "r", stdin)); while ((rest = fgets(buf, sizeof(buf), stdin))) { for (n=0; (tok = strsep(&rest, " ")); n++) { assert(n < (int)LEN(lvs)); lvs[n] = (int)strtol(tok, NULL, 10); } for (i=-1; i<n; i++) if (issafe(lvs, n, i)) { p1 += i == -1; p2++; break; } } printf("02: %d %d\n", p1, p2); }
https://github.com/sjmulder/aoc/blob/master/2024/c/day02.c