1
0

Clean parsing

This commit is contained in:
Hubert Van De Walle 2020-12-16 09:24:10 +01:00
parent 90c9961d72
commit edc60130dc
3 changed files with 19 additions and 27 deletions

View File

@ -1,36 +1,33 @@
package be.vandewalleh.aoc.days
import be.vandewalleh.aoc.utils.input.Day
import be.vandewalleh.aoc.utils.input.Groups
import be.vandewalleh.aoc.utils.input.Input
import be.vandewalleh.aoc.utils.input.Lines
import be.vandewalleh.aoc.utils.input.createDay
import org.eclipse.collections.api.RichIterable
import org.eclipse.collections.impl.factory.Multimaps
import org.eclipse.collections.impl.factory.primitive.IntSets
@Day(16)
class Day16(@Lines val input: Input<List<String>>) {
class Day16(@Groups val input: Input<List<List<String>>>) {
private val rangesGroup = input.value[0]
private val myTicket = input.value[1][1]
private val nearbyTicketsGroup = input.value[2].drop(1)
fun part1(): Int {
val minMax = mutableListOf<IntRange>()
val re = "(\\d+)-(\\d+)".toRegex()
for (line in input.value) {
for (line in rangesGroup) {
re.findAll(line).forEach {
val (min, max) = it.destructured
minMax.add(min.toInt()..max.toInt())
}
if (line.startsWith("your ticket")) break
}
var ok = false
val nearbyTickets = mutableListOf<Int>()
for (line in input.value) {
if (!ok && line.startsWith("nearby tickets:")) {
ok = true
continue
}
if (!ok) continue
for (line in nearbyTicketsGroup) {
line.splitToSequence(",").forEach { nearbyTickets.add(it.toInt()) }
}
@ -55,24 +52,16 @@ class Day16(@Lines val input: Input<List<String>>) {
val minMax = Multimaps.mutable.list.empty<String, IntRange>()
val re = "(\\d+)-(\\d+)".toRegex()
for (line in input.value) {
if (line.startsWith("your ticket")) break
val name = line.split(':')[0]
re.findAll(line)!!.forEach {
for (line in rangesGroup) {
val name = line.substringBefore(":")
re.findAll(line).forEach {
val (min, max) = it.destructured
minMax.put(name, min.toInt()..max.toInt())
}
}
var ok = false
val validTickets = mutableListOf<List<Int>>()
for (line in input.value) {
if (!ok && line.startsWith("nearby tickets:")) {
ok = true
continue
}
if (!ok) continue
for (line in nearbyTicketsGroup) {
val ticket = line.splitToSequence(",").map { it.toInt() }.toList()
if (isTicketValid(ticket, minMax.valuesView().toList())) {
validTickets.add(ticket)
@ -116,10 +105,6 @@ class Day16(@Lines val input: Input<List<String>>) {
catMap.remove(cat, one)
}
}
// TODO
val myTicket = "173,191,61,199,101,179,257,79,193,223,139,97,83,197,251,53,89,149,181,59"
val myTicketValues = myTicket.split(",").map { it.toInt() }
var mult = 1L
catMap.forEachKeyValue { category, index ->

View File

@ -24,3 +24,6 @@ annotation class Text
@DayInput
annotation class Lines
@DayInput
annotation class Groups

View File

@ -60,6 +60,10 @@ class InputFactory(private val resourceLoader: ResourceLoader) {
fun text(injectionPoint: InjectionPoint<*>): Input<String> =
injectionPoint.read().wrap()
@Groups
fun groups(injectionPoint: InjectionPoint<*>): Input<List<List<String>>> =
injectionPoint.read().split("\n\n").map { it.lines() }.wrap()
private fun <T> T.wrap() = Input(this)