Committing days 1-4
This commit is contained in:
124
02/02.c
Normal file
124
02/02.c
Normal file
@@ -0,0 +1,124 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user