Solve Day 02 Part 2

This commit is contained in:
zeichensystem 2025-12-03 20:17:59 +01:00
parent e878231d52
commit 3343b36e29
4 changed files with 67 additions and 15 deletions

View File

@ -40,7 +40,7 @@ set(TARGETS day-01 day-02) # Add the other days as you please.
list(LENGTH TARGETS NUM_TARGETS)
set(LIBGUF_IMPLS ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_alloc_libc_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_str_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_init_impl.c )
set(LIBGUF_IMPLS ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_alloc_libc_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_str_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/guf_init_impl.c ${CMAKE_CURRENT_SOURCE_DIR}/libguf_impls/dict_impl.c)
foreach(current_target IN LISTS TARGETS)
add_executable(${current_target} ${current_target}/${current_target}.c ${LIBGUF_IMPLS})

View File

@ -3,10 +3,12 @@
#include "guf_str.h"
#include "guf_math.h"
#include "libguf_impls/dict_impl.h"
/*
- Part 1: 54234399924 (Example: 1227775554)
- Part 2: (Example: )
- Part 2: 70187097315 (Example: 4174379265)
*/
guf_allocator g_allocator;
@ -56,6 +58,10 @@ uint64_t solution(guf_str_view input, bool part_two)
guf_str_init_empty(&start_str, &g_allocator);
guf_str_init_empty(&end_str, &g_allocator);
dict_u64_bool seen_invalid_ids;
dict_u64_bool_init(&seen_invalid_ids, &g_allocator);
while (read_id_range(&input, &range)) {
guf_str_append_u64(&start_str, range.start);
guf_str_append_u64(&end_str, range.end);
@ -63,30 +69,44 @@ uint64_t solution(guf_str_view input, bool part_two)
const int n_digits_end = (int)guf_str_len(&end_str);
// Generate all pairs of one, two, three, ... digits (without leading zeroes)
for (int half_n_digits = 1; half_n_digits <= 10; ++half_n_digits) {
for (int half_n_digits = 1; half_n_digits <= 20; ++half_n_digits) {
if (half_n_digits * 2 > n_digits_end) {
break;
} else if (half_n_digits * 2 < n_digits_start) {
continue;
}
const uint64_t min_half = pow_10(half_n_digits - 1);
uint64_t min_half = pow_10(half_n_digits - 1);
const uint64_t max_half = pow_10(half_n_digits) - 1;
for (uint64_t cur_half = min_half; cur_half <= max_half; ++cur_half) {
uint64_t id = cur_half * pow_10(half_n_digits) + cur_half;
if (id > range.end) {
break;
} else if (id >= range.start) {
invalid_id_sum += id;
if (!part_two) { // Part 1:
uint64_t id = cur_half * pow_10(half_n_digits) + cur_half;
if (id > range.end) {
break;
} else if (id >= range.start) {
invalid_id_sum += id;
}
} else { // Part 2:
uint64_t id = cur_half;
for (int reps = 0; reps < 20; ++reps) {
id = id * pow_10(half_n_digits) + cur_half;
if (id > range.end) {
break;
} else if (id >= range.start) {
if (!dict_u64_bool_contains_val_arg(&seen_invalid_ids, id)) {
invalid_id_sum += id;
dict_u64_bool_insert_val_arg(&seen_invalid_ids, id, true, GUF_CPY_VALUE, GUF_CPY_VALUE);
}
}
}
}
}
}
guf_str_substr(&start_str, 0, 0);
guf_str_substr(&end_str, 0, 0);
}
dict_u64_bool_free(&seen_invalid_ids, NULL);
return invalid_id_sum;
}
@ -108,8 +128,8 @@ int main(int argc, const char **argv)
const uint64_t p1_result = solution(guf_str_view_from_str(&input_str), false);
printf("Part 1: %" PRIu64 "\n", p1_result);
// const uint64_t p2_result = solution(guf_str_view_from_str(&input_str), true);
// printf("Part 2: %" PRIu64 "\n", p2_result);
const uint64_t p2_result = solution(guf_str_view_from_str(&input_str), true);
printf("Part 2: %" PRIu64 "\n", p2_result);
guf_str_free(&input_str, NULL);

10
libguf_impls/dict_impl.c Normal file
View File

@ -0,0 +1,10 @@
#include "dict_impl.h"
#define GUF_DICT_KEY_T uint64_t
#define GUF_DICT_KEY_HASH uint64_hash
#define GUF_DICT_KEY_T_EQ uint64_eq
#define GUF_DICT_VAL_T bool
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
#define GUF_DICT_NAME dict_u64_bool
#define GUF_DICT_IMPL
#include "guf_dict.h"

22
libguf_impls/dict_impl.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef GUF_DICT_IMPL_H
#define GUF_DICT_IMPL_H
#include "guf_hash.h"
static inline guf_hash_size_t uint64_hash(const uint64_t *a)
{
return guf_hash(a, sizeof(uint64_t), GUF_HASH_INIT); // TODO: byte order...
}
static inline bool uint64_eq(const uint64_t *a, const uint64_t *b)
{
return *a == *b;
}
#define GUF_DICT_KEY_T uint64_t
#define GUF_DICT_KEY_HASH uint64_hash
#define GUF_DICT_KEY_T_EQ uint64_eq
#define GUF_DICT_VAL_T bool
#define GUF_DICT_VAL_T_IS_INTEGRAL_TYPE
#define GUF_DICT_NAME dict_u64_bool
#include "guf_dict.h"
#endif