#include #include #include #define STRBUF_SIZE 200 enum color { color_red = 0, color_green, color_blue }; typedef struct gameresult_t { uint8_t red; uint8_t green; uint8_t blue; } gameresult; gameresult parse_hand(char *str) { gameresult result = {0}; uint8_t num = 0; while (true) { num = 0; while (*str != ' ') { num = (num * 10) + (*str - '0'); str++; } str++; switch(*str) { case 'r': result.red += num; str += 3; break; case 'g': result.green += num; str += 5; break; case 'b': result.blue += num; str += 4; break; } if (*str != ',') return result; str += 2; } } gameresult parse_game_maxes(char *str) { // Keeps track of the most cubes of a single color seen any hand gameresult maxes = {0}; // Keeps result from the most recent hand gameresult result = {0}; while (*str != ':') str++; while (*str == ':' || *str == ';') { str += 2; result = parse_hand(str); if (result.red > maxes.red) maxes.red = result.red; if (result.green > maxes.green) maxes.green = result.green; if (result.blue > maxes.blue) maxes.blue = result.blue; while (*str != ';' && *str != '\n') str++; } return maxes; } bool game_is_valid(char *str) { gameresult maxes = {0}; maxes = parse_game_maxes(str); return (maxes.red <= 12 && maxes.green <= 13 && maxes.blue <= 14); } int main(int argc, char **argv) { // Get filename as an argument, defaults to "input.txt" char *path = (argc > 1) ? argv[1] : "input.txt"; if (!path) { printf("Requires input file.\n"); return 1; } FILE *file = fopen(path, "r"); if (!file) { printf("Could not find file."); return 1; } char strbuf[STRBUF_SIZE] = {0}; gameresult maxes = {0}; uint8_t gamenum = 1; uint32_t power = 0; uint32_t sum = 0; while (fgets(strbuf, 200, file)) { maxes = parse_game_maxes(strbuf); power = maxes.red * maxes.green * maxes.blue; sum += power; } printf("Sum: %d\n", sum); return 0; }