From 34c2414304d59e76d52b96efe6bebebb4e75f086 Mon Sep 17 00:00:00 2001 From: tchojnacki Date: Thu, 11 Aug 2022 12:01:44 +0200 Subject: Move year 2021 into a subfolder --- 2021-kotlin/src/Day03.kt | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 2021-kotlin/src/Day03.kt (limited to '2021-kotlin/src/Day03.kt') diff --git a/2021-kotlin/src/Day03.kt b/2021-kotlin/src/Day03.kt new file mode 100644 index 0000000..1418a2e --- /dev/null +++ b/2021-kotlin/src/Day03.kt @@ -0,0 +1,51 @@ +object Day03 { + private fun addLists(l1: List, l2: List) = l1.zip(l2).map { it.first + it.second } + + private fun valueOfBits(bitList: List) = bitList.reduce { acc, bit -> acc * 2 + bit } + + private fun invertBits(bitList: List) = bitList.map { bit -> 1 - bit } + + private fun mostCommonBits(input: List>): List = + input + .reduce(::addLists) + .map { bit -> if (bit.toDouble() / input.size >= 0.5) 1 else 0 } + + private fun selectByBitCriteria( + input: List>, + comparisonCriteria: (currentList: List>) -> List + ): List? { + var list = input + var index = 0 + + while (list.size > 1 && index < list[0].size) { + list = list.filter { e -> e[index] == comparisonCriteria(list)[index] } + index += 1 + } + + return list.getOrNull(0) + } + + fun part1(input: List>): Int = + mostCommonBits(input) + .let { gammaBits -> + val epsilonBits = invertBits(gammaBits) + return valueOfBits(gammaBits) * valueOfBits(epsilonBits) + } + + fun part2(input: List>): Int { + val oxygenRating = selectByBitCriteria(input) { mostCommonBits(it) }!! + val scrubberRating = selectByBitCriteria(input) { invertBits(mostCommonBits(it)) }!! + + return valueOfBits(oxygenRating) * valueOfBits(scrubberRating) + } +} + +fun main() { + val testInput = readInputAsBitLists("Day03_test") + check(Day03.part1(testInput) == 198) + check(Day03.part2(testInput) == 230) + + val input = readInputAsBitLists("Day03") + println(Day03.part1(input)) + println(Day03.part2(input)) +} -- cgit v1.2.3