First I tried to to part 2 with a very poor regex strategy and the performance was abysmal. Switched to plain substrings and boom, instant result.
Golang
func part1() {
ranges := readInput()
invalidSum := 0
for _, r := range ranges {
parts := strings.Split(r, "-")
start, _ := strconv.Atoi(parts[0])
end, _ := strconv.Atoi(parts[1])
for num := start; num <= end; num++ {
current := strconv.Itoa(num)
n := len(current)
if n%2 != 0 {
continue
}
left := current[:n/2]
right := current[n/2:]
if left == right {
invalidSum += num
}
}
}
fmt.Println(invalidSum)
}
func part2() {
ranges := readInput()
invalidSum := 0
for _, r := range ranges {
parts := strings.Split(r, "-")
start, _ := strconv.Atoi(parts[0])
end, _ := strconv.Atoi(parts[1])
for num := start; num <= end; num++ {
current := strconv.Itoa(num)
n := len(current)
for index := 1; index <= n/2; index++ {
if n%index != 0 {
continue
}
left := 0
right := index
prefix := current[left:right]
isRepeated := true
for left < n && right < n {
left = right
right = right + index
next := current[left:right]
if next != prefix {
isRepeated = false
break
}
}
if isRepeated {
invalidSum += num
break
}
}
}
}
fmt.Println(invalidSum)
}