From 7d967a726391163f25b8a9e35e11cc6c2dd190d2 Mon Sep 17 00:00:00 2001 From: laura Date: Fri, 12 Dec 2025 14:37:37 +0100 Subject: [PATCH] solved 5 in reasonable runtime, could be optimized --- 5/Makefile | 13 ++++ 5/main.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 5/Makefile create mode 100644 5/main.c diff --git a/5/Makefile b/5/Makefile new file mode 100644 index 0000000..ba44bd3 --- /dev/null +++ b/5/Makefile @@ -0,0 +1,13 @@ +client: main.c + gcc -o main main.c -O3 -Wall -Wextra -g -march=x86-64-v3 + +client-debug: main.c + gcc -o main main.c -O1 -Wall -Wextra -g -fsanitize=address + +client-debug-nosanitize: main.c + gcc -o main main.c -O1 -Wall -Wextra -g + +clean: + rm main + +.PHONY: clean \ No newline at end of file diff --git a/5/main.c b/5/main.c new file mode 100644 index 0000000..a0e5031 --- /dev/null +++ b/5/main.c @@ -0,0 +1,218 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char input[] = +{ +#embed "input.txt" +,'\0' // null terminator +}; + +int width = 0; +int height = 0; +uint64_t result = 0; + + +uint64_t parseNum(char* str, int* len){ + int i = 0; + uint64_t out = 0; + while(str[i] != ',' && str[i] != '-' && str[i] != '\n'){ + out += str[i]-0x30; + out *= 10; + i++; + } + out /=10; + *len = i; + return out; +} + +int numPlaces (uint64_t n) { + int r = 1; + while (n > 9) { + n /= 10; + r++; + } + //printf("%d has %d places\n", n, r); + return r; +} + +uint64_t power(uint64_t base, uint64_t exp) { + uint64_t i, result = 1; + for (i = 0; i < exp; i++) + result *= base; + return result; +} + +void sort_ranges(uint64_t* starts, uint64_t* ends, int len){ + + for(int i = 0; istarts[o]){ + //printf("%lu is bigger than %lu, so we have a new lowest\n", starts[curr_min], starts[o]); + curr_min = o; + } + } + uint64_t tmp_start = starts[curr_min]; + uint64_t tmp_end = ends[curr_min]; + + starts[curr_min] = starts[i]; + ends[curr_min] = ends[i]; + + starts[i] = tmp_start; + ends[i] = tmp_end; + } +} + +//bool check_fresh(uint64_t storage, uint64_t* starts, uint64_t* ends, int length){ +// int guess = length/2; +// int diff = length/4; +// while(true){ +// printf("guess is %d", guess); +// diff = (diff/2)+1; +// if(storage>starts[guess] && storagestarts[guess]){ +// guess += diff; +// }else{ +// guess -= diff; +// } +// } +// if(storage=starts[i] && storage<=ends[i]){ + //printf(" .....fresh \t(is in range %lu - %lu)\n", starts[i], ends[i]); + return true; + } + } + + //printf(" .....spoiled\n"); + return false; +} + +void join_ranges(uint64_t* starts, uint64_t* ends, int* range_count){ + int new_count = 0; + for(int i = 0; i<*range_count; i++){ + int n=0; + uint64_t end = ends[i]; + while(starts[i+n+1]<=end+1){ + n++; + if(end