package day_03 import "core:log" import "core:os" import "core:strings" Input :: struct { bank_len: int, banks: [][]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) lines, err := strings.split_lines(strings.trim_right_space(string(raw_data))) if err != .None { panic("oh no, failed splitting into lines") } defer delete(lines) input.banks = make([][]int, len(lines)) for line, i in lines { if input.bank_len == 0 { input.bank_len = len(line) } bank := make([]int, input.bank_len) for c, j in line { bank[j] = int(c - '0') } input.banks[i] = bank } return input } free_input :: proc(input: ^Input) { for bank in input.banks { delete(bank) } delete(input.banks) } // --- Input --- // // --- Helpers --- // // --- Helpers --- // // --- Task 1 --- // run_task1 :: proc(input: Input) -> Result1 { result: Result1 for bank in input.banks { a, b: int ai: int for level, i in bank[:len(bank) - 1] { if level > a { a = level ai = i } } for level in bank[ai + 1:] { if level > b { b = level } } result += (a * 10) + b } 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 bank in input.banks { to_remove := input.bank_len - 12 stack := make([]int, input.bank_len) defer delete(stack) stack_i: int for level in bank { for stack_i > 0 && to_remove > 0 && stack[stack_i - 1] < level { stack_i -= 1 stack[stack_i] = 0 to_remove -= 1 } stack[stack_i] = level stack_i += 1 } log.debugf("%v", stack) if to_remove > 0 { log.debugf("has leftovers") } smashed_stack: int for i in stack[:12] { smashed_stack = (smashed_stack * 10) + i } result += smashed_stack } return result } print_result2 :: proc(result: Result2) { log.infof("Task 2: %d", result) } // --- Task 2 --- // run :: proc() { input := parse_input_file("input/day_03.txt") defer free_input(&input) result1 := run_task1(input) print_result1(result1) result2 := run_task2(input) print_result2(result2) }