From 8ac1df5a0ca7cf52e0d4be5c9724845a0be5a10c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20M=C3=A5rdbrink?= Date: Sun, 5 Oct 2025 20:42:55 +0200 Subject: [PATCH] Day 9 --- d09/main.odin | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 d09/main.odin diff --git a/d09/main.odin b/d09/main.odin new file mode 100644 index 0000000..989fed1 --- /dev/null +++ b/d09/main.odin @@ -0,0 +1,101 @@ +package main + +import "core:math" +import "core:slice" +import "core:strconv" +import "core:strings" +import "core:bytes" +import "core:fmt" +import "core:os" + +import "../util" + +PREAMBLE_LEN :: 25 + +is_sum_of_two :: proc(target_number: i64, numbers: []i64) -> bool { + for num1, idx in numbers { + for num2 in numbers[idx+1:] { + if num1 + num2 == target_number do return true + } + } + + return false +} + +part_1 :: proc(lines: []string) { + result: i64 = 0 + + numbers := make([]i64, len(lines)) + + for line, idx in lines { + ok: bool + numbers[idx], ok = strconv.parse_i64(line); assert(ok) + } + + idx := PREAMBLE_LEN + for number in numbers[PREAMBLE_LEN:] { + if !is_sum_of_two(number, numbers[idx-PREAMBLE_LEN:idx]) { + result = number + break + } + idx += 1 + } + + fmt.printfln("Part 1: %d", result) +} + +part_2 :: proc(lines: []string) { + result: i64 = 0 + + numbers := make([]i64, len(lines)) + + for line, idx in lines { + ok: bool + numbers[idx], ok = strconv.parse_i64(line); assert(ok) + } + + invalid_number: i64 + idx := PREAMBLE_LEN + for number in numbers[PREAMBLE_LEN:] { + if !is_sum_of_two(number, numbers[idx-PREAMBLE_LEN:idx]) { + invalid_number = number + break + } + idx += 1 + } + + min_idx: i64 = 0 + max_idx: i64 = 0 + outer: for _ in numbers { + contiguous_sum: i64 = 0 + max_idx = min_idx + for num in numbers[min_idx:] { + contiguous_sum += num + if contiguous_sum == invalid_number { + max := slice.max(numbers[min_idx:max_idx+1]) + min := slice.min(numbers[min_idx:max_idx+1]) + result = max + min + break outer + } else if contiguous_sum > invalid_number { + break + } + max_idx += 1 + } + min_idx += 1 + } + + + fmt.printfln("Part 2: %d", 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] + + part_1(lines) + part_2(lines) +}