https://coderun.yandex.ru/problem/route-reduction/description Легкая

Решение

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()
}