package main import ( "fmt" "regexp" "strconv" "strings" "git.mstar.dev/mstar/aoc24/util" "git.mstar.dev/mstar/goutils/other" ) var mulRegex = regexp.MustCompile(`mul\((\d+),(\d+)\)`) var doDontMulRegex = regexp.MustCompile(`mul\(\d+,\d+\)|do\(\)|don't\(\)`) func dissectInstruction(inst string) int { stringElems := strings.TrimSuffix(strings.TrimPrefix(inst, "mul("), ")") elems := strings.Split(stringElems, ",") left := other.Must(strconv.Atoi(elems[0])) right := other.Must(strconv.Atoi(elems[1])) return left * right } func main() { data := util.LoadFileFromArgs() matches := mulRegex.FindAllString(string(data), -1) acc := 0 for _, match := range matches { acc += dissectInstruction(match) } fmt.Printf("Part 1: %d\n", acc) doDontMatches := doDontMulRegex.FindAllString(string(data), -1) acc2 := 0 active := true for _, match := range doDontMatches { switch { case strings.HasPrefix(match, "don't()"): active = false case strings.HasPrefix(match, "do()"): active = true default: if active { acc2 += dissectInstruction(match) } } } fmt.Printf("Part 2: %d\n", acc2) }