vbe_elvis

2021 Day4

Dec 4th, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.23 KB | None | 0 0
  1. class Bingo(numbersToCall: String, bingoCards:String) {
  2.     private val numbersToCall = numbersToCall.split(",").map { it.toInt() }
  3.     private val bingoCards = bingoCards.replace("\n ", "\n").replace("  ", " ")
  4.         .split("\n\n")
  5.         .map { card -> BingoCard(
  6.              card.split("\n")
  7.             .map { row -> row.split(" ")
  8.             .map { number -> number.toInt() } }
  9.         )}
  10.  
  11.     fun play(): Int {
  12.         val calledNumbers = numbersToCall.takeWhile { number -> !bingoCards.any { card -> card.call(number) } }
  13.         val lastCalledNumber = numbersToCall[calledNumbers.size]
  14.         val cardThatWon = bingoCards.first { it.hasWon() }
  15.         return lastCalledNumber * cardThatWon.sumOfNotCalled(calledNumbers + lastCalledNumber)
  16.     }
  17.  
  18.     fun biggestLoser(): Int{
  19.         val calledNumbers = numbersToCall.takeWhile { number ->
  20.             bingoCards.count { card -> card.call(number) } < (bingoCards.size - 1)
  21.         }
  22.         val worstBingoCard = bingoCards.first { !it.hasWon() }
  23.         val worstCalledNumbers = numbersToCall.subList(calledNumbers.size, numbersToCall.size)
  24.             .takeWhile { number -> !worstBingoCard.call(number) }
  25.         val lastCalledNumber = numbersToCall[calledNumbers.size + worstCalledNumbers.size]
  26.         return worstBingoCard.sumOfNotCalled(calledNumbers + worstCalledNumbers + lastCalledNumber) * lastCalledNumber
  27.     }
  28. }
  29.  
  30. class BingoCard (rows: List<List<Int>>) {
  31.     private val cardNumbers = (0 until rows.size).fold(HashMap<Int, Pair<Int, Int>>()) {
  32.             acc, x -> (0 until rows.size).forEach { y -> acc[rows[x][y]] = (x to y) }
  33.         acc
  34.     }.toMap()
  35.  
  36.     private val rowCounts = Array<Int>(rows.size) {0}
  37.     private val columnCounts =  Array<Int>(rows.size) {0}
  38.  
  39.     fun call(number: Int): Boolean {
  40.         if (hasWon()) return true
  41.         if (!cardNumbers.containsKey(number) ) return false
  42.         return (rowCounts[cardNumbers[number]?.first!!]++ == rowCounts.size-1
  43.                 || columnCounts[cardNumbers[number]?.second!!]++ == rowCounts.size-1)
  44.     }
  45.  
  46.     fun sumOfNotCalled(calledNumbers:List<Int>) = cardNumbers.keys.filter { !calledNumbers.contains(it)  }.sum()
  47.     fun hasWon() = rowCounts.any { it >= 5 } || columnCounts.any { it >= 5 }
  48. }
Add Comment
Please, Sign In to add comment