|
| 1 | +package y25 |
| 2 | + |
| 3 | +import common.puzzle.solvePuzzle |
| 4 | +import common.puzzle.Input |
| 5 | +import common.puzzle.Puzzle |
| 6 | +import common.datastructures.* |
| 7 | +import common.ext.* |
| 8 | +import common.util.* |
| 9 | +import java.util.* |
| 10 | +import kotlin.math.* |
| 11 | +import kotlin.system.exitProcess |
| 12 | + |
| 13 | + |
| 14 | +fun main() = solvePuzzle(year = 2025, day = 2) { Day2(it) } |
| 15 | + |
| 16 | +class Day2(val input: Input) : Puzzle { |
| 17 | + data class Range(val start: Long, val end: Long) |
| 18 | + |
| 19 | + private val ranges = input.string.split(",").map { range -> |
| 20 | + val (start, end) = range.split("-") |
| 21 | + Range(start.toLong(), end.toLong()) |
| 22 | + } |
| 23 | + |
| 24 | + private fun Range.invalidIds(): List<Long> { |
| 25 | + val invalidIds = mutableListOf<Long>() |
| 26 | + var half = start.toString(10).let { str -> |
| 27 | + val halfLen = str.length / 2 |
| 28 | + if (halfLen > 0) { |
| 29 | + str.take(halfLen) |
| 30 | + } else { |
| 31 | + "0" |
| 32 | + } |
| 33 | + } |
| 34 | + while (true) { |
| 35 | + val full = "$half$half".toLong() |
| 36 | + if (full > end) { |
| 37 | + return invalidIds |
| 38 | + } |
| 39 | + if (full >= start) { |
| 40 | + invalidIds.add(full) |
| 41 | + } |
| 42 | + half = (half.toLong() + 1).toString() |
| 43 | + } |
| 44 | + } |
| 45 | + |
| 46 | + private fun Range.invalidIds2(): Set<Long> { |
| 47 | + val invalidIds = mutableSetOf<Long>() |
| 48 | + var base = "1" |
| 49 | + while (true) { |
| 50 | + var sequence = "$base$base" |
| 51 | + if (sequence.toLong() > end) { |
| 52 | + return invalidIds |
| 53 | + } |
| 54 | + |
| 55 | + while (true) { |
| 56 | + val longValue = sequence.toLong() |
| 57 | + if (longValue > end) { |
| 58 | + break |
| 59 | + } |
| 60 | + if (longValue >= start) { |
| 61 | + invalidIds += longValue |
| 62 | + } |
| 63 | + sequence += base |
| 64 | + } |
| 65 | + |
| 66 | + base = (base.toLong() + 1).toString() |
| 67 | + } |
| 68 | + } |
| 69 | + |
| 70 | + override fun solveLevel1(): Any { |
| 71 | + return ranges.sumOf { range -> |
| 72 | + range.invalidIds().sum() |
| 73 | + } |
| 74 | + } |
| 75 | + |
| 76 | + override fun solveLevel2(): Any { |
| 77 | + return ranges.sumOf { range -> |
| 78 | + range.invalidIds2().sum() |
| 79 | + } |
| 80 | + } |
| 81 | +} |
0 commit comments