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