package day03 import "core:fmt"; // Lowercase item types a through z have priorities 1 through 26. // Uppercase item types A through Z have priorities 27 through 52. BOUND_a := int('a') BOUND_z := int('z') BOUND_A := int('A') BOUND_Z := int('Z') priority :: proc(item: rune) -> int { item_ := int(item) n : int; if BOUND_a <= item_ && item_ <= BOUND_z { // Map to range [25, 0] n = BOUND_z - item_ // Reverse range to [0, 25] m := 25 - n // Map to range [1, 26] return m + 1 } else if BOUND_A <= item_ && item_ <= BOUND_Z { // Map to range [25, 0] n = BOUND_Z - item_ // Reverse range to [0, 25] m := 25 - n // Map to range [27, 52] return m + 27 } else { return -1 } } prio_to_rune :: proc(prio: int) -> rune { if 1 <= prio && prio <= 26 { return rune(BOUND_a + prio) } if 27 <= prio && prio <= 52 { return rune(BOUND_A + prio) } return 0 } sum_rucksack :: proc(sack: string) -> int { counter := make([]int, 52) defer delete(counter) for idx in 0..<52 { counter[idx] = 0 } total := 0 midpoint := len(sack) / 2 for chr, idx in sack { prio := priority(chr) if prio < 0 { return -1 // TODO handle error better } index := prio - 1 if idx < midpoint { counter[index] += 1 } else { if counter[index] > 0 { fmt.printf("Adding %c (%d)\n", chr, prio) counter[index] = -1 total += prio } } } return total } find_common_item :: proc(sacks: []string) -> int { size := 52 counter := make([]int, size) // Dynamic array initialized to all 0 defer delete(counter) // Clean up memory when it goes out of scope // Compute the max value for a counter max_counter := 0 idx : u32 = 0 for _ in 0..