1
0

More optimizations

This commit is contained in:
Hubert Van De Walle 2020-12-16 14:38:30 +01:00
parent 5ffebae101
commit 55271e210d
2 changed files with 19 additions and 13 deletions

View File

@ -4,9 +4,11 @@ import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.createDay import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.multimap.list.ListMultimap
import org.eclipse.collections.api.multimap.list.MutableListMultimap import org.eclipse.collections.api.multimap.list.MutableListMultimap
import org.eclipse.collections.api.multimap.set.MutableSetMultimap import org.eclipse.collections.api.multimap.set.MutableSetMultimap
import org.eclipse.collections.impl.factory.Multimaps import org.eclipse.collections.impl.factory.Multimaps
import org.eclipse.collections.impl.multimap.list.FastListMultimap
@Day(16) @Day(16)
class Day16(@Groups val input: Input<List<List<String>>>) { class Day16(@Groups val input: Input<List<List<String>>>) {
@ -67,7 +69,6 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
mult *= myTicketValues[index] mult *= myTicketValues[index]
} }
} }
return mult return mult
} }
@ -76,7 +77,7 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
val queue = ArrayDeque<Int>() val queue = ArrayDeque<Int>()
indexesByCategory.multiValuesView() indexesByCategory.multiValuesView()
.sortedBy { it.size() } .toSortedListBy { it.size() }
.forEach { it.forEach { if (toBeRemoved.add(it)) queue.add(it) } } .forEach { it.forEach { if (toBeRemoved.add(it)) queue.add(it) } }
queue.removeLast() queue.removeLast()
@ -100,8 +101,8 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
} }
private fun indexesByCategory( private fun indexesByCategory(
rangesByName: MutableListMultimap<String, IntRange>, rangesByName: ListMultimap<String, IntRange>,
validTickets: MutableList<List<Int>>, validTickets: List<List<Int>>,
): MutableSetMultimap<String, Int> { ): MutableSetMultimap<String, Int> {
val indexesByCategory = Multimaps.mutable.set.empty<String, Int>() val indexesByCategory = Multimaps.mutable.set.empty<String, Int>()
@ -110,21 +111,26 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
val ranges = entry.two.toList() val ranges = entry.two.toList()
for (i in validTickets.first().indices) { for (i in validTickets.first().indices) {
val allInRange = validTickets var allInRange = true
.asSequence() for(ticket in validTickets){
.map { it[i] } val current = ticket[i]
.all { inRanges(it, ranges) } if(!inRanges(current, ranges)){
allInRange = false
break
}
}
if (allInRange) indexesByCategory.put(category, i) if (allInRange) indexesByCategory.put(category, i)
} }
} }
return indexesByCategory return indexesByCategory
} }
private fun validTickets(rangesByName: MutableListMultimap<String, IntRange>): MutableList<List<Int>> { private fun validTickets(rangesByName: MutableListMultimap<String, IntRange>): List<List<Int>> {
val validTickets = mutableListOf<List<Int>>() val validTickets = mutableListOf<List<Int>>()
val ranges = rangesByName.valuesView().toList()
for (line in nearbyTicketsGroup) { for (line in nearbyTicketsGroup) {
val ticket = line.splitToSequence(",").map { it.toInt() }.toList() val ticket = line.split(",").map { it.toInt() }
if (isTicketValid(ticket, rangesByName.valuesView().toList())) { if (isTicketValid(ticket, ranges)) {
validTickets.add(ticket) validTickets.add(ticket)
} }
} }
@ -132,7 +138,7 @@ class Day16(@Groups val input: Input<List<List<String>>>) {
} }
private fun namedRanges(): MutableListMultimap<String, IntRange> { private fun namedRanges(): MutableListMultimap<String, IntRange> {
val rangesByName = Multimaps.mutable.list.empty<String, IntRange>() val rangesByName = FastListMultimap<String, IntRange>()
for (line in rangesGroup) { for (line in rangesGroup) {
val name = line.substringBefore(":") val name = line.substringBefore(":")
extractRanges(line).forEach { extractRanges(line).forEach {

View File

@ -10,7 +10,7 @@ import org.openjdk.jmh.runner.options.OptionsBuilder
/* /*
Benchmark Mode Cnt Score Error Units Benchmark Mode Cnt Score Error Units
Day16Benchmark.part2 avgt 5 1.748 ± 0.047 ms/op Day16Benchmark.part2 avgt 5 0.697 ± 0.026 ms/op
*/ */
@BenchmarkMode(Mode.AverageTime) @BenchmarkMode(Mode.AverageTime)