From f4ad14a34ab000a9dcd5836a3774f387a77bda2b Mon Sep 17 00:00:00 2001 From: Drew Malzahn Date: Tue, 17 Feb 2026 19:46:35 -0500 Subject: [PATCH] Finish day 3 --- odin/day03/day03.odin | 438 ++++++++++++++++++++++++++++++++++++++++++ odin/day03/scratch.py | 9 + 2 files changed, 447 insertions(+) create mode 100644 odin/day03/day03.odin create mode 100644 odin/day03/scratch.py diff --git a/odin/day03/day03.odin b/odin/day03/day03.odin new file mode 100644 index 0000000..1c29e6b --- /dev/null +++ b/odin/day03/day03.odin @@ -0,0 +1,438 @@ +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 * len(sacks) + fmt.printf("Sacks: %d; Size: %d\n", len(sacks), size) + + counter := make([]int, size) + defer delete(counter) + + for idx in 0..