@AoKSolution object Day02ChunkGeneration : PuzDSL({ fun Long.digits(): Int = log10(toDouble()).inc().toInt() val pow10 = LongArray(12) { 10.0.pow(it).toLong() } fun LongRange.sumInvalidIds(maxChunks: Int = endInclusive.digits()): Long { val seen = mutableSetOf() var sum = 0L fun visitRange(start: Long, end: Long) { val len = start.digits() for (chunks in 2..maxChunks) { if (len % chunks != 0) continue val chunkLen = len / chunks val chunkShift = pow10[chunkLen] val prefixShift = pow10[len - chunkLen] val startPrefix = start / prefixShift val endPrefix = end / prefixShift for (chunk in startPrefix..endPrefix) { var invalid = chunk repeat(chunks - 1) { invalid *= chunkShift invalid += chunk } if (invalid in start..end && seen.add(invalid)) sum += invalid } } } var start = start while (start < endInclusive) { val end = pow10[start.digits()] if (end <= endInclusive) visitRange(start, end - 1) else visitRange(start, endInclusive) start = end } return sum } val ranges = Parser { input.split(",", "-") .chunked(2) { (start, end) -> (start.toLong()..end.toLong()) } } part1(ranges) { ranges -> ranges.sumOf { it.sumInvalidIds(maxChunks = 2) } } part2(ranges) { ranges -> ranges.sumOf { it.sumInvalidIds() } } })