diff options
| author | Bond_009 <bond.009@outlook.com> | 2020-12-10 16:02:24 +0100 |
|---|---|---|
| committer | Bond_009 <bond.009@outlook.com> | 2020-12-10 16:02:24 +0100 |
| commit | 62c8a6c887809641c4fd6f21cd24b0b26aae48e8 (patch) | |
| tree | 0f254e63b912219ca807cac0ab6e0e2c1029b619 | |
| parent | 9112fe39b696fa91620f1637fbc71772091917a3 (diff) | |
Optimize day 10
| -rw-r--r-- | 10/part1.c | 19 | ||||
| -rw-r--r-- | 10/part2.c | 31 | ||||
| -rw-r--r-- | utils.h | 7 |
3 files changed, 30 insertions, 27 deletions
@@ -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])); } @@ -4,6 +4,8 @@ #include <malloc.h> #include <string.h> +#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])); } @@ -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 |
