124 lines
2.3 KiB
C
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;
|
|
} |