package day_02
import "core:fmt"
import "core:log"
import "core:os"
import "core:strconv"
import "core:strings"
Input :: struct {
ranges: [][2]int,
}
Result1 :: int
Result2 :: int
// --- Input --- //
print_input :: proc(input: Input) {
log.infof("%v", input)
}
parse_input_file :: proc(filepath: string) -> Input {
input: Input
raw_data, ok := os.read_entire_file_from_filename(filepath)
if !ok {
panic("oh no, could not read file")
}
defer delete(raw_data)
line := strings.trim_space(string(raw_data))
ranges := strings.split(line, ",")
defer delete(ranges)
input.ranges = make([][2]int, len(ranges))
for range, i in ranges {
values := strings.split(range, "-")
defer delete(values)
a := strconv.parse_int(values[0]) or_else 0
b := strconv.parse_int(values[1]) or_else 0
input.ranges[i] = {a, b}
}
return input
}
free_input :: proc(input: ^Input) {
delete(input.ranges)
}
// --- Input --- //
// --- Helpers --- //
// --- Helpers --- //
// --- Task 1 --- //
run_task1 :: proc(input: Input) -> Result1 {
result: Result1
for range in input.ranges {
for i in range[0] ..= range[1] {
val := fmt.tprintf("%d", i)
if len(val) % 2 != 0 {
continue
}
lh := val[:len(val) / 2]
rh := val[len(val) / 2:]
if lh == rh {
result += i
}
}
}
return result
}
print_result1 :: proc(result: Result1) {
log.infof("Task 1: %d", result)
}
// --- Task 1 --- //
// --- Task 2 --- //
run_task2 :: proc(input: Input) -> Result2 {
result: Result2
for range in input.ranges {
log.debugf("%v", range)
for i in range[0] ..= range[1] {
val := fmt.tprintf("%d", i)
half := len(val) / 2
skip: for j in 1 ..= half {
if len(val) % j != 0 {
continue
}
for t in 1 ..= j {
if len(val) % t != 0 {
continue
}
seq := val[0:t]
expected := len(val) / t
count := strings.count(val, seq)
if count == expected {
log.debugf("found %d", i)
result += i
break skip
}
}
}
}
}
return result
}
print_result2 :: proc(result: Result2) {
log.infof("Task 2: %d", result)
}
// --- Task 2 --- //
run :: proc() {
input := parse_input_file("input/day_02.txt")
defer free_input(&input)
result1 := run_task1(input)
print_result1(result1)
result2 := run_task2(input)
print_result2(result2)
}