c 2024 day 10 part 2
This commit is contained in:
parent
f941950ecf
commit
80a315131b
@ -15,7 +15,7 @@ typedef struct Map {
|
|||||||
int positions_count;
|
int positions_count;
|
||||||
} Map;
|
} Map;
|
||||||
|
|
||||||
void ascend(Map *map) {
|
void ascend(Map *map, bool dedupe) {
|
||||||
char search_for = map->current_level + 1 + '0';
|
char search_for = map->current_level + 1 + '0';
|
||||||
int positions[10000];
|
int positions[10000];
|
||||||
int positions_count = 0;
|
int positions_count = 0;
|
||||||
@ -27,31 +27,37 @@ void ascend(Map *map) {
|
|||||||
if (p + map->width < map->data_length && map->data[p + map->width] == search_for) positions[positions_count++] = p + map->width;
|
if (p + map->width < map->data_length && map->data[p + map->width] == search_for) positions[positions_count++] = p + map->width;
|
||||||
}
|
}
|
||||||
|
|
||||||
qsort(positions, positions_count, sizeof(int), aoc_sort_int);
|
if (dedupe) {
|
||||||
|
qsort(positions, positions_count, sizeof(int), aoc_sort_int);
|
||||||
|
|
||||||
int deduped_positions[10000];
|
int deduped_positions[10000];
|
||||||
int deduped_positions_count = 0;
|
int deduped_positions_count = 0;
|
||||||
|
|
||||||
for (int i = 0; i < positions_count - 1; i++) {
|
for (int i = 0; i < positions_count - 1; i++) {
|
||||||
if (positions[i] != positions[i+1]) {
|
if (positions[i] != positions[i+1]) {
|
||||||
deduped_positions[deduped_positions_count++] = positions[i];
|
deduped_positions[deduped_positions_count++] = positions[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
deduped_positions[deduped_positions_count++] = positions[positions_count - 1];
|
||||||
deduped_positions[deduped_positions_count++] = positions[positions_count - 1];
|
|
||||||
|
|
||||||
map->positions_count = deduped_positions_count;
|
map->positions_count = deduped_positions_count;
|
||||||
memcpy(&(map->positions), &deduped_positions, deduped_positions_count * sizeof(int));
|
memcpy(&(map->positions), &deduped_positions, deduped_positions_count * sizeof(int));
|
||||||
map->current_level++;
|
map->current_level++;
|
||||||
|
} else {
|
||||||
|
map->positions_count = positions_count;
|
||||||
|
memcpy(&(map->positions), &positions, positions_count * sizeof(int));
|
||||||
|
map->current_level++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int calculate_score(Map *map, int index) {
|
int calculate_score(Map *map, int index, bool dedupe) {
|
||||||
if (map->data[index] != '0') return 0;
|
if (map->data[index] != '0') return 0;
|
||||||
map->current_level = 0;
|
map->current_level = 0;
|
||||||
|
|
||||||
map->positions[0] = index;
|
map->positions[0] = index;
|
||||||
map->positions_count = 1;
|
map->positions_count = 1;
|
||||||
for (int i = 0; i < 9; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
ascend(map);
|
ascend(map, dedupe);
|
||||||
}
|
}
|
||||||
return map->positions_count;
|
return map->positions_count;
|
||||||
}
|
}
|
||||||
@ -67,13 +73,15 @@ int main() {
|
|||||||
m.height = input_length - m.width;
|
m.height = input_length - m.width;
|
||||||
|
|
||||||
int score = 0;
|
int score = 0;
|
||||||
|
int big_score = 0;
|
||||||
|
|
||||||
for (int i = 0; i < input_length; i++) {
|
for (int i = 0; i < input_length; i++) {
|
||||||
score += calculate_score(&m, i);
|
score += calculate_score(&m, i, true);
|
||||||
|
big_score += calculate_score(&m, i, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Part 1: %ld\n", score);
|
printf("Part 1: %ld\n", score);
|
||||||
// printf("Part 2: %ld\n", second_checksum);
|
printf("Part 2: %ld\n", big_score);
|
||||||
|
|
||||||
aoc_free();
|
aoc_free();
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user