Day 5: Cafeteria ## Megathread guidelines - Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever) - You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL ## FAQ - What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268 - Where do I participate?: https://adventofcode.com/ - Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You must log in or register to comment.
Nim
Huh, I didn’t expect two easy days in a row.
Part 1 is a range check. Part 2 is a range merge.Runtime: ~720 µs
type AOCSolution[T,U] = tuple[part1: T, part2: U] proc merge[T](ranges: var seq[Slice[T]]) = ranges.sort(cmp = proc(r1, r2: Slice[T]): int = cmp(r1.a, r2.a)) var merged = @[ranges[0]] for range in ranges.toOpenArray(1, ranges.high): if range.a <= merged[^1].b: if range.b > merged[^1].b: merged[^1].b = range.b else: merged.add range ranges = merged proc solve(input: string): AOCSolution[int, int] = let chunks = input.split("\n\n") var freshRanges = chunks[0].splitLines().mapIt: let t = it.split('-'); t[0].parseInt .. t[1].parseInt freshRanges.merge() block p1: let availableFood = chunks[1].splitLines().mapIt(parseInt it) for food in availableFood: for range in freshRanges: if food in range: inc result.part1 break block p2: for range in freshRanges: result.part2 += range.b-range.a+1Full solution at Codeberg: solution.nim
C
Sweet one. Glad the merge could be done with one n2/2 scan and no sorting or moving, which will make the assembly port a bit easier. Speaking of which, I’m still at day 3 there, fighting not the puzzles but the 64K .COM file limit!
Code
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <assert.h> #define MR 256 #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) struct range { uint64_t lo, hi; }; static struct range rs[MR]; static int nrs; int main() { uint64_t p1=0,p2=0, val; int i,j; char buf[64]; for (; fgets(buf, sizeof(buf), stdin); nrs++) { assert(nrs < MR); if (sscanf(buf, "%lu-%lu", &rs[nrs].lo, &rs[nrs].hi) != 2) break; } for (i=0; i<nrs-1; i++) for (j=i+1; j<nrs; j++) if (rs[i].lo <= rs[j].hi && rs[i].hi >= rs[j].lo) { rs[j].lo = MIN(rs[i].lo, rs[j].lo); rs[j].hi = MAX(rs[i].hi, rs[j].hi); rs[i].lo = rs[i].hi = 0; } while (scanf("%lu", &val) == 1) for (i=0; i<nrs; i++) if (val >= rs[i].lo && val <= rs[i].hi) { p1++; break; } for (i=0; i<nrs; i++) if (rs[i].lo) p2 += rs[i].hi - rs[i].lo + 1; printf("05: %lu %lu\n", p1, p2); }

