Index: aoc2015.c ================================================================== --- aoc2015.c +++ aoc2015.c @@ -5,54 +5,41 @@ #include "aocdailies.h" #include "aocutils.h" void aoc201505(char *data, size_t len) { (void)len; // unused argument - unsigned lines = 0, nice = 0, nice2 = 0; + unsigned 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 (curr = line; curr[1]; curr++) { - if (curr[0] == curr[1]) break; - } - if (curr[0] == curr[1]) { - unsigned vowels = 0; - for (curr = line; *curr; curr++) { - if (strchr("aeiou", *curr)) vowels++; - if (vowels == 3) break; - } - nice += (vowels == 3); - } - } - } - } - } + unsigned vowels = 0; + bool twice = false; + bool hasab, hascd, haspq, hasxy; + bool pair = false, hugged = false; // Part Two + + curr = line; + if (strchr("aeiou", *curr)) vowels++; + if (curr[0] == curr[1]) twice = true; + for (curr = line + 1; *curr; curr++) { + if (strchr("aeiou", *curr)) vowels++; + if (curr[0] == curr[1]) twice = true; + if (curr[-1] == curr[1]) hugged = true; + char pp[3] = {curr[-1], curr[0], 0}; + if (strstr(curr + 1, pp)) pair = true; + } + hasab = (strstr(line, "ab") != NULL); + hascd = (strstr(line, "cd") != NULL); + haspq = (strstr(line, "pq") != NULL); + hasxy = (strstr(line, "xy") != NULL); + + if ((vowels >= 3) && twice && !hasab && !hascd && !haspq && !hasxy) { + nice++; + } + if (pair && hugged) nice2++; + 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`