package be.vandewalleh.aoc.days import be.vandewalleh.aoc.utils.BaseDay import be.vandewalleh.aoc.utils.input.Day @Day class Day03 : BaseDay() { override fun part1(): Int { val moreOnes = input.lines.value[0].indices .map { i -> input.lines.value.map { it[i] } } .map { it.count { it == '1' } >= it.size / 2 } val gamma = moreOnes.joinToString("") { if (it) "1" else "0" }.toInt(radix = 2) val epsilon = moreOnes.joinToString("") { if (!it) "1" else "0" }.toInt(radix = 2) return gamma * epsilon } override fun part2(): Any { val o2 = findNumber(input.lines.value) { ones, zeros -> if (ones >= zeros) '1' else '0' } val co2 = findNumber(input.lines.value) { ones, zeros -> if (zeros <= ones) '0' else '1' } return o2 * co2 } private fun findNumber(input: List, keep: (Int, Int) -> Char): Int { var numbers = input for (i in this.input.lines.value[0].indices) { if (numbers.size == 1) break val eachCount = numbers.map { it[i] }.groupingBy { it }.eachCount() val ones = eachCount['1'] ?: 0 val zeros = eachCount['0'] ?: 0 val maj = keep(ones, zeros) numbers = numbers.filter { it[i] == maj } } return numbers[0].toInt(2) } }