Untitled

 avatar
unknown
plain_text
2 years ago
1.8 kB
7
Indexable
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct CubeCount {
  uint8_t r;
  uint8_t g;
  uint8_t b;
  uint8_t gameID;
} CubeCount;

uint8_t checkGame(const CubeCount *const restrict totalCubes,
                  char *const restrict gameData) {
  uint8_t result = 0;
  char *gameNext = gameData;
  char *gameToken = strtok_r(gameData, ":", &gameNext);
  char *roundNext = NULL;
  char *roundToken;
  if (gameToken != NULL) {
    sscanf(gameToken, "Game %hhu[3]:", &result);
  }
  gameToken = strtok_r(gameNext, ";", &gameNext);
  while (gameToken != NULL) {
    CubeCount round = {0};
    roundToken = strtok_r(gameToken, ",", &roundNext);
    while (roundToken != NULL) {
      char color[6] = {0};
      uint8_t val = 0;
      sscanf(roundToken, "%hhu %s", &val, color);
      if (strcmp(color, "red") == 0)
        round.r = val;
      if (strcmp(color, "green") == 0)
        round.g = val;
      if (strcmp(color, "blue") == 0)
        round.b = val;
      roundToken = strtok_r(roundNext, ",", &roundNext);
    }
    if (totalCubes->r < round.r || totalCubes->g < round.g ||
        totalCubes->b < round.b)
      result = 0;
    gameToken = strtok_r(gameNext, ";", &gameNext);
  }
  return (uint8_t)result;
}

int main(int argc, char **argv) {
  uint32_t successfulIdSum = 0;
  char games[100][1024] = {0};
  CubeCount totalCubes = {12, 13, 14, 0};
  FILE *fp;
  fp = fopen("./day2.input", "r");
  if (fp == NULL) {
    fprintf(stderr, "Failed to load input.\n");
    return EXIT_FAILURE;
  }
  for (size_t i = 0; i < 100; i++) {
    fscanf(fp, "%1024[^\n]\n", games[i]);
    successfulIdSum += checkGame(&totalCubes, games[i]);
  }
  printf("Sum of successful game IDs: %u\n", successfulIdSum);
}
Editor is loading...
Leave a Comment