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+1
Full solution at Codeberg: solution.nim