feat: Day5_1 worky for example but no for real blyat
This commit is contained in:
parent
84c9cbbbf4
commit
31e44a8da2
4 changed files with 2146 additions and 0 deletions
6
2024/Day5/.clang-format
Normal file
6
2024/Day5/.clang-format
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
IndentWidth: 4
|
||||||
|
ColumnLimit: 100
|
||||||
|
PointerAlignment: Right
|
||||||
|
AlignAfterOpenBracket: BlockIndent
|
||||||
|
AlignArrayOfStructures: Left
|
||||||
17
2024/Day5/Makefile
Normal file
17
2024/Day5/Makefile
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
CC = gcc
|
||||||
|
CC_FLAGS = -Wall -Wextra -Werror -Wpedantic -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -ggdb
|
||||||
|
CC_LINK_FLAGS =
|
||||||
|
|
||||||
|
.PHONY: all run clean
|
||||||
|
all: run
|
||||||
|
|
||||||
|
run: build
|
||||||
|
./target/main.o
|
||||||
|
|
||||||
|
build: src/main.c
|
||||||
|
mkdir -p target
|
||||||
|
$(CC) -o target/main.o src/main.c $(CC_FLAGS) $(CC_LINK_FLAGS)
|
||||||
|
chmod u+x target/main.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -r target/*
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define STB_DS_IMPLEMENTATION
|
||||||
|
#include "stb_ds.h"
|
||||||
|
|
||||||
|
#define BUFFER_SIZE 1023
|
||||||
|
|
||||||
|
typedef struct PageOrderingRules {
|
||||||
|
int key;
|
||||||
|
int *value;
|
||||||
|
|
||||||
|
} PageOrderingRules;
|
||||||
|
|
||||||
|
void read_por_from_file(PageOrderingRules **pageOrderingRules, const char *filename);
|
||||||
|
void read_updates_from_file(int ***updates, const char *filename);
|
||||||
|
void print_por(PageOrderingRules *pageOrderingRules);
|
||||||
|
void print_updates(int **updates);
|
||||||
|
char **str_split(char *a_str, const char a_delim);
|
||||||
|
int in_array(int *arr, int i);
|
||||||
|
void print_arr(int *arr);
|
||||||
|
void print_arr_with_highlighted_element(int *arr, int el);
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
const char filename[] = "input.txt";
|
||||||
|
PageOrderingRules *pageOrderingRules = NULL;
|
||||||
|
int **updates = NULL;
|
||||||
|
int sum = 0;
|
||||||
|
read_por_from_file(&pageOrderingRules, filename);
|
||||||
|
read_updates_from_file(&updates, filename);
|
||||||
|
print_por(pageOrderingRules);
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(updates); i++) {
|
||||||
|
int is_valid = 1;
|
||||||
|
int *current_updates = updates[i];
|
||||||
|
for (int j = 0; j < arrlen(current_updates) && is_valid; j++) {
|
||||||
|
int current_page = current_updates[j];
|
||||||
|
for (int k = j + 1; k < arrlen(current_updates) && is_valid; k++) {
|
||||||
|
if (in_array(hmget(pageOrderingRules, current_updates[k]), current_page)) {
|
||||||
|
printf(
|
||||||
|
"Element %d is in %d's array of rules: ", current_page, current_updates[k]
|
||||||
|
);
|
||||||
|
print_arr_with_highlighted_element(
|
||||||
|
hmget(pageOrderingRules, current_updates[k]), current_page
|
||||||
|
);
|
||||||
|
printf("\n");
|
||||||
|
is_valid = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_valid) {
|
||||||
|
int middle = current_updates[arrlen(current_updates) / 2];
|
||||||
|
sum += middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Sum: %d\n", sum);
|
||||||
|
|
||||||
|
for (int i = 0; i < hmlen(pageOrderingRules); i++) {
|
||||||
|
arrfree(pageOrderingRules[i].value);
|
||||||
|
}
|
||||||
|
hmfree(pageOrderingRules);
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(updates); i++) {
|
||||||
|
arrfree(updates[i]);
|
||||||
|
}
|
||||||
|
arrfree(updates);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_arr_with_highlighted_element(int *arr, int el) {
|
||||||
|
printf("[");
|
||||||
|
for (int i = 0; i < arrlen(arr); i++) {
|
||||||
|
if (arr[i] == el) {
|
||||||
|
printf("\x1b[31m%d\x1b[39;49m", arr[i]);
|
||||||
|
} else {
|
||||||
|
printf("%d", arr[i]);
|
||||||
|
}
|
||||||
|
if (i != (arrlen(arr) - 1)) {
|
||||||
|
printf(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("]");
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_arr(int *arr) {
|
||||||
|
printf("[");
|
||||||
|
for (int i = 0; i < arrlen(arr); i++) {
|
||||||
|
printf("%d", arr[i]);
|
||||||
|
if (i != (arrlen(arr) - 1)) {
|
||||||
|
printf(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("]");
|
||||||
|
}
|
||||||
|
|
||||||
|
int in_array(int *arr, int el) {
|
||||||
|
for (int i = 0; i < arrlen(arr); i++) {
|
||||||
|
if (arr[i] == el) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_updates(int **updates) {
|
||||||
|
for (int i = 0; i < arrlen(updates); i++) {
|
||||||
|
print_arr(updates[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void read_updates_from_file(int ***updates, const char *filename) {
|
||||||
|
FILE *file = fopen(filename, "r");
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
perror("Could not open file!");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buffer = malloc(BUFFER_SIZE);
|
||||||
|
int is_updates = 0;
|
||||||
|
|
||||||
|
while (fgets(buffer, BUFFER_SIZE, file)) {
|
||||||
|
if (buffer[0] == '\n') {
|
||||||
|
is_updates = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!is_updates) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
char **tokens = str_split(buffer, ',');
|
||||||
|
int *values = NULL;
|
||||||
|
if (arrlen(tokens) > 0) {
|
||||||
|
for (int i = 0; *(tokens + i); i++) {
|
||||||
|
arrput(values, atoi(tokens[i]));
|
||||||
|
}
|
||||||
|
if (arrlen(values) > 0) {
|
||||||
|
arrput(*updates, values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void read_por_from_file(PageOrderingRules **pageOrderingRules, const char *filename) {
|
||||||
|
FILE *file = fopen(filename, "r");
|
||||||
|
|
||||||
|
if (!file) {
|
||||||
|
perror("Could not open file!");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buffer = malloc(BUFFER_SIZE);
|
||||||
|
|
||||||
|
while (fgets(buffer, BUFFER_SIZE, file)) {
|
||||||
|
if (buffer[0] == '\n') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **tokens = str_split(buffer, '|');
|
||||||
|
if (tokens) {
|
||||||
|
int key = atoi(tokens[0]);
|
||||||
|
int value = atoi(tokens[1]);
|
||||||
|
int *current_values = hmget(*pageOrderingRules, key);
|
||||||
|
|
||||||
|
arrput(current_values, value);
|
||||||
|
hmput(*pageOrderingRules, key, current_values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_por(PageOrderingRules *pageOrderingRules) {
|
||||||
|
for (int i = 0; i < hmlen(pageOrderingRules); i++) {
|
||||||
|
int key = pageOrderingRules[i].key;
|
||||||
|
int *value = pageOrderingRules[i].value;
|
||||||
|
printf("%d: ", key);
|
||||||
|
print_arr(value);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
1895
2024/Day5/src/stb_ds.h
Normal file
1895
2024/Day5/src/stb_ds.h
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue