Coverage Summary for Class: Day04p2Kt (day04p2)
Class |
Method, %
|
Line, %
|
Day04p2Kt |
100%
(2/2)
|
100%
(2/2)
|
Day04p2Kt$toIntSet$1 |
100%
(1/1)
|
100%
(1/1)
|
Total |
100%
(3/3)
|
100%
(3/3)
|
package day04p2
data class PileOfScratchcards(val cards: List<Scratchcard>) {
fun countTotalNumberOfOwnedScratchcards(): Int {
val numOfCardsOwnedByEachCard = Array(cards.size) { 1 }
cards.forEachIndexed { i, card ->
val num = numOfCardsOwnedByEachCard[i]
for (j in i + 1 until i + 1 + card.numOfOwnedWinningNumbers) {
numOfCardsOwnedByEachCard[j] += num
}
}
return numOfCardsOwnedByEachCard.sum()
}
companion object {
fun from(raw: String): PileOfScratchcards =
PileOfScratchcards(raw.lineSequence().map { Scratchcard.from(it) }.toList())
}
}
data class Scratchcard(val id: Int, val winningNumbers: Set<Int>, val ownedNumbers: Set<Int>) {
val numOfOwnedWinningNumbers: Int = winningNumbers.intersect(ownedNumbers).size
companion object {
private val cardRegex = """Card \s*(\d+): (.+) \| (.+)""".toRegex()
fun from(raw: String): Scratchcard {
val (id, winningNumbers, ownedNumbers) = cardRegex
.matchEntire(raw)?.destructured ?: error("no match for $raw")
return Scratchcard(
id.toInt(),
winningNumbers.toIntSet(),
ownedNumbers.toIntSet()
)
}
}
}
private val intRegex = """(\d+)""".toRegex()
fun String.toIntSet(): Set<Int> =
intRegex.findAll(this).map { it.value.toInt() }.toSet()