package main
import "core:log"
import "core:os"
import "core:slice"
import "core:strconv"
import "core:strings"
Input :: struct {
left: [dynamic]int,
right: [dynamic]int,
}
Result1 :: distinct int
Result2 :: distinct 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)
input.left = make([dynamic]int, 0, 10)
input.right = make([dynamic]int, 0, 10)
lines := strings.split_lines(string(raw_data))
defer delete(lines)
for line in lines {
left_end := strings.index_byte(line, ' ')
right_start := strings.last_index_byte(line, ' ')
if left_end == -1 || right_start == -1 {
continue
}
left := strconv.atoi(line[:left_end])
right := strconv.atoi(line[right_start + 1:])
append(&input.left, left)
append(&input.right, right)
}
return input
}
free_input :: proc(input: ^Input) {
delete(input.left)
delete(input.right)
}
// --- Input --- //
// --- Task 1 --- //
run_task1 :: proc(input: ^Input, debug: bool) -> Result1 {
result: Result1
if debug {
print_input(input)
}
left_slice := slice.clone(input.left[:])
right_slice := slice.clone(input.right[:])
defer delete(left_slice)
defer delete(right_slice)
slice.sort(left_slice)
slice.sort(right_slice)
distance: int
for i in 0 ..< len(left_slice) {
l, r := left_slice[i], right_slice[i]
if l < r {
l, r = r, l
}
distance += l - r
}
result = Result1(distance)
return result
}
print_result1 :: proc(result: ^Result1) {
log.infof("Task 1: %d", result^)
}
// --- Task 1 --- //
// --- Task 2 --- //
run_task2 :: proc(input: ^Input, debug: bool) -> Result2 {
result: Result2
if debug {
print_input(input)
}
similarity: int
for i in 0 ..< len(input.left) {
left := input.left[i]
count: int
for j in 0 ..< len(input.right) {
count += 1 if input.right[j] == left else 0
}
similarity += left * count
}
result = Result2(similarity)
return result
}
print_result2 :: proc(result: ^Result2) {
log.infof("Task 2: %d", result^)
}
// --- Task 2 --- //