feat(02): Solve day 2
This commit is contained in:
parent
00e1df7490
commit
75f3b04e4f
6 changed files with 151 additions and 24 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -1,4 +1,11 @@
|
||||||
|
# ClangD
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Nix files
|
||||||
|
.direnv
|
||||||
|
|
||||||
# Output folders
|
# Output folders
|
||||||
|
build/
|
||||||
output/
|
output/
|
||||||
|
|
||||||
# Vimspector
|
# Vimspector
|
||||||
|
|
1
02/.envrc
Normal file
1
02/.envrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
use nix
|
34
02/.gitignore
vendored
34
02/.gitignore
vendored
|
@ -1,3 +1,15 @@
|
||||||
|
# ClangD
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Nix files
|
||||||
|
.direnv
|
||||||
|
|
||||||
|
# Output folders
|
||||||
|
output/
|
||||||
|
|
||||||
|
# Vimspector
|
||||||
|
# .vimspector.json
|
||||||
|
|
||||||
# Prerequisites
|
# Prerequisites
|
||||||
*.d
|
*.d
|
||||||
|
|
||||||
|
@ -50,25 +62,3 @@ modules.order
|
||||||
Module.symvers
|
Module.symvers
|
||||||
Mkfile.old
|
Mkfile.old
|
||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
# Vscode
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
# CMake
|
|
||||||
CMakeLists.txt.user
|
|
||||||
CMakeCache.txt
|
|
||||||
CMakeFiles
|
|
||||||
CMakeScripts
|
|
||||||
Testing
|
|
||||||
Makefile
|
|
||||||
cmake_install.cmake
|
|
||||||
install_manifest.txt
|
|
||||||
compile_commands.json
|
|
||||||
.cache/
|
|
||||||
CTestTestfile.cmake
|
|
||||||
_deps
|
|
||||||
build/
|
|
||||||
lib/
|
|
||||||
bin/
|
|
||||||
*.swp
|
|
||||||
|
|
||||||
|
|
12
02/default.nix
Normal file
12
02/default.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
let
|
||||||
|
pkgs = import <nixpkgs> {};
|
||||||
|
in
|
||||||
|
pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
# Choose the build tools that you need
|
||||||
|
gcc
|
||||||
|
gdb
|
||||||
|
cmake
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
116
02/src/main.c
116
02/src/main.c
|
@ -6,20 +6,132 @@
|
||||||
* @author jiriks74
|
* @author jiriks74
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
const int MAX_RED = 12;
|
||||||
|
const int MAX_GREEN = 13;
|
||||||
|
const int MAX_BLUE = 14;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int red;
|
||||||
|
int green;
|
||||||
|
int blue;
|
||||||
|
} GameShow;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Count how many cubes of each color were in a show
|
||||||
|
* @param *show A show of cubes in a game
|
||||||
|
* @return A count of all the cubes in a struct
|
||||||
|
*/
|
||||||
|
GameShow get_max_cube_counts(char *game) {
|
||||||
|
char *curr = game;
|
||||||
|
GameShow result = {0};
|
||||||
|
|
||||||
|
while (curr != NULL) {
|
||||||
|
char *end_show = strchr(curr, ';');
|
||||||
|
|
||||||
|
if (end_show != NULL) {
|
||||||
|
*end_show = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
while (curr != NULL) {
|
||||||
|
int cube_count = atoi(curr);
|
||||||
|
|
||||||
|
curr = strchr(curr, ' ');
|
||||||
|
curr += sizeof(char);
|
||||||
|
|
||||||
|
if (*curr == 'r') {
|
||||||
|
if (cube_count > result.red)
|
||||||
|
result.red = cube_count;
|
||||||
|
} else if (*curr == 'g') {
|
||||||
|
if (cube_count > result.green)
|
||||||
|
result.green = cube_count;
|
||||||
|
} else if (*curr == 'b') {
|
||||||
|
if (cube_count > result.blue)
|
||||||
|
result.blue = cube_count;
|
||||||
|
} else {
|
||||||
|
result.red = -1;
|
||||||
|
result.green = -1;
|
||||||
|
result.blue = -1;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
curr = strchr(curr, ',');
|
||||||
|
if (curr != NULL)
|
||||||
|
curr += sizeof(char) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end_show != NULL) {
|
||||||
|
*end_show = ';';
|
||||||
|
curr = end_show + sizeof(char) * 2;
|
||||||
|
} else
|
||||||
|
curr = end_show;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Count how many times were the cubes shown
|
||||||
|
* @return Number of shows or -1 when error occurs
|
||||||
|
*/
|
||||||
|
bool is_game_possible(char *game) {
|
||||||
|
// char *curr = strchr(game, ':');
|
||||||
|
// curr += sizeof(char) * 2;
|
||||||
|
|
||||||
|
// if (curr == NULL) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
GameShow show_counts = get_max_cube_counts(game);
|
||||||
|
|
||||||
|
if (show_counts.red > MAX_RED)
|
||||||
|
return false;
|
||||||
|
else if (show_counts.green > MAX_GREEN)
|
||||||
|
return false;
|
||||||
|
else if (show_counts.blue > MAX_BLUE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef TESTING
|
||||||
/**
|
/**
|
||||||
* @brief Main entry point
|
* @brief Main entry point
|
||||||
* @param argc Number of command-line arguments.
|
* @param argc Number of command-line arguments.
|
||||||
* @param argv Array of command-line arguments.
|
* @param argv Array of command-line arguments.
|
||||||
*/
|
*/
|
||||||
#ifndef TESTING
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
#ifdef TESTING
|
#ifdef TESTING
|
||||||
int main_test(int argc, char *argv[])
|
int main_test(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
printf("Hello world!\n");
|
FILE *input = fopen(argv[1], "r");
|
||||||
|
|
||||||
|
int possible_game_ids_sum = 0;
|
||||||
|
int sum_of_powers = 0;
|
||||||
|
|
||||||
|
char line[512];
|
||||||
|
while (fgets(line, sizeof(line), input)) {
|
||||||
|
if (*line != 'G')
|
||||||
|
break;
|
||||||
|
|
||||||
|
int curr_game_id = atoi(line + sizeof("Game"));
|
||||||
|
|
||||||
|
// if (is_game_possible(line)) {
|
||||||
|
if (is_game_possible(strchr(line, ':') + sizeof(char) * 2)) {
|
||||||
|
possible_game_ids_sum += curr_game_id;
|
||||||
|
// printf("Game %d is possible\n", curr_game_id);
|
||||||
|
} // else
|
||||||
|
// printf("Game %d is impossible\n", curr_game_id);
|
||||||
|
GameShow min_cubes =
|
||||||
|
get_max_cube_counts(strchr(line, ':') + sizeof(char) * 2);
|
||||||
|
sum_of_powers += min_cubes.red * min_cubes.green * min_cubes.blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Sum of possible game IDs: %d\n", possible_game_ids_sum);
|
||||||
|
printf("Sum of powers: %d\n", sum_of_powers);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
5
02/test.input
Normal file
5
02/test.input
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||||
|
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||||
|
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||||
|
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||||
|
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
Loading…
Reference in a new issue