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) }