From febcd39546355faca66e50132b087ecc23d9d9ac Mon Sep 17 00:00:00 2001 From: Xamora Date: Sun, 8 Dec 2024 07:58:08 +0100 Subject: [PATCH] finish 08, visualiser in part 2 --- 08/Makefile | 41 ++++++++++++++++++++++++ 08/_.h | 27 ++++++++++++++++ 08/main.txt | 50 +++++++++++++++++++++++++++++ 08/mylib.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 08/part1.c | 58 ++++++++++++++++++++++++++++++++++ 08/part2.c | 77 +++++++++++++++++++++++++++++++++++++++++++++ 08/test.txt | 12 +++++++ 7 files changed, 356 insertions(+) create mode 100644 08/Makefile create mode 100644 08/_.h create mode 100644 08/main.txt create mode 100644 08/mylib.c create mode 100644 08/part1.c create mode 100644 08/part2.c create mode 100644 08/test.txt diff --git a/08/Makefile b/08/Makefile new file mode 100644 index 0000000..1ad3e1c --- /dev/null +++ b/08/Makefile @@ -0,0 +1,41 @@ +CC := gcc +LD := $(CC) +LIBS := -lm +LDFLAGS := +CFLAGS := -Wall -Wextra -Wno-override-init -std=c2x -include_.h +SRC := part1.c mylib.c +ifeq ($(PART),2) + SRC := part2.c mylib.c +endif +OBJ_DIR := build +OBJ := $(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(SRC))) +DIR := . +RAW_NAME:= a.out +NAME := $(RAW_NAME) + +ifeq ($(RELEASE),1) + CFLAGS += -O3 + LDFLAGS += -O3 -s +else + CFLAGS += -O0 -g3 + LDFLAGS += -O0 -g +endif + +all: $(NAME) + +$(NAME): $(OBJ) + $(LD) $(LDFLAGS) -o $(DIR)/$(NAME) $(OBJ) $(LIBS) + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -c -o $@ $< + +clean: + @rm -rf $(OBJ_DIR) + @rm -rf $(RAW_NAME) + +re: + @make --no-print clean + @make --no-print all + +.PHONY: all clean re diff --git a/08/_.h b/08/_.h new file mode 100644 index 0000000..c0a4ec4 --- /dev/null +++ b/08/_.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) +#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +#define ABS(X) ((X) >= 0 ? (X) : -(X)) + +char** str_split(char* a_str, const char a_delim); + +int str_index(char *str, char c); + +int number_of_element(char *str, char c); + +long gmc(long a, long b); +long lmc(long a, long b); +long lmcs(int array[], int n); + +long strslen(char **strs); diff --git a/08/main.txt b/08/main.txt new file mode 100644 index 0000000..09183a7 --- /dev/null +++ b/08/main.txt @@ -0,0 +1,50 @@ +..........W......8..............................4. +............W...................F............1.L.. +......o.................................A......... +................Z.........................A....... +................u................................. +.........8.......g...........................F.... +.............2..8.......F......................1.. +g....G............................................ +.o..2.g...........Z..W.......................4b.1. +.................v...Z....c.....B...1.......f...b. +...uG.c............O.............Z................ +..G..........c8....................5..4........... +...c.....G.g..........x..........B5............b.. +.S.....o..v....................................... +............................BV.................... +..........u............x.............B......0..... +...3....C..........I............V6..............f. +........S2......C.......................5......... +................a....v............................ +..y...2..............i.......k.................4.. +..........I........Yv......5...........f.......... +.....3....o...................x................... +..........3.........S.........k................... +...y.......C.......d.I......X......fV............. +.....S............................d............... +.....O........I.......................iV.....A.... +.y.................x.............k.ai0...F........ +.......Y..............................a........... +........z.........................0............... +..O.3..............................0.......a...... +.....z............................X............... +......z................................l.......... +......L.......U........d.....X.................... +......7z..........d............................... +O........7.....................K.................. +.....................X...6........k............... +...L........Y...................s................. +.7...D................................l.9......... +..D...........................w..................i +......D.............6............s................ +.................w..........6.9............s...... +..............................s................... +........7......................................... +L...Y..........................U.................. +.....................9..........l.........K....... +.......................9..............U........... +...D.............................................. +.................................................K +..........y......................U.............l.. +..................w...................K........... diff --git a/08/mylib.c b/08/mylib.c new file mode 100644 index 0000000..87fbf66 --- /dev/null +++ b/08/mylib.c @@ -0,0 +1,91 @@ +#include "_.h" + +// NOT MY CODE +// https://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c +char** str_split(char* str, const char a_delim) +{ + char *a_str = strdup(str); + 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; + + while (*tmp) + { + if (a_delim == *tmp) + { + count++; + last_comma = tmp; + } + tmp++; + } + + count += last_comma < (a_str + strlen(a_str) - 1); + + 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; + } + + free(a_str); + return result; +} + +int str_index(char *str, char c) { + + int i = 0; + while (str[i]) + if (str[i++] == c) + return i; + + return -1; +} + +int number_of_element(char *str, char c) { + int nbr = 0; + for (int i = 0; str[i] != '\0'; i++) + if (str[i] == c) + nbr++; + return nbr; +} + +long gmc(long a, long b) { + if (b == 0) + return a; + return gmc(b, a % b); +} + +long lmc(long a, long b) { + return (a / gmc(a, b)) * b; +} + +long lmcs(int array[], int n) { + long result = array[0]; + for (int i = 1; i < n; i++) + result = lmc(result, array[i]); + return result; +} + +long strslen(char **strs) { + long count = 0; + while (strs[count]) + count++; + return count; +} diff --git a/08/part1.c b/08/part1.c new file mode 100644 index 0000000..6c4124d --- /dev/null +++ b/08/part1.c @@ -0,0 +1,58 @@ +#include "_.h" + +int main(int argc, char **argv) { + + if (argc != 2) + return 1; + + char *input = argv[1]; + char **inputs = str_split(strdup(input), '\n'); + + int count = 0; + int max_y = strslen(inputs); + int max_x = strlen(inputs[0]); + int signals[4096][2] = { [0 ... 4095] = {-1, -1} }; + for (int y = 0; inputs[y] != NULL; y++) { + for (int x = 0; inputs[y][x] != '\0'; x++) { + + if (isalpha(inputs[y][x]) || isdigit(inputs[y][x])) { + for (int i = 0; inputs[i] != NULL; i++) { + for (int j = 0; inputs[i][j] != '\0'; j++) { + if (i == y && j == x) + continue; + if (inputs[i][j] != inputs[y][x]) + continue; + + int signal_y = i - y + i; + int signal_x = j - x + j; + + if (signal_y >= max_y || + signal_y < 0 || + signal_x >= max_x || + signal_x < 0) + continue; + + int continu = 0; + for (int v = 0; signals[v][0] != -1; v++) { + if (signals[v][0] == signal_y && + signals[v][1] == signal_x) { + continu = 1; + break; + } + } + if (continu == 1) + continue; + + signals[count][0] = signal_y; + signals[count][1] = signal_x; + count++; + } + } + } + + } + } + + printf("count: %d\n", count); + return 0; +} diff --git a/08/part2.c b/08/part2.c new file mode 100644 index 0000000..0623682 --- /dev/null +++ b/08/part2.c @@ -0,0 +1,77 @@ +#include "_.h" + +int main(int argc, char **argv) { + + if (argc != 2) + return 1; + + char *input = argv[1]; + char **inputs = str_split(strdup(input), '\n'); + + int count = 0; + int max_y = strslen(inputs); + int max_x = strlen(inputs[0]); + char display[max_y][max_x]; + for (int i = 0; i < max_y; i++) + for (int j = 0; j < max_x; j++) + display[i][j] = '.'; + int signals[4096][2] = { [0 ... 4095] = {-1, -1} }; + for (int y = 0; inputs[y] != NULL; y++) { + for (int x = 0; inputs[y][x] != '\0'; x++) { + + if (!isalpha(inputs[y][x]) && !isdigit(inputs[y][x])) + continue; + for (int i = 0; inputs[i] != NULL; i++) { + for (int j = 0; inputs[i][j] != '\0'; j++) { + + if (!isalpha(inputs[i][j]) && !isdigit(inputs[i][j])) + continue; + + + for (int w = 0; w < 1000; w++) { + if (i == y && j == x) + break; + if (inputs[i][j] != inputs[y][x]) + break; + + int signal_y = ((i - y) * w + i); + int signal_x = ((j - x) * w + j); + + if (signal_y >= max_y || + signal_y < 0 || + signal_x >= max_x || + signal_x < 0) { + break; + } + + int continu = 0; + for (int v = 0; signals[v][0] != -1; v++) { + if (signals[v][0] == signal_y && + signals[v][1] == signal_x) { + continu = 1; + break; + } + } + if (continu == 1) + continue; + + display[signal_y][signal_x] = '#'; + signals[count][0] = signal_y; + signals[count][1] = signal_x; + count+=1; + } + + } + } + } + } + + for (int i = 0; i < max_y; i++) { + for (int j = 0; j < max_x; j++) { + printf("%c", display[i][j]); + } + printf("\n"); + } + printf("count: %d\n", count); + return 0; +} diff --git a/08/test.txt b/08/test.txt new file mode 100644 index 0000000..78a1e91 --- /dev/null +++ b/08/test.txt @@ -0,0 +1,12 @@ +............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............