Advertisement
Guest User

Untitled

a guest
Dec 12th, 2023
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.07 KB | Source Code | 0 0
  1.     @Test
  2.     fun part1() {
  3.         val total = input.map {
  4.             SpringLine(it).numberOfOptions()
  5.         }.sum()
  6.         println("Part 1: $total")
  7.     }
  8.  
  9.     @Test
  10.     fun part2() {
  11.         var count = 0
  12.         val total = input.map {
  13.             SpringLine(it, 5).numberOfOptions()
  14.         }.sum()
  15.         println("Part 2: $total")
  16.     }
  17.  
  18. class SpringLine(val line: String, repeated: Int = 1) {
  19.     private val springs = Array(repeated) { line.split(" ")[0] }.joinToString("?")
  20.     private val hints = Array(repeated) { line.split(" ")[1] }.joinToString(",").split(",").map(String::toInt)
  21.     private val knownBroken = springs.indices.filter { springs[it] == '#' }
  22.  
  23.     private val cache = mutableMapOf<String, Long>()
  24.     fun numberOfOptions(hintIndex: Int = 0, startIndex: Int = 0, ranges: List<IntRange> = emptyList()): Long {
  25.         val key = "$hintIndex-$startIndex"
  26.         cache[key]?.let { return it }
  27.         if (hintIndex == hints.size) return 0
  28.         val minLength = hints.subList(hintIndex, hints.size).sum() + hints.size - hintIndex - 1
  29.         val rightBound = springs.length - minLength
  30.         if (startIndex > rightBound) return 0
  31.        
  32.         val endIndex = startIndex + hints[hintIndex]
  33.         val possibleWorkingSprings = springs.substring(startIndex, endIndex)
  34.         val options = if (
  35.             possibleWorkingSprings.all { it == '#' || it == '?' } &&
  36.             (startIndex == 0 || springs[startIndex - 1] != '#') &&
  37.             (endIndex == springs.length || springs[endIndex] != '#')
  38.         ) {
  39.             val possibleRanges = ranges + listOf(startIndex until endIndex)
  40.             (if (hintIndex == hints.size - 1
  41.                 && knownBroken.all {brokenSpring -> possibleRanges.any { brokenSpring in it } })
  42.                 1 else 0) + numberOfOptions(
  43.                 hintIndex + 1,
  44.                 endIndex + 1,
  45.                 possibleRanges
  46.             )
  47.         } else 0
  48.         val total = options + numberOfOptions(hintIndex, startIndex + 1, ranges)
  49.         cache[key] = total
  50.         return total
  51.     }
  52. }
Tags: adventofcode
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement