Files
2023-12-04 19:40:03 -05:00

124 lines
2.3 KiB
C

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#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};
uint8_t gamenum = 1;
uint32_t sum = 0;
while (fgets(strbuf, 200, file))
{
if (game_is_valid(strbuf))
sum += gamenum;
gamenum++;
}
printf("Sum: %d\n", sum);
return 0;
}