https://coderun.yandex.ru/problem/sntp/description Легкая

Условие

Для того чтобы компьютеры поддерживали актуальное время, они могут обращаться к серверам точного времени SNTP (Simple Network Time Protocol). К сожалению, компьютер не может просто получить время у сервера, потому что информация по сети передаётся не мгновенно: пока сообщение с текущим временем дойдёт до компьютера, оно потеряет свою актуальность. Протокол взаимодействия клиента (компьютера, запрашивающего точное время) и сервера (компьютера, выдающего точное время) выглядит следующим образом:

• Клиент отправляет запрос на сервер и запоминает время отправления A (по клиентскому времени).

• Сервер получает запрос в момент времени B (по точному серверному времени) и отправляет клиенту сообщение, содержащее время B.

• Клиент получает ответ на свой запрос в момент времени C (по клиентскому времени) и запоминает его. Теперь клиент, из предположения, что сетевые задержки при передаче сообщений от клиента серверу и от сервера клиенту одинаковы, может определить и установить себе точное время, используя известные значения A, B, C.

Вам предстоит реализовать алгоритм, с точностью до секунды определяющий точное время для установки на клиенте по известным A, B и C. При необходимости округлите результат до целого числа секунд по правилам арифметики (в меньшую сторону, если дробная часть числа меньше 1/2, иначе в большую сторону).

Возможно, что, пока клиент ожидал ответа, по клиентскому времени успели наступить новые сутки, однако известно, что между отправкой клиентом запроса и получением ответа от сервера прошло менее 24 часов.

Примеры

Ввод: 15:01:00 18:09:45 15:01:40 Вывод: 18:10:05

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

// Функция преобразования времени в секунды
fun timeToSeconds(time: String): Int {
    val (h, m, s) = time.split(":").map { it.toInt() }
    return h * 3600 + m * 60 + s
}

// Функция преобразования секунд обратно во временную метку
fun secondsToTime(seconds: Int): String {
    val totalSeconds = (seconds % 86400 + 86400) % 86400 // Нормализация времени в пределах суток
    val h = totalSeconds / 3600
    val m = (totalSeconds % 3600) / 60
    val s = totalSeconds % 60
    return String.format("%02d:%02d:%02d", h, m, s)
}

// Функция вычисления точного времени
fun calculateExactTime(a: String, b: String, c: String): String {
    val aSeconds = timeToSeconds(a)
    val bSeconds = timeToSeconds(b)
    val cSeconds = timeToSeconds(c)
    
    // Учитываем переход через полночь
    val duration = if (cSeconds < aSeconds) cSeconds + 86400 - aSeconds else cSeconds - aSeconds
    // Вычисляем сетевую задержку и добавляем к серверному времени
    val exactTimeSeconds = bSeconds + duration / 2 + if (duration % 2 == 1) 1 else 0
    
    return secondsToTime(exactTimeSeconds)
}

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Читаем временные метки
    val a = reader.readLine()
    val b = reader.readLine()
    val c = reader.readLine()
    
    // Вычисляем и выводим точное время
    val result = calculateExactTime(a, b, c)
    writer.write(result)
    
    writer.flush()
    reader.close()
    writer.close()
}