This commit is contained in:
Hugo Mårdbrink 2025-12-06 00:07:50 +01:00
parent f7de9624d7
commit c5154ad556

104
d05/main.odin Normal file
View file

@ -0,0 +1,104 @@
package main
import "core:math/linalg"
import "core:container/queue"
import "core:fmt"
import "core:math"
import "core:os"
import "core:slice"
import "core:strconv"
import "core:strings"
import "core:time"
import "core:unicode/utf8"
import util "../util"
Range :: struct {
low: int,
high: int,
}
in_range_inclusive :: proc(a, l, h: $T) -> bool {
return a >= l && a <= h
}
part_1 :: proc(lines: []string) {
result := 0
split_idx, _ := slice.linear_search(lines, "")
ranges, ids := slice.split_at(lines, split_idx)
fresh_ranges, _ := slice.mapper(ranges, proc(range: string) -> Range {
parts := strings.split(range, "-")
low, _ := strconv.parse_int(parts[0])
high, _ := strconv.parse_int(parts[1])
return Range{low = low, high = high}
})
ing_ids, _ := slice.mapper(ids, proc(id: string) -> int {
ing_id, _ := strconv.parse_int(id)
return ing_id
})
for id in ing_ids {
for r in fresh_ranges {
if in_range_inclusive(id, r.low, r.high) {
result += 1
break
}
}
}
fmt.printfln(" [Result] %v", result)
}
part_2 :: proc(lines: []string) {
result := 0
split_idx, _ := slice.linear_search(lines, "")
ranges, _ := slice.split_at(lines, split_idx)
fresh_ranges, _ := slice.mapper(ranges, proc(range: string) -> Range {
parts := strings.split(range, "-")
low, _ := strconv.parse_int(parts[0])
high, _ := strconv.parse_int(parts[1])
return Range{low = low, high = high}
})
slice.sort_by(fresh_ranges, proc(a, b: Range) -> bool {
return a.low < b.low
})
current := fresh_ranges[0]
for i in 1..<len(fresh_ranges) {
r := fresh_ranges[i]
if r.low <= current.high + 1 {
current.high = max(current.high, r.high)
} else {
result += current.high - current.low + 1
current = r
}
}
result += current.high - current.low + 1
fmt.printfln(" [Result] %v", result)
}
main :: proc() {
context.allocator = context.temp_allocator
defer free_all(context.temp_allocator)
INPUT :: #load("input.txt", string)
lines := strings.split(INPUT, "\n")
lines = lines[:len(lines) - 1]
fmt.println("[Part 1]")
start := time.tick_now()
part_1(lines)
duration := time.tick_diff(start, time.tick_now())
fmt.printfln(" [Time] %vms\n", time.duration_milliseconds(duration))
fmt.printfln("[Part 2]")
start = time.tick_now()
part_2(lines)
duration = time.tick_diff(start, time.tick_now())
fmt.printfln(" [Time] %vms", time.duration_milliseconds(duration))
}