AoC2023/day2/day2a.c
2023-12-03 17:03:15 +01:00

82 lines
1.6 KiB
C

#include <stdio.h>
#include <string.h>
#include <limits.h>
// 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;
FILE *input;
input = fopen("./input", "r");
nextGame:
// 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;
// change each ; to \0
while(ptr = strchr(ptr, ';')) {
ptr[0] = '\0';
gameHands++;
ptr++;
}
// for each 'hand' (semicolon) ((NULL-char))
for(gameHands; gameHands > 0; gameHands--) {
// 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)
gameCubes[i] = getCubes(ptr);
// higher than colors[i]? jump to next game
if (gameCubes[i] > cubes[i]) {
goto nextGame;
}
}
// pointer = strstr \0 + 1
offset += strlen(&row[offset]) + 1;
ptr = row + offset;
}
// hit \n? add game ID to sum
printf("Game %d valid\n", gameID);
gameSum += gameID;
}
printf("Game ID sum: %d\n", gameSum);
}
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;
}