Coverage Summary for Class: Day06p1Kt (day06p1)

Class Method, % Line, %
Day06p1Kt 100% (3/3) 100% (11/11)
Day06p1Kt$toIntList$1 100% (1/1) 100% (1/1)
Total 100% (4/4) 100% (12/12)


 package day06p1
 
 private val intRegex = """(\d+)""".toRegex()
 fun String.toIntList(): List<Int> =
   intRegex.findAll(this).map { it.value.toInt() }.toList()
 
 fun String.toRecords(): Records {
   val lines = lines()
   require(lines.size == 2) { lines.size }
   val raceDurations = lines[0].toIntList()
   val recordDistances = lines[1].toIntList()
   require(raceDurations.size == recordDistances.size)
   return Records(
     raceDurations.zip(recordDistances)
       .map { (raceDuration, recordDistance) -> Record(raceDuration, recordDistance) }
       .toSet()
   )
 }
 
 data class Records(val records: Set<Record>) {
   fun productOfNumberOfWaysToBeatRecord(): Int =
     records.asSequence().map { it.calcNumberOfWaysToBeatRecord() }.reduce { acc, i -> acc * i }
 }
 
 data class Record(val raceDuration: Int, val recordDistance: Int) {
   fun calcDistance(buttonHoldTime: Int): Int = buttonHoldTime * (raceDuration - buttonHoldTime)
   fun calcNumberOfWaysToBeatRecord(): Int = (0..raceDuration).count { calcDistance(it) > recordDistance }
 }