Nim
Easy one today. Part 2 is pretty forgiving on performance, so regex bruteforce was only a couple seconds . But eventually I've cleaned it up and did a solution that runs in ~340 ms.
type
AOCSolution[T,U] = tuple[part1: T, part2: U]
proc isRepeating(str:string, sectorLength=1): bool =
if str.len mod sectorLength != 0: return false
for i in countUp(0, str.len - sectorLength, sectorLength):
if str.toOpenArray(i, i+sectorLength-1) != str.toOpenArray(0, sectorLength-1):
return false
true
proc solve(input: string): AOCSolution[int, int] =
let ranges = input.split(',').mapIt:
let parts = it.split('-')
(parseInt parts[0], parseInt parts[1])
for (a, b) in ranges:
for num in a .. b:
if num < 10: continue
let strnum = $num
let half = strnum.len div 2
for i in countDown(half, 1):
if strnum.isRepeating(i):
if i == half and strnum.len mod 2 == 0:
result.part1 += num
result.part2 += num
break
Full solution at Codeberg: solution.nim