#include #include #include char * getsect(int * dest, char * pch, char expect) { char * end; if (!pch) return NULL; *dest = strtol(pch, &end, 10); if (*dest == 0 && end == pch) return NULL; if (*end != expect) return NULL; if (expect) ++end; return end; } int main(int argc, char ** argv) { char buf[BUFSIZ]; int part = 1, i, overlaps = 0; while ((i = getopt(argc, argv, "p:")) != -1) { switch (i) { case 'p': part = atoi(optarg); break; default: return -1; } } while (fgets(buf, sizeof(buf), stdin)) { int n[4]; char * pbuf; pbuf = getsect(&n[0], buf, '-'); pbuf = getsect(&n[1], pbuf, ','); pbuf = getsect(&n[2], pbuf, '-'); pbuf = getsect(&n[3], pbuf, '\n'); if (!pbuf) { fprintf(stderr, "Unexpected line: %s\n", buf); return -1; } switch (part) { case 1: if ((n[2] >= n[0] && n[3] <= n[1]) || (n[0] >= n[2] && n[1] <= n[3])) { ++overlaps; } break; case 2: if (!(n[3] < n[0] || n[2] > n[1])) { ++overlaps; } break; default: fprintf(stderr, "Unexpected puzzle part %d\n", part); return -1; } } printf("%s overlaps: %d\n", part == 1 ? "Full" : "Partial", overlaps); return 0; }