Files
advent-of-code/internal/2025/DayTwo/code.go

88 lines
2.1 KiB
Go

package daytwo
import (
"os"
"strconv"
"strings"
"advent-of-code/internal/registry"
)
func init() {
registry.Register("2025D2", ParseInput, PartOne, PartTwo)
}
func ParseInput(filepath string) []string {
content, _ := os.ReadFile(filepath)
return strings.Split(strings.TrimSpace(string(content)), "\n")
}
func PartOne(input []string) int {
sum := 0
for _, line := range input {
for newRange := range strings.SplitSeq(line, ",") {
parts := strings.Split(newRange, "-")
start, _ := strconv.Atoi(parts[0])
end, _ := strconv.Atoi(parts[1])
for id := start; id <= end; id++ {
sID := strconv.Itoa(id)
if len(sID)%2 == 0 {
half := len(sID) / 2
if sID[:half] == sID[half:] {
sum += id
}
}
}
}
}
return sum
}
func PartTwo(input []string) int {
totalSum := 0
for _, line := range input {
for rangeSpec := range strings.SplitSeq(line, ",") {
rangeStartStr, rangeEndStr, _ := strings.Cut(rangeSpec, "-")
rangeStart, _ := strconv.Atoi(rangeStartStr)
rangeEnd, _ := strconv.Atoi(rangeEndStr)
seenNumbers := make(map[int]bool)
maxDigits := len(rangeEndStr)
var generatePatterns func(string, int, int)
generatePatterns = func(currentPattern string, targetPatternLength, currentDepth int) {
if currentDepth == targetPatternLength {
repeated := currentPattern + currentPattern
for len(repeated) <= maxDigits {
number, err := strconv.Atoi(repeated)
if err != nil || number > rangeEnd {
break
}
if number >= rangeStart && !seenNumbers[number] {
totalSum += number
seenNumbers[number] = true
}
repeated += currentPattern
}
return
}
minDigit := 0
if currentDepth == 0 {
minDigit = 1
}
for digit := minDigit; digit <= 9; digit++ {
extendedPattern := currentPattern + strconv.Itoa(digit)
generatePatterns(extendedPattern, targetPatternLength, currentDepth+1)
}
}
for patternLength := 1; patternLength <= maxDigits/2; patternLength++ {
generatePatterns("", patternLength, 0)
}
}
}
return totalSum
}