Nir
12/02/2020, 5:24 PMpackage day2
import utils.*
data class RuledPassword(val range: IntRange, val char: Char, val password: String)
fun String.toRuledPassword(): RuledPassword {
val (rangeStart, rangeEnd, char, password) = split(": ", " ", "-")
assert(char.length == 1)
return RuledPassword(IntRange(rangeStart.toInt(), rangeEnd.toInt()), char.first(), password)
}
fun RuledPassword.isValidOne() = password.count { it == char } in range
fun RuledPassword.isValidTwo(): Boolean{
val charPresent = { i: Int -> password.elementAtOrNull(i-1)?.let { it == char} ?: false }
return charPresent(range.first) xor charPresent(range.endInclusive)
}
fun countValid(validator: RuledPassword.() -> Boolean) = (aocDataDir / "day2.txt").useLines { it.count {
it.toRuledPassword().validator()
}
}
fun part1() = println(countValid(RuledPassword::isValidOne))
fun part2() = println(countValid(RuledPassword::isValidTwo))
adamratzman
12/02/2020, 5:35 PMprivate val input = readInput("input2.txt")
fun main() {
var part1 = 0
var part2 = 0
input.split("\n").forEach { line ->
val (rangeT, lT, password) = line.split(" ")
val l = lT.removeSuffix(":")
val ranges = rangeT.split("-").map { it.toInt() }
val low = ranges[0]
val high = ranges[1]
val num = password.filter { it.toString() == l }.length
if (num in low..high) part1++
if ((password[low - 1].toString() == l) xor (password[high - 1].toString() == l)) part2++
}
println("Part 1: $part1")
println("Part 2: $part2")
}
Joris PZ
12/02/2020, 6:26 PMNir
12/02/2020, 6:29 PMephemient
12/02/2020, 6:41 PMrenatomrcosta
12/02/2020, 7:58 PMNir
12/02/2020, 8:05 PMJoris PZ
12/02/2020, 8:08 PMNir
12/02/2020, 8:16 PMrenatomrcosta
12/02/2020, 10:07 PMNir
12/02/2020, 10:20 PMrenatomrcosta
12/02/2020, 10:30 PMJoris PZ
12/02/2020, 11:01 PMNir
12/02/2020, 11:02 PMJoris PZ
12/02/2020, 11:17 PMNir
12/02/2020, 11:18 PMephemient
12/03/2020, 2:31 AM.groupByTo(mutableMapOf()) { ... }
has the same result as .groupBy { ... }.toMutableMap()
but with one fewer intermediate data structureNir
12/03/2020, 4:12 AMephemient
12/03/2020, 2:38 PM.groupingBy { ... }.eachCount()
or .groupingBy { ... }.eachCountTo(...)
Benchmark Mode Cnt Score Error Units
MapBench.manual sample 12505 0.399 ± 0.003 ms/op
MapBench.stdlib sample 12769 0.391 ± 0.002 ms/op
it shows stdlib marginally outperforming the obvious hand-written loopNir
12/03/2020, 3:35 PM