vbe_elvis

2021 Day3

Dec 3rd, 2021 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.40 KB | None | 0 0
  1. class BinaryDiagnostic(data: List<String>) {
  2.     /* Part 1 */
  3.     private val gamma = commonBit(data, '1', '0').toInt(2)
  4.     private val epsilon = commonBit(data, '0', '1').toInt(2)
  5.     val powerConsumption = gamma * epsilon
  6.  
  7.     private fun commonBit(data: List<String>, most: Char, least: Char) =
  8.         countBits(data).fold("")
  9.         { result, count -> result + (if (count > data.size / 2) most else least) }
  10.  
  11.     private fun countBits(data: List<String>) =
  12.         data.fold(Array(data[0].length) { 0 }) { counts, binaryString ->
  13.             (0 until binaryString.length).forEach {
  14.                 counts[it] += binaryString[it].toString().toInt()
  15.             }
  16.             counts
  17.         }
  18.  
  19.     /* Part 2 */
  20.     private val co2ScrubberRating = filterCommonBit(data, 0, '1', '0').toInt(2)
  21.     private val oxygenGeneratorRating = filterCommonBit(data, 0, '0', '1').toInt(2)
  22.     val lifeSupportRating = co2ScrubberRating * oxygenGeneratorRating
  23.  
  24.     private fun filterCommonBit(data: List<String>, i: Int, least: Char, most: Char): String {
  25.         if (data.size == 1) return data[0]
  26.         val numberOfOnes = data.count { binaryString -> binaryString[i] == '1' }
  27.         val toKeep = if (numberOfOnes > (data.size - 1) / 2) most else least
  28.         val filteredData = data.filter { binaryString -> binaryString[i] == toKeep }
  29.         return filterCommonBit(filteredData, i + 1, least, most)
  30.     }
  31. }
Add Comment
Please, Sign In to add comment