From 40a9c7b12e9497b2aba83ddcd36b00a7a2a20c3d Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Sun, 2 Apr 2023 19:50:00 +0200 Subject: [PATCH] 2022 day 15 part 2: improved solution (20,000 times faster) --- 2022/day15/aoc-c.c | 78 ++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 52 deletions(-) diff --git a/2022/day15/aoc-c.c b/2022/day15/aoc-c.c index 526939e..c0ce211 100644 --- a/2022/day15/aoc-c.c +++ b/2022/day15/aoc-c.c @@ -345,54 +345,6 @@ end: return pair; } -static ulong part1() -{ - ulong res = 0; - int row = testmode() ? 10: 2000000; - uint bucket = hash_32(row, HBITS); - struct pair *pair; - - map.min.y = map.max.y = row; - - while ((pair = parse())) { - add_segments(pair); - } - struct row *prow = find_row(&map.hash[bucket], row); - if (prow) { - struct segment *cur; - list_for_each_entry(cur, &prow->segments, list) { - printf("counting segment (%d,%d) = %d nbeac=%d\n", cur->start, cur->end, - cur->end - cur->start + 1, prow->nbeacons); - res += cur->end - cur->start + 1; - } - res -= prow->nbeacons; - } - return res; -} - -static ulong part2() -{ - ulong res = 0; - struct pair *pair; - - map.min.x = map.min.y = 0; - map.max.x = map.max.y = testmode()? 20: 4000000; - while ((pair = parse())) { - add_segments(pair); - } - for (int row = map.min.y; row <= map.max.y; ++row) { - uint bucket = hash_32(row, HBITS); - struct row *prow = find_row(&map.hash[bucket], row); - struct segment *cur; - cur = list_first_entry(&prow->segments, struct segment, list); - if (cur->end != map.max.x) { - res = ((u64)cur->end + 1UL) * 4000000UL + (u64)row; - break; - } - } - return res; -} - /** * /#\ * /#\ /# #\ @@ -518,7 +470,32 @@ struct coord *check_intersect(struct coord *ret) return NULL; } -static ulong part2_new() +static ulong part1() +{ + ulong res = 0; + int row = testmode() ? 10: 2000000; + uint bucket = hash_32(row, HBITS); + struct pair *pair; + + map.min.y = map.max.y = row; + + while ((pair = parse())) { + add_segments(pair); + } + struct row *prow = find_row(&map.hash[bucket], row); + if (prow) { + struct segment *cur; + list_for_each_entry(cur, &prow->segments, list) { + printf("counting segment (%d,%d) = %d nbeac=%d\n", cur->start, cur->end, + cur->end - cur->start + 1, prow->nbeacons); + res += cur->end - cur->start + 1; + } + res -= prow->nbeacons; + } + return res; +} + +static ulong part2() { ulong res = 0; struct coord result; @@ -544,9 +521,6 @@ int main(int ac, char **av) pool_segment = pool_create("segments", 8192, sizeof(struct segment)); pool_pair = pool_create("pair", 32, sizeof(struct pair)); - //part2_new(); - //printf("loops=%d\n", inner_count); - //exit(1); printf("%s: res=%lu\n", *av, part == 1? part1(): part2()); printf("loops=%d\n", inner_count); pool_destroy(pool_row);