Skip to content

Instantly share code, notes, and snippets.

@randrew

randrew/part2.c Secret

Last active December 5, 2020 04:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save randrew/e25a427553d6bf7f029085e9809b48bb to your computer and use it in GitHub Desktop.
Save randrew/e25a427553d6bf7f029085e9809b48bb to your computer and use it in GitHub Desktop.
aoc day 4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{ FILE *f = fopen("input.txt", "r");
char line[BUFSIZ], key[3], val[BUFSIZ], *p;
char *eyes[] = {"amb", "blu", "brn", "gry", "grn", "hzl", "oth", 0};
int docok = 0, subok, loffs, n, r, d;
doc: if (feof(f) || ferror(f)) goto quit;
subok = 0;
line: if (!fgets(line, BUFSIZ, f) || strlen(line) == 1) goto stamp;
loffs = 0;
while (sscanf(line + loffs, "%3c:%s%n", key, val, &n) == 2)
{ loffs += n + 1; p = val; if (0) {
#define WHEN(_a) } else if (memcmp(#_a, key, 3) == 0) {
#define BETWEEN(_lo, _hi) { r = d >= _lo && d <= _hi; }
#define MAXDIGITS(_digits) { if (sscanf(p, "%d%n", &d, &n) == 1 && n <= _digits) { p += n; r = 1; } else r = 0; }
#define PRED(_n, _q) { for (n = 0;; n++) { char c = *p; if (c && (_q)) p++; else break; } r = n == _n; }
#define NEXT(_str) (strcmp(#_str, p) == 0)
#define AND { if (!r) continue; }
#define DONE { if (r) goto ok; }
WHEN(byr) MAXDIGITS(4) AND BETWEEN(1920, 2022) DONE
WHEN(iyr) MAXDIGITS(4) AND BETWEEN(2010, 2020) DONE
WHEN(eyr) MAXDIGITS(4) AND BETWEEN(2020, 2030) DONE
WHEN(hgt) MAXDIGITS(3) AND if NEXT(cm) { BETWEEN(150, 193) DONE }
if NEXT(in) { BETWEEN( 59, 76) DONE }
WHEN(hcl) PRED(1, c == '#') AND
PRED(6, (c >= 'a' && c <= 'f') || (c >= '0' && c <= '9')) DONE
WHEN(ecl) for (char **e = eyes; *e; e++) if (strcmp(p, *e) == 0) goto ok;
WHEN(pid) PRED(9, c >= '0' && c <= '9') DONE
} continue; ok: subok++; } goto line;
stamp: if (subok == 7) docok++;
goto doc;
quit: printf("%d\n", docok); }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment