Index: aoc2015.c ================================================================== --- aoc2015.c +++ aoc2015.c @@ -5,24 +5,25 @@ #include "aocdailies.h" #include "aocutils.h" void aoc201505(char *data, size_t len) { (void)len; // unused argument - char *line = strtok(data, "\n"), *vtest; - unsigned nice = 0; + unsigned lines = 0, nice = 0, nice2 = 0; + char *line = strtok(data, "\n"), *curr; while (line) { + lines++; // used in Part Two if (!strstr(line, "ab")) { if (!strstr(line, "cd")) { if (!strstr(line, "pq")) { if (!strstr(line, "xy")) { - for (vtest = line; vtest[1]; vtest++) { - if (vtest[0] == vtest[1]) break; + for (curr = line; curr[1]; curr++) { + if (curr[0] == curr[1]) break; } - if (vtest[0] == vtest[1]) { + if (curr[0] == curr[1]) { unsigned vowels = 0; - for (vtest = line; *vtest; vtest++) { - if (strchr("aeiou", *vtest)) vowels++; + for (curr = line; *curr; curr++) { + if (strchr("aeiou", *curr)) vowels++; if (vowels == 3) break; } nice += (vowels == 3); } } @@ -30,10 +31,29 @@ } } line = strtok(NULL, "\n"); } printf("There are %u nice strings.\n", nice); + + line = data; + bool pair, hugged; + while (lines--) { + pair = hugged = false; + for (curr = line; curr[3]; curr++) { + char twostr[3] = {curr[0], curr[1], 0}; + if (strstr(curr+2, twostr)) pair = true; + if (curr[0] == curr[2]) hugged = true; + if (pair && hugged) break; + } + if (pair) { + if (hugged) nice2++; + else if (curr[0] == curr[2]) nice2++; + else if (curr[1] == curr[3]) nice2++; + } + line += 1 + strlen(line); // go to next line, skip '\0' left from strtok + } + printf("There are %u nice strings under the new rules.\n", nice2); } void aoc201504(char *data, size_t len) { data[--len] = 0; // remove newline, adjust `len` char longkey[128];