aoc

Advent of code
git clone https://codeberg.org/night0721/aoc
Log | Files | Refs

commit b7aa4dda708d1b8068146bdad5f2c80242ab57cd
parent 67f21dffe7f1ecc452440b9b82ef27fa0a6b2be3
Author: night0721 <[email protected]>
Date:   Sat,  2 Dec 2023 19:52:04 +0000

add c source files for day 2

Diffstat:
A2023/2/1.c | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2023/2/2.c | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 253 insertions(+), 0 deletions(-)

diff --git a/2023/2/1.c b/2023/2/1.c @@ -0,0 +1,125 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <assert.h> +#include <stdbool.h> +#include <ctype.h> + +typedef struct { + int id; + int colors[3]; +} game; + +char** str_split(char* a_str, const char a_delim) +{ + char** result = 0; + size_t count = 0; + char* tmp = a_str; + char* last_comma = 0; + char delim[2]; + delim[0] = a_delim; + delim[1] = 0; + /* Count how many elements will be extracted. */ + while (*tmp) + { + if (a_delim == *tmp) + { + count++; + last_comma = tmp; + } + tmp++; + } + /* Add space for trailing token. */ + count += last_comma < (a_str + strlen(a_str) - 1); + /* Add space for terminating null string so caller + knows where the list of returned strings ends. */ + count++; + result = malloc(sizeof(char*) * count); + if (result) + { + size_t idx = 0; + char* token = strtok(a_str, delim); + while (token) + { + assert(idx < count); + *(result + idx++) = strdup(token); + token = strtok(0, delim); + } + assert(idx == count - 1); + *(result + idx) = 0; + } + return result; +} + +// Note: This function returns a pointer to a substring of the original string. +// If the given string was allocated dynamically, the caller must not overwrite +// that pointer with the returned value, since the original pointer must be +// deallocated using the same allocator with which it was allocated. The return +// value must NOT be deallocated using free() etc. +char *trimwhitespace(char *str) +{ + char *end; + + // Trim leading space + while(isspace((unsigned char)*str)) str++; + + if(*str == 0) // All spaces? + return str; + + // Trim trailing space + end = str + strlen(str) - 1; + while(end > str && isspace((unsigned char)*end)) end--; + + // Write new null terminator character + end[1] = '\0'; + + return str; +} + +int main() { + FILE *inputfile = fopen("./input", "r"); + char line[1024] = { 0 }; + int sum = 0; + size_t len = 0; + ssize_t read; + if (inputfile == NULL) { + printf("Input file not found. Exiting."); + exit(1); + } + while (fgets(line, 1024, inputfile)) { + int colors[3] = { 0, 0, 0 }; + line[strcspn(line, "\n")] = 0; + char **splitted = str_split(line, ':'); + char *id = str_split(splitted[0], ' ')[1]; + char **sets = str_split(splitted[1], ';'); + bool ok = true; + for (int i = 0; sets[i]; i++) { + int colors[3] = { 0, 0, 0 }; + sets[i] = trimwhitespace(sets[i]); + char **subset = str_split(sets[i], ','); + for (int j = 0; subset[j]; j++) { + subset[j] = trimwhitespace(subset[j]); + char **splittedsubset = str_split(subset[j], ' '); + char *count = splittedsubset[0]; + char *color = splittedsubset[1]; + if (strncmp(color, "red", 3) == 0) { + colors[0] = atoi(count); + } else if (strncmp(color, "green", 5) == 0) { + colors[1] = atoi(count); + } else if (strncmp(color, "blue", 4) == 0) { + colors[2] = atoi(count); + } + } + if (colors[0] > 12 || colors[1] > 13 || colors[2]> 14) { + ok = false; + } + } + if (ok) { + sum += atoi(id); + } + free(splitted); + } + fclose(inputfile); + printf("%d\n", sum); + return 0; +} diff --git a/2023/2/2.c b/2023/2/2.c @@ -0,0 +1,128 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <assert.h> +#include <ctype.h> + +typedef struct { + int id; + int colors[3]; +} game; + +char** str_split(char* a_str, const char a_delim) +{ + char** result = 0; + size_t count = 0; + char* tmp = a_str; + char* last_comma = 0; + char delim[2]; + delim[0] = a_delim; + delim[1] = 0; + /* Count how many elements will be extracted. */ + while (*tmp) + { + if (a_delim == *tmp) + { + count++; + last_comma = tmp; + } + tmp++; + } + /* Add space for trailing token. */ + count += last_comma < (a_str + strlen(a_str) - 1); + /* Add space for terminating null string so caller + knows where the list of returned strings ends. */ + count++; + result = malloc(sizeof(char*) * count); + if (result) + { + size_t idx = 0; + char* token = strtok(a_str, delim); + while (token) + { + assert(idx < count); + *(result + idx++) = strdup(token); + token = strtok(0, delim); + } + assert(idx == count - 1); + *(result + idx) = 0; + } + return result; +} + +// Note: This function returns a pointer to a substring of the original string. +// If the given string was allocated dynamically, the caller must not overwrite +// that pointer with the returned value, since the original pointer must be +// deallocated using the same allocator with which it was allocated. The return +// value must NOT be deallocated using free() etc. +char *trimwhitespace(char *str) +{ + char *end; + + // Trim leading space + while(isspace((unsigned char)*str)) str++; + + if(*str == 0) // All spaces? + return str; + + // Trim trailing space + end = str + strlen(str) - 1; + while(end > str && isspace((unsigned char)*end)) end--; + + // Write new null terminator character + end[1] = '\0'; + + return str; +} + +int main() { + FILE *inputfile = fopen("./input", "r"); + char line[1024] = { 0 }; + int sum = 0; + size_t len = 0; + ssize_t read; + if (inputfile == NULL) { + printf("Input file not found. Exiting."); + exit(1); + } + while (fgets(line, 1024, inputfile)) { + int colors[3] = { 0, 0, 0 }; + line[strcspn(line, "\n")] = 0; + char **splitted = str_split(line, ':'); + char *id = str_split(splitted[0], ' ')[1]; + char **sets = str_split(splitted[1], ';'); + int maxes[3] = { 0, 0, 0 }; + for (int i = 0; sets[i]; i++) { + int colors[3] = { 0, 0, 0 }; + sets[i] = trimwhitespace(sets[i]); + char **subset = str_split(sets[i], ','); + for (int j = 0; subset[j]; j++) { + subset[j] = trimwhitespace(subset[j]); + char **splittedsubset = str_split(subset[j], ' '); + char *count = splittedsubset[0]; + char *color = splittedsubset[1]; + if (strncmp(color, "red", 3) == 0) { + colors[0] = atoi(count); + } else if (strncmp(color, "green", 5) == 0) { + colors[1] = atoi(count); + } else if (strncmp(color, "blue", 4) == 0) { + colors[2] = atoi(count); + } + if (colors[0] > maxes[0]) { + maxes[0] = colors[0]; + } + if (colors[1] > maxes[1]) { + maxes[1] = colors[1]; + } + if (colors[2] > maxes[2]) { + maxes[2] = colors[2]; + } + } + } + sum += maxes[0] * maxes[1] * maxes[2]; + free(splitted); + } + fclose(inputfile); + printf("%d\n", sum); + return 0; +}