package main import ( "fmt" "regexp" "aoc/helper" ) func main() { corruptedMemory := helper.ReadLinesToString() // part 1 instructions_result := findAndExecuteInstructions(corruptedMemory) fmt.Printf("Result: %d\n", instructions_result) // part 2 enabled_instructions_result := findAndExecuteEnabledInstructions(corruptedMemory) fmt.Printf("Result (only enabled): %d\n", enabled_instructions_result) } func findAndExecuteInstructions(memory string) (res int) { // find all `mul()` and save numbers as MatchGroup 1 + 2 re := regexp.MustCompile(`mul\((\d{1,3}),(\d{1,3})\)`) instructions := re.FindAllStringSubmatch(memory, -1) for _, inst := range instructions { res += helper.ToInt(inst[1]) * helper.ToInt(inst[2]) } return res } func findAndExecuteEnabledInstructions(memory string) (res int) { // find all `mul()` and save numbers as MatchGroup 1 + 2 // save `do()` and `dont()` in MatchGroup 0 re := regexp.MustCompile(`mul\((\d{1,3}),(\d{1,3})\)|do\(\)|don't\(\)`) instructions := re.FindAllStringSubmatch(memory, -1) enabled := true for _, inst := range instructions { switch inst[0] { case "do()": enabled = true case "don't()": enabled = false default: if enabled { res += helper.ToInt(inst[1]) * helper.ToInt(inst[2]) } } } return res }