Day 9
This commit is contained in:
parent
c4d95222fc
commit
8ac1df5a0c
1 changed files with 101 additions and 0 deletions
101
d09/main.odin
Normal file
101
d09/main.odin
Normal file
|
|
@ -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)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue