Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main(args: Array<String>) {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
// Считываем маршрут в список действий
val route = mutableListOf<Pair<String, Int>>()
while (true) {
val line = reader.readLine() ?: break
val (direction, distance) = line.split(" ")
route.add(Pair(direction, distance.toInt()))
}
// Функция проверки противоположных направлений
fun isOpposite(dir1: String, dir2: String): Boolean {
return (dir1 == "TOP" && dir2 == "BOTTOM") ||
(dir1 == "BOTTOM" && dir2 == "TOP") ||
(dir1 == "LEFT" && dir2 == "RIGHT") ||
(dir1 == "RIGHT" && dir2 == "LEFT")
}
// Основной цикл обработки маршрута
var i = 0
while (i < route.size - 1) {
val (currDir, currDist) = route[i]
val (nextDir, nextDist) = route[i + 1]
// Случай 1: противоположные направления
if (isOpposite(currDir, nextDir)) {
if (currDist == nextDist) {
// Полное сокращение
route.removeAt(i + 1)
route.removeAt(i)
if (i > 0) i-- // Проверяем предыдущий шаг
} else if (currDist > nextDist) {
// Частичное сокращение: уменьшаем текущую дистанцию
route[i] = Pair(currDir, currDist - nextDist)
route.removeAt(i + 1)
} else {
// Частичное сокращение: уменьшаем следующую дистанцию
route[i + 1] = Pair(nextDir, nextDist - currDist)
route.removeAt(i)
}
}
// Случай 2: одинаковые направления
else if (currDir == nextDir) {
route[i] = Pair(currDir, currDist + nextDist)
route.removeAt(i + 1)
} else {
i++
}
}
// Выводим сокращённый маршрут
for ((direction, distance) in route) {
writer.write("$direction $distance")
writer.newLine()
}
reader.close()
writer.close()
}