diff --git a/day2/puzzle1/main.c b/day2/puzzle1/main.c index e772be3..5a11f44 100644 --- a/day2/puzzle1/main.c +++ b/day2/puzzle1/main.c @@ -16,25 +16,18 @@ struct Game int blue; }; -struct Games +struct Round { struct Game games[100]; - int interator; + int iterator; + int id; }; -void parse_game_data(char *line, struct Games games) +struct Games { -// printf("%s\n", line); - char *token; - const char delim[2] = ";"; - token = strtok(line, delim); - printf("First token is: %s\n", token); - char *token2; - const char delim2[2] = ","; - token2 = strtok(token, delim2); - printf("Second token is: %s\n", token2); - struct Game tmpGame; -} + struct Round rounds[10]; + int interator; +}; int str_to_int(char *str) { @@ -44,6 +37,89 @@ int str_to_int(char *str) return result; } +char *parse_cube(char *line, int *cube_num) +{ + const char delim[2] = " "; + char *save_ptr; + char *token; + token = strtok_r(line, delim, &save_ptr); + *cube_num = str_to_int(token); + token = strtok_r(NULL, delim, &save_ptr); + return token; // Cube colour +} + +struct Round parse_round(char *line, int id) +{ + const char delim[2] = ","; + char *save_ptr; + char *token; + int cube_num; + struct Round round; + struct Game game = {-1, -1, -1}; + round.id = id; + round.iterator = 0; + token = strtok_r(line, delim, &save_ptr); + while (token != NULL) + { + char *colour = parse_cube(token, &cube_num); + if (!strcmp(colour, "red")) + { + game.red = cube_num; + } + else if (!strcmp(colour, "blue")) + { + game.blue = cube_num; + } + else if (!strcmp(colour, "green")) + { + game.green = cube_num; + } + token = strtok_r(NULL, delim, &save_ptr); + round.games[round.iterator++] = game; + } + + return round; +} + +void parse_game_data(char *line, struct Games games, int id) +{ + // printf("%s\n", line); + // https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm + // https://www.tutorialspoint.com/data_structures_algorithms/hash_table_program_in_c.htm + char *token; + char *save_ptr; + const char delim[2] = ";"; + token = strtok_r(line, delim, &save_ptr); + while (token != NULL) + { + games.rounds[games.interator++] = parse_round(token, id); + token = strtok_r(NULL, delim, &save_ptr); + } + + // while (token != NULL) + // { + // printf("%s\n", token); + // char *inner_orig_line = malloc(255); + // memcpy(inner_orig_line, token, 255); + // token2 = strtok(orig_line, delim2); + // while (token2 != NULL) + // { + // printf("%s\n", token2); + // token3 = strtok(token2, delim3); + // int count = str_to_int(token3); + // char *colour = strtok(NULL, delim3); + // // + // printf("We have %i %s cubes\n", count, colour); + // token2 = strtok(NULL, delim2); + // } + // token = strtok(NULL, delim); + // } + + // token2 = strtok(token, delim2); + // printf("Second token is: %s\n", token2); + struct Game tmpGame; +} + int get_id(char *ptr) { int id; @@ -56,7 +132,7 @@ int get_id(char *ptr) } else { - ID_OFFSET = i; + ID_OFFSET = i; break; } } @@ -67,6 +143,7 @@ int get_id(char *ptr) int main() { struct Games games; + games.interator = 0; int MAX_RED = 12; int MAX_GREEN = 13; int MAX_BLUE = 14; @@ -109,14 +186,15 @@ int main() inLine = 1; i += GAME_OFFSET; id = get_id(&ptr[i]); - i += ID_OFFSET + 1; + i += ID_OFFSET + 1; continue; } if (ptr[i + j] == '\n') { memcpy(tmpLine, &ptr[i], j); - printf("ID: %i |", id); - parse_game_data(tmpLine, games); + // printf("ID: %i |", id); + parse_game_data(tmpLine, games, id); + exit(1); i += j; break; }