Files
advent-of-code-2025/cmd/10/machine/machine.go
T

118 lines
2.4 KiB
Go

// Package machine defines a model for a machine and methods to manipulate it.
package machine
import (
"math"
"regexp"
"slices"
"strconv"
"strings"
"github.com/StevanFreeborn/advent-of-code-2025/cmd/10/button"
)
type Machine interface {
ConfigureLights() int
}
type machine struct {
desiredLightState []bool
buttons []button.Button
desiredJoltages []int
}
func From(line string) Machine {
parts := strings.Split(line, " ")
lastPartIndex := len(parts) - 1
lightDiagramPart := parts[0]
desiredLightState := []bool{}
for _, c := range lightDiagramPart {
if c == '.' {
desiredLightState = append(desiredLightState, false)
}
if c == '#' {
desiredLightState = append(desiredLightState, true)
}
}
buttonsPart := parts[1:lastPartIndex]
buttons := []button.Button{}
for _, bs := range buttonsPart {
b := button.From(bs)
buttons = append(buttons, b)
}
joltagesPart := parts[lastPartIndex]
desiredJoltages := []int{}
joltageRegex := regexp.MustCompile(`\d+`)
matches := joltageRegex.FindAllString(joltagesPart, -1)
for _, m := range matches {
num, _ := strconv.Atoi(m)
desiredJoltages = append(desiredJoltages, num)
}
return machine{
desiredLightState: desiredLightState,
buttons: buttons,
desiredJoltages: desiredJoltages,
}
}
func (m machine) ConfigureLights() int {
combinations := [][]bool{}
minPresses := math.MaxInt
numberOfButtons := len(m.buttons)
numberOfCombinations := int(math.Pow(2, float64(numberOfButtons)))
currentCombination := make([]bool, numberOfButtons)
for range numberOfCombinations {
temp := make([]bool, numberOfButtons)
copy(temp, currentCombination)
combinations = append(combinations, temp)
for j := range numberOfButtons {
if currentCombination[j] == false {
currentCombination[j] = true
break
} else {
currentCombination[j] = false
}
}
}
for _, currentCombination := range combinations {
currentPresses := 0
initialLightState := make([]bool, len(m.desiredLightState))
for bi, bs := range currentCombination {
if bs == false {
continue
}
currentPresses++
switchesToToggle := m.buttons[bi].Switches()
for _, switchToToggle := range switchesToToggle {
initialLightState[switchToToggle] = !initialLightState[switchToToggle]
}
}
if slices.Equal(initialLightState, m.desiredLightState) == false {
continue
}
if currentPresses < minPresses {
minPresses = currentPresses
}
}
return minPresses
}