5XURVYSGXR3FYWQVG57F4QCKHJYIGI4KDNYHJWZRFCVPR5G4N3AAC package day3import java.io.Fileimport kotlin.reflect.KFunction1fun main() {val lines = File("src/day3/input.txt").readLines().map { line -> line.toList().map { char -> Character.getNumericValue(char) } }val columns = lines.transpose()println(columns.map { it.gamma() }.toDecimal() * columns.map { it.epsilon() }.toDecimal())println(filter(lines, List<Int>::gamma).toDecimal() * filter(lines, List<Int>::epsilon).toDecimal())}fun List<Int>.gamma() = if (this.sum() >= this.size / 2.0) 1 else 0fun List<Int>.epsilon() = 1 - this.gamma()fun List<Int>.toDecimal() = reduce { a, b -> a * 2 + b }fun <T> List<List<T>>.transpose(): List<List<T>> = (first().indices).map { column(it) }fun <T> List<List<T>>.column(index: Int): List<T> = fold(listOf()) { acc, row -> acc + row[index] }fun filter(lines: List<List<Int>>, fn: KFunction1<List<Int>, Int>): List<Int> {var index = 0var candidates = lineswhile (candidates.size > 1) {candidates = candidates.filter { line -> line[index] == fn(candidates.column(index)) }index++}return candidates.get(0)}
101011111001100100110111101010101011010100010000001101101101110001101010001001011001101111101111110001001000111111000000111100110001101100010100000010000011000110000011101010100101000111001010100101101110111111010101110010001100000011001101001001111110100101001100000011100100000100110011000101101000101010011011101011110000010010110011110110101110001110000110001110111101110111100101000010101010101010101010011011001101110110000111011010011000000111000101100000101011010010101100110000101110000010001001101010001100101111110101101111011110110011100001011011100100111100011010110110101001101011100010111000110110111011100101111000001111101110110011111101000000101111100110011111101101100111110111000111011011001001001111100010110000001101010000100101101001100001010000110101110001100111111111101101000101001110100110101010110000101111010010101011100101001110010100011110110100100011000000001000000100010000010001101101111011111010001011101010100000101001000000001000010101010011000111101010111100111101000101111111100010100010011101101001111101010111001111111111110110100111101010010101000101100101010010010110010001011101000111011110011010100000111100011111111000001111010001110110100111111000001011110010010011101010110010110000110111101111010000110111010000110011100011010000100111001010110001011101011010110111010010011001001101101101001111011101110100001101101110011011101101111001010001001100101000010011100000011000010100111000111111001001100001010011001010001110101100010010111010000111111011010010000110110001100100001110110111000010001111100011100001100001101110100001110111010110100000100101101111001100000111101100111001100100001100100000101100010101000110101110001000101110000110101110011100001001010001110111101011101001000001111100111110001100010100010001111111110011000011100110011101011010100100011111000011000110001000010010111111010011111011001000111110000111101011100010111100010110001111011011000000010111000011010001011111111000101100010110110000001100111011011110100101100011100011001000101000101011001011101111001111111000100101111101100111111010101000001110000111010101011110001111010100101011011101000111101010000011001011111000010001011001011011011011011001011110111000000010001100011110010000010000101001101011011111100111001100101000011100111000000100011100110000011100101010010001110011100100100010011110010010011000100111110101000101111011000001011000010111010011110011011001000001000100101110100111110001010010011010111101011001100110101111100010001100010010000111100011100100111001111011110000010111101001010001011111001010110111111100000101111101101011000111000100010000111100001111100000110010110001110100000001001100000101000001100111101011011000110110101111000000010100101100101111100011100111001101100000010010100101001111011110100010110110100110100000100001110100001110010011001111011010010000000000010101111111011100000011100000011110111101110000011100011011011000010100111010010010100101001110100011000110000100100111000101000010001000110110110000010011000100011001100010110000011110000110100111010111111011011100000011100011101110001100011010000010100100000011110000000000101000101001101001101111010101101100101101110000000000111011001110001100101110100101111000010001000111111100111010000100011101010001000011100000101001111111101101000000011101001101110110001100000101010110011110001011100100110001100101001011110011011101111000001001100110000001011000001011010000110001010100000100011011010101101010101000101010101111011000110001010111111100110011101011101000000100010110111010000110000100000001101011110101010010010011100101011001100101001010110100110101010011100111100110010101111010000011011011110110111000101110001011101100010110100010011001101011011000101101011011111110011011111001100001001101101110011011001111011100111110010011000010101011001111101010100001101000111100100000010011100100011101101100000001101011001100001110000011000111100110001000101101101011001011011110101010111101101110100110011111000100111101111000001011110111010010011001111110110001100101000100011011010101100010010000100010101000110010000100000001001111101110011010010000111111111101010001100000000000011101100110001110101101001001110010110011101001101101011001000000110101011101100011010100000011101011110010100101000010100110001100000111111010111100011001111110101001010000111000100110000011100011001110000100010010001101100100000000001100011101001001100001001000101100111000110011011111111110101110101101001010111000011001111110011001110111010100011001111011101101111000010010010100100000110110011110010100010010101010001111100100100000011101110100010010101101100000111001111010010001100110011000110101011110010011011111100000001000101100000100010111011000101010011000010110010001101011110101010000000100100100011011001100010100011101100111110110111010000001001001111111010100001111011111101011011000011011111010000100110001001111111011011010001110001110100100101001101101101001001100001001001000001110101111000010000110001110101111110010110011001011000000010100110100110001111000011111100000001110100100011011101100100011011101000010001100100101111110101101011100001001101100000110101011010011000101101100001011101001110000000101011111011110000001100110100110011011111010100100011001101001010111110011110111000000011100101011010110100111110011001001000010111011101110010110000001011001100101000111110110111011000101110001100000111101011110001011000101010101101011110011000110011001101010000001100001011110010000000111000011100110100111100010110101000111001010101110111000100000001100101101000111010111101110000000011111000010111000001110001100110101101001000100010111011101000100000100111111000111111011001111101000011110110011101101111101000011101101111001010010010101110000100010000100100111000110111111000011001000011011100001101100111101011111000001000110101100010010111001111100101110100111010100011111000000001011001000101111000011000100001010110100010000110001000011010010101111001010001010010001110001011000001101101001010111000000011100010011111000110010011011001110100111011101000011111110011101100111000000101011101110111000010111101001000011011110011001000100010001101110000100111101101101000100100110010011010001000101100110010111110001001110111100100000111111101100000011110011000100100000001011010101100000101010000101010110101101010011100001001101001111101100100111100000001101100100101100101111010111010101001100011001111111010111110000010100110101101111010001111101111100011010011011111100110100111110001010011110011111000110001100011001010111000010010111011100101111111110111000110010110010000101111010001010010100100110110001101101010001100001111011010101001001000001000010100101100011010100101010001001001100101000110110111110001000100101110010001000111011100111010111000000110000110101111000011000101110110101001111101000010010101011000010100110000111110101011001110010010100010000001111110011011001111010110100010000101010101100111011000000011010110110001000001011011011101110100001010100011011111101001101010000011001110010100100101101011010110000100001010101111000101000111010011011010100011110011101010000100100001111101001010011110000111000100111010101010101000001001010010001001100111011111100001110000011110101101000111010011110110011010011001010101101001111110001110001011110011110010001010010000100111010111001000100111111000001010101001010110111000110010011000010011111011110100001011111010110001110010110001001000011101111011101011100110111010000001101010010100111010000110011011110110111010000110110011101011011000010100001001100011111011110110000111011011011101011101111010001000101010100001000010100101110001000000101001001011011111001000101110101110100111111010111101010100111110000011010000100100000011101000001000011000001010101010001010010011100010001110101010110110111010011110010011011100110000110100011100010100011101111110011001011100101011101110000110001110000111010010000111111000011010010001100010111101010010010101000111001010111010110110011001101110010011111001111010100110100010010100100101011101100000111101001000001011010101010111000100011111111100100011111111000010010011011100010000111010010101010101111010000100101100110110101011011100011011011110011111011000100100010001010110000010000100101011111101100001100111110101111100111000100011101001110100011011101111101011010110101111001001000110101111110101100001010010111100110000000110101010100110110001101011110101101100110101110000000000010011010111001000001101111000100000101110000100011001010000101100111011010000001101001001011000001000111100110111111110011000101000000111000110000000010000111000101010001000011110001101100110100100001111110001111111111100011000110011100011001101011110100001010001111100010100001001111100110010110110010110010110101011000110011000101011110101000100100010110010110001000000110110000100100011101101011100100000111000111010101110111000100001010110000101001110001001001101011101000100101111111000010000010110101110000000110000100110000111111011011101101100101011001010010111111101111000111101101100110110011110000001000111000001101110011010010110110111110000001011111001100001010111101011100010010100010110100011011110001101011010111111010011111100100001010010110001010111111111110111110011010000110111111111001011011011110001010011101001110010111001001111100110010111000000111000100001100001000110110110100101001010000000101000101010101101100101010110110111101011000101010011100110010110011111110001110100100101110001010000000001000110010101000111111111110111101000110010110101100100110100010011001100110100010111101100110111100111111010111011011111100011111001010010011111101010010110111001010010110000000011111011001101011100011011100110011111100011110101001001001100101100110000100110010010011101110000011110111000000011111110011011100111110100100101110101111001101011000101101110001101011000100111001101100110111111001011010101001000000000000111100000101110010111001000100001110110101111100110010011111001001110111111111111111000110011100110101111010011010111011111000000101011110100111001010101111001011011001101010001011100001000000111110111010001110111110000000110100111110111001111000010101110011110111110111001101111011010010110100000110100111111100010001100010111100010000100111011101101001000111111110110011010101010100101000110111000111101100100001011001010000011111000100101011011011011010001111000010111001101011100011010111110111100111100001010110100001110101100110110111011111111011111111101110111111001000101010000110110010010110100110100111011101011100011010011101101111101101110111010110110000000100110000110100001100000110001011001101001010011111011001110000100111100100001111000000110100011001110000110011000000101101111101111111111111010010011101101110111101101100100000110000110101010001101001110100010010110110111011000111101100000100010011010101111101000001101001111000101110000011001011011101111010000010001001110100111111001001001001010000001110000001111100000000010101110100000101011011001100011001001110001100001110100010000000100111000100111000110100101100110100111010111001101101111100101011011101100000100000100011010111110010010011001000101001100110100110001111000110110101111001110110000101010110011000011010010100110110110100111111111000110011001011111000001000000000111111010100111111100110000000001111110001000001010000101000101111111010100100001101111011110100110101110011010111111110001000101111100110101100110010010010010010001000011111101100111100100011110111101000100000111001001011100011001010111100000100001100010111000110001111000101001110000010110100101000001110000101101000110000001001011101101001011001011110100011101010010110101000001101110111111111010010001101011100010110000100100001001111111101001001111000001100101111111010111100110100010111000000010011100110110000101100101111100011010100001001101110110001101000110101101110010011110101010000110001100011111000111110000010100111100000100001100110110111000110000101100011010110001100100000100010001011000000110101000010101110101001011010100110111111110000001010110010010000001011100000010011010111010111101111100010010100010011