Create Counter class
This commit is contained in:
parent
20f20a3179
commit
3550f65914
29
2021/src/main/kotlin/Counter.kt
Normal file
29
2021/src/main/kotlin/Counter.kt
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package be.vandewalleh.aoc.days
|
||||||
|
|
||||||
|
class Counter<K> : Iterable<Map.Entry<K, Long>> {
|
||||||
|
private val map = HashMap<K, Long>()
|
||||||
|
operator fun get(key: K) = map[key] ?: 0L
|
||||||
|
|
||||||
|
operator fun set(key: K, count: Long) {
|
||||||
|
map[key] = count
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun set(key: K, count: Int) {
|
||||||
|
if (count == 0)
|
||||||
|
map.remove(key)
|
||||||
|
else
|
||||||
|
map[key] = count.toLong()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toMap() = map.toMap(HashMap())
|
||||||
|
override fun toString() = map.toString()
|
||||||
|
|
||||||
|
fun minValue() = map.minOf { it.value }
|
||||||
|
fun maxValue() = map.maxOf { it.value }
|
||||||
|
|
||||||
|
override fun iterator() = toMap().iterator()
|
||||||
|
|
||||||
|
companion object
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun <T> Counter.Companion.invoke(items: Iterable<T>) = Counter<T>().apply { items.forEach { this[it] += 1 } }
|
||||||
@ -12,25 +12,20 @@ class Day14 : BaseDay() {
|
|||||||
val pairs = input.lines.value.drop(2)
|
val pairs = input.lines.value.drop(2)
|
||||||
.associate { it.split(" -> ").let { (a, b) -> a to (a[0] + b to b + a[1]) } }
|
.associate { it.split(" -> ").let { (a, b) -> a to (a[0] + b to b + a[1]) } }
|
||||||
|
|
||||||
fun <T, K> Grouping<T, K>.toCounter() = eachCount().mapValues { it.value.toLong() }.toMutableMap()
|
val polymer = Counter(template.windowed(2)) // {NN=1, NC=1, CB=1}
|
||||||
fun <K> MutableMap<K, Long>.inc(key: K, count: Long) = compute(key) { _, old -> (old ?: 0) + count }
|
val counts = Counter(template.toCharArray().toList()) // {N=2, C=1, ...}
|
||||||
fun <K> MutableMap<K, Long>.dec(key: K, count: Long) = compute(key) { _, old -> (old ?: 0) - count }
|
|
||||||
|
|
||||||
// {NN=1, NC=1, CB=1}
|
|
||||||
val polymer = template.windowed(2).groupingBy { it }.toCounter()
|
|
||||||
|
|
||||||
// {N=2, C=1, ...}
|
|
||||||
val counts = template.groupingBy { it }.toCounter()
|
|
||||||
repeat(step) {
|
repeat(step) {
|
||||||
polymer.toMap().forEach { (pair, value) ->
|
polymer.forEach { (pair, value) ->
|
||||||
val (left, right) = pairs[pair]!!
|
val (left, right) = pairs[pair]!!
|
||||||
polymer.dec(pair, value)
|
polymer[pair] -= value
|
||||||
polymer.inc(left, value)
|
polymer[left] += value
|
||||||
polymer.inc(right, value)
|
polymer[right] += value
|
||||||
counts.inc(left[1], value)
|
counts[left[1]] += value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return counts.maxOf { it.value } - counts.minOf { it.value }
|
|
||||||
|
return counts.maxValue() - counts.minValue()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun part1() = run(10)
|
override fun part1() = run(10)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user