feat: solve part one using brute-force
This commit is contained in:
91
internal/2025/DayTen/code.go
Normal file
91
internal/2025/DayTen/code.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package dayten
|
||||
|
||||
import (
|
||||
"advent-of-code/internal/registry"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.Register("2025D10", ParseInput, PartOne, PartTwo)
|
||||
}
|
||||
|
||||
func ParseInput(filepath string) []string {
|
||||
content, _ := os.ReadFile(filepath)
|
||||
return strings.Split(string(content), "\n")
|
||||
}
|
||||
|
||||
func parseMachine(line string) ([]bool, [][]int) {
|
||||
bracketRegex := regexp.MustCompile(`\[([.#]+)\]`)
|
||||
parenthesisRegex := regexp.MustCompile(`\(([^)]+)\)`)
|
||||
|
||||
bracketMatch := bracketRegex.FindStringSubmatch(line)
|
||||
targetString := bracketMatch[1]
|
||||
target := make([]bool, len(targetString))
|
||||
for idx, char := range targetString {
|
||||
target[idx] = char == '#'
|
||||
}
|
||||
|
||||
parenthesisMatches := parenthesisRegex.FindAllStringSubmatch(line, -1)
|
||||
buttons := make([][]int, 0, len(parenthesisMatches))
|
||||
|
||||
for _, match := range parenthesisMatches {
|
||||
buttonString := match[1]
|
||||
parts := strings.Split(buttonString, ",")
|
||||
button := make([]int, 0, len(parts))
|
||||
for _, part := range parts {
|
||||
light, _ := strconv.Atoi(part)
|
||||
button = append(button, light)
|
||||
}
|
||||
buttons = append(buttons, button)
|
||||
}
|
||||
|
||||
return target, buttons
|
||||
}
|
||||
|
||||
func PartOne(data []string) int {
|
||||
total := 0
|
||||
for _, line := range data {
|
||||
target, buttons := parseMachine(line)
|
||||
numberOfLights := len(target)
|
||||
numberOfButtons := len(buttons)
|
||||
minimumPresses := numberOfButtons + 1
|
||||
|
||||
for mask := 0; mask < (1 << numberOfButtons); mask++ {
|
||||
lights := make([]bool, numberOfLights)
|
||||
presses := 0
|
||||
|
||||
for buttonIdx := range numberOfButtons {
|
||||
if mask&(1<<buttonIdx) != 0 {
|
||||
presses++
|
||||
for _, light := range buttons[buttonIdx] {
|
||||
if light < numberOfLights {
|
||||
lights[light] = !lights[light]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
matches := true
|
||||
for idx := range numberOfLights {
|
||||
if lights[idx] != target[idx] {
|
||||
matches = false
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if matches && presses < minimumPresses {
|
||||
minimumPresses = presses
|
||||
}
|
||||
}
|
||||
total += minimumPresses
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func PartTwo(data []string) int {
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user