#include #include #include #define MAX_GAMES 101 // cubes, R, G, B const int cubes[3] = {12, 13, 14}; const char *colors[] = {"red", "green", "blue"}; int getCubes(char *ptr); int main () { int gameID = 0; int gameSum = 0; char row[160]; char *ptr; int length = 0; int gameCubes[3] = {0, 0, 0}; int gameHands = 0; int offset = 0; int game[MAX_GAMES] = {0}; for (int i = 1; i < MAX_GAMES; i++) game[i] = i; int powerSum = 0; FILE *input; input = fopen("./input", "r"); // for each row while(fgets(row, 160, input) != NULL) { // increment game count gameID++; gameHands = 1; offset = 0; for (int i = 0; i < 3; i++) gameCubes[i] = 0; printf("%s\n", row); // not neccesary to decide length when we know amount of ';'? // length = strchr(row, '\n') - &row[0]; // change each ; to \0 ptr = row; while(ptr = strchr(ptr, ';')) { ptr[0] = '\0'; gameHands++; ptr++; } printf("\nGame %d hands: %d\n", gameID, gameHands); // for each 'hand' (semicolon) ((NULL-char)) for(gameHands; gameHands > 0; gameHands--) { printf("%s\n", row + offset); // for each color for(int i = 0; i < 3; i++) { // use strstr to find color, // move pointer to the beginning of said colour ptr = strstr(row + offset, colors[i]); // if (strstr(row, colors[i]) != NULL) if (ptr != NULL) { if (gameCubes[i] < getCubes(ptr)) gameCubes[i] = getCubes(ptr); } // higher than colors[i]? invalidate the game if (gameCubes[i] > cubes[i]) { game[gameID] = 0; // printf("Game %d invalid\n", gameID); } } // pointer = strstr \0 + 1 offset += strlen(&row[offset]) + 1; ptr = row + offset; } // printf("Game %d required RGB: %d, %d, %d\n", // gameID, gameCubes[0],gameCubes[1],gameCubes[2] // ); powerSum += gameCubes[0] * gameCubes[1] * gameCubes[2]; printf("Game %d powersum: %d\nCurrent Total: %d\n", gameID, gameCubes[0] * gameCubes[1] * gameCubes[2], powerSum); } for (int i = gameID + 1; i < MAX_GAMES; i++) game[i] = 0; for (int i = 0; i < MAX_GAMES; i++) { gameSum += game[i]; } printf("Game ID sum: %d\n", gameSum); printf("Total power sum: %d\n", powerSum); } int getCubes(char *ptr) { int num = 0; // get two chars: pointer -3, pointer -2 // convert them to an int if (ptr[-3] >= '0' && ptr[-3] <= '9') { num += (ptr[-3] - '0') * 10; } if (ptr[-2] >= '0' && ptr[-2] <= '9') { num += ptr[-2] - '0'; } return num; }