Files
aoc2025odin/day2/day2.odin
2025-12-05 22:51:17 -05:00

97 lines
2.4 KiB
Odin

package day2
import "core:mem"
import os "core:os"
import "core:strconv"
import "core:strings"
import "core:testing"
import "../utils"
sample :: `11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124`
solve_first :: proc(s: string) -> (result: u64) {
s := s
buf: [100]u8
for line in strings.split_iterator(&s, ",") {
hyphen_index := strings.index_rune(line, '-')
start_str := line[:hyphen_index]
start, _ := strconv.parse_u64(start_str)
end_str := line[hyphen_index + 1:]
end, _ := strconv.parse_u64(end_str)
for n in start ..= end {
str := strconv.write_uint(buf[:], n, 10)
defer mem.zero_slice(buf[:])
if len(str) % 2 != 0 do continue
half_len := len(str) / 2
first_half := str[:half_len]
second_half := str[half_len:]
if first_half == second_half {
result += n
}
}
}
return
}
@(test)
solve_first_sample :: proc(t: ^testing.T) {
testing.expect_value(t, solve_first(sample), 1227775554)
}
@(test)
solve_first_input :: proc(t: ^testing.T) {
content := utils.read_file("day2/input.txt")
defer delete(content)
testing.expect_value(t, solve_first(content), 21898734247)
}
solve_second :: proc(s: string) -> (result: u64) {
s := s
buf: [100]u8
for line in strings.split_iterator(&s, ",") {
hyphen_index := strings.index_rune(line, '-')
start_str := line[:hyphen_index]
start, _ := strconv.parse_u64(start_str)
end_str := line[hyphen_index + 1:]
end, _ := strconv.parse_u64(end_str)
for n in start ..= end {
str := strconv.write_uint(buf[:], n, 10)
defer mem.zero_slice(buf[:])
for i := 1; i <= len(str) / 2; i += 1 {
if len(str) % i != 0 do continue
first := str[:i]
found := true
for j := i * 2; j <= len(str); j += i {
second := str[j - i:j]
if first != second {
found = false
break
}
}
if found {
result += n
break
}
}
}
}
return
}
@(test)
solve_second_sample :: proc(t: ^testing.T) {
testing.expect_value(t, solve_second(sample), 4174379265)
}
@(test)
solve_second_input :: proc(t: ^testing.T) {
content := utils.read_file("day2/input.txt")
defer delete(content)
testing.expect_value(t, solve_second(content), 28915664389)
}