advent-of-code/2018/13/main.kt

96 lines
3.0 KiB
Kotlin
Raw Permalink Normal View History

2018-12-14 00:34:55 +01:00
package aoc.thirteen
import aoc.thirteen.Field
import aoc.thirteen.Turn
import aoc.thirteen.Train
import java.io.File
import java.io.InputStream
class Main() {
companion object {
public var field: MutableList<MutableList<Field>> = mutableListOf<MutableList<Field>>()
fun parseField(c: Char): Field {
return when (c) {
'|', 'v', '^' -> Field.VERTICAL
'-', '>', '<' -> Field.HORIZONTAL
'/' -> Field.TOP_LEFT
'\\' -> Field.TOP_RIGHT
'+' -> Field.INTERSECTION
' ' -> Field.EMPTY
else -> throw IllegalArgumentException("can’t parse field " + c)
}
}
2018-12-14 16:27:13 +01:00
fun findCrash(trains: MutableList<Train>) {
var positions = HashSet<Pair<Int, Int>>(trains.size - 1)
trains.map{ t -> Pair(t.x, t.y) }.forEach{ p ->
2018-12-14 23:34:16 +01:00
if (p !in positions) positions.add(p)
else println(p)
2018-12-14 16:27:13 +01:00
}
}
2018-12-14 00:34:55 +01:00
fun parseTrain(c: Char, x: Int, y: Int): Train {
val dir = when (c) {
'^' -> 0
'>' -> 1
'v' -> 2
'<' -> 3
else -> throw IllegalArgumentException("this shouldn’t happen rooDerp")
}
return Train(dir, x, y)
}
fun moveTrain(t: Train): Train {
when (t.direction) {
2018-12-14 08:31:49 +01:00
0 -> t.y -= 1
2018-12-14 00:34:55 +01:00
1 -> t.x += 1
2018-12-14 08:31:49 +01:00
2 -> t.y += 1
2018-12-14 00:34:55 +01:00
3 -> t.x -= 1
else -> throw IllegalArgumentException("this shouldn’t happen either selphyDerp")
}
2018-12-14 16:27:13 +01:00
val current = field[t.y][t.x]
2018-12-14 00:34:55 +01:00
when (current) {
Field.VERTICAL, Field.HORIZONTAL -> {}
2018-12-14 23:34:16 +01:00
Field.TOP_LEFT -> t.direction = t.direction xor 1
Field.TOP_RIGHT -> t.direction = t.direction xor 3
2018-12-14 00:34:55 +01:00
Field.INTERSECTION -> t.crossIntersection()
2018-12-14 08:31:49 +01:00
Field.EMPTY -> throw IllegalStateException("I shouldn’t be here")
2018-12-14 00:34:55 +01:00
}
return t
}
@JvmStatic
fun main(args: Array<String>) {
val inputStream = File("input").inputStream()
val inputLines = inputStream.bufferedReader().use { it.readText() }.split("\n")
val TRAINS = charArrayOf('<', '>', '^', 'v')
var trains = mutableListOf<Train>()
2018-12-14 08:31:49 +01:00
for ((y, line) in inputLines.withIndex()) {
2018-12-14 00:34:55 +01:00
var fields = mutableListOf<Field>()
2018-12-14 08:31:49 +01:00
for ((x, char) in line.toCharArray().withIndex()) {
2018-12-14 00:34:55 +01:00
if (char in TRAINS) {
2018-12-14 08:31:49 +01:00
val newTrain = parseTrain(char, x, y)
trains.add(newTrain)
2018-12-14 00:34:55 +01:00
}
fields.add(parseField(char))
}
field.add(fields)
}
var positions = HashSet<Pair<Int, Int>>(trains.size)
positions.addAll(trains.map{ t -> Pair(t.x, t.y) })
2018-12-14 16:27:13 +01:00
var current = 0
2018-12-14 00:34:55 +01:00
while (positions.size == trains.size) {
2018-12-14 16:27:13 +01:00
trains[current] = moveTrain(trains[current])
2018-12-14 00:34:55 +01:00
positions.clear()
positions.addAll(trains.map{ t -> Pair(t.x, t.y) })
2018-12-14 16:27:13 +01:00
current = (current + 1) % trains.size
2018-12-14 00:34:55 +01:00
}
2018-12-14 16:27:13 +01:00
findCrash(trains)
2018-12-14 00:34:55 +01:00
}
}
}