updates
This commit is contained in:
91
2024/go/day17/day17.go
Normal file
91
2024/go/day17/day17.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package day17
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
"golang.org/x/exp/slices"
|
||||
|
||||
|
||||
"adventofcode2024/utils"
|
||||
|
||||
)
|
||||
|
||||
type Opcode int
|
||||
|
||||
const (
|
||||
adv Opcode = 0
|
||||
bxl Opcode = 1
|
||||
bst Opcode = 2
|
||||
jnx Opcode = 3
|
||||
bxc Opcode = 4
|
||||
out Opcode = 5
|
||||
bdv Opcode = 6
|
||||
cdv Opcode = 7
|
||||
|
||||
)
|
||||
|
||||
func Part1(input string) string {
|
||||
m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1)
|
||||
a := utils.MustAtoi(m[0])
|
||||
b := utils.MustAtoi(m[1])
|
||||
c := utils.MustAtoi(m[2])
|
||||
|
||||
var pgm []int
|
||||
json.Unmarshal([]byte("["+m[3]+"]"), &pgm)
|
||||
|
||||
fmt.Printf("%d %d %d %v\n", a, b, c, pgm)
|
||||
out := fmt.Sprint(run(a, b, c, pgm))
|
||||
out = fmt.Sprint(strings.Trim(strings.ReplaceAll(out, " ", ","), "[]"))
|
||||
return out
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
m := regexp.MustCompile(`[\d,]+`).FindAllString(input, -1)
|
||||
b := utils.MustAtoi(m[1])
|
||||
c := utils.MustAtoi(m[2])
|
||||
|
||||
var pgm []int
|
||||
json.Unmarshal([]byte("["+m[3]+"]"), &pgm)
|
||||
|
||||
fmt.Printf("%d %d %v\n", b, c, pgm)
|
||||
|
||||
a := 0
|
||||
for n := len(pgm) - 1; n >= 0; n-- {
|
||||
a <<= 3
|
||||
for !slices.Equal(run(a, b, c, pgm), pgm[n:]) {
|
||||
a++
|
||||
}
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func run(a, b, c int, pgm []int) (output []int) {
|
||||
for ip := 0; ip < len(pgm); ip += 2 {
|
||||
operand := pgm[ip+1]
|
||||
combo := []int{0, 1, 2, 3, a, b, c}[operand]
|
||||
|
||||
switch pgm[ip] {
|
||||
case int(adv):
|
||||
a >>= combo
|
||||
case int(bxl):
|
||||
b ^= operand
|
||||
case int(bst):
|
||||
b = combo % 8
|
||||
case int(jnx):
|
||||
if a != 0 {
|
||||
ip = operand - 2
|
||||
}
|
||||
case int(bxc):
|
||||
b ^= c
|
||||
case int(out):
|
||||
output = append(output, combo%8)
|
||||
case int(bdv):
|
||||
b = a >> combo
|
||||
case int(cdv):
|
||||
c = a >> combo
|
||||
}
|
||||
}
|
||||
return output
|
||||
}
|
||||
Reference in New Issue
Block a user