From 62c8a6c887809641c4fd6f21cd24b0b26aae48e8 Mon Sep 17 00:00:00 2001 From: Bond_009 Date: Thu, 10 Dec 2020 16:02:24 +0100 Subject: Optimize day 10 --- 10/part1.c | 19 ++++++++----------- 10/part2.c | 31 +++++++++++++++---------------- utils.h | 7 +++++++ 3 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 utils.h diff --git a/10/part1.c b/10/part1.c index 9b44cf5..f5a700e 100644 --- a/10/part1.c +++ b/10/part1.c @@ -11,18 +11,16 @@ void insert_value_sorted(int *list, size_t *size, int value) long long low = 0, high = *size; while (low < high) { int m = low + (high - low) / 2; - if (list[m] == value) { - /* Name already exists, - return pointer to the already existsing string and free the new one. - */ - return; - } - else if (list[m] < value) { + if (list[m] < value) { low = m + 1; } - else { + else if (list[m] > value) { high = m; } + else { + // Value already exists in the list + return; + } } for (long long i = *size - 1; i >= low; i--) { @@ -33,7 +31,7 @@ void insert_value_sorted(int *list, size_t *size, int value) list[low] = value; } -int bags_count(const char *filename) +int solve(const char *filename) { FILE *file = fopen(filename, "r"); @@ -44,7 +42,6 @@ int bags_count(const char *filename) size_t input_size = 1; // 0 is our start value while (fgets(buffer, 128, file)) { - puts(buffer); insert_value_sorted(input, &input_size, atoi(buffer)); } @@ -69,5 +66,5 @@ int bags_count(const char *filename) int main(int argc, char *argv[]) { - printf("%i\n", bags_count(argv[argc - 1])); + printf("%i\n", solve(argv[argc - 1])); } diff --git a/10/part2.c b/10/part2.c index bd5d22c..392cf0a 100644 --- a/10/part2.c +++ b/10/part2.c @@ -4,6 +4,8 @@ #include #include +#include "../utils.h" + #define MAX_INPUT_LEN 128 void insert_value_sorted(int *list, size_t *size, int value) @@ -11,18 +13,16 @@ void insert_value_sorted(int *list, size_t *size, int value) long long low = 0, high = *size; while (low < high) { int m = low + (high - low) / 2; - if (list[m] == value) { - /* Name already exists, - return pointer to the already existsing string and free the new one. - */ - return; - } - else if (list[m] < value) { + if (list[m] < value) { low = m + 1; } - else { + else if (list[m] > value) { high = m; } + else { + // Value already exists in the list + return; + } } for (long long i = *size - 1; i >= low; i--) { @@ -38,23 +38,22 @@ uint64_t pos_seq(int *input, size_t input_size) const static int TRIB[] = { 1, 1, 2, 4, 7 }; int con = 0; uint64_t res = 1; - - for (size_t i = 1; i < input_size; i++) - { - int diff = input[i] - input[i - 1]; - if (diff == 1) { + int *prev = input; + int *cur = input + 1; + do { + if (likely(*cur - *prev == 1)) { con++; } else { res *= TRIB[con]; con = 0; } - } + } while (++prev && ++cur < input + input_size); return res; } -size_t bags_count(const char *filename) +uint64_t solve(const char *filename) { FILE *file = fopen(filename, "r"); @@ -78,5 +77,5 @@ size_t bags_count(const char *filename) int main(int argc, char *argv[]) { - printf("%zu\n", bags_count(argv[argc - 1])); + printf("%lu\n", solve(argv[argc - 1])); } diff --git a/utils.h b/utils.h new file mode 100644 index 0000000..db6b5de --- /dev/null +++ b/utils.h @@ -0,0 +1,7 @@ +#ifndef AOC_UTILS_H +#define AOC_UTILS_H + +#define likely(x) __builtin_expect((x), 1) +#define unlikely(x) __builtin_expect((x), 0) + +#endif -- cgit v1.2.3