• Задача 7. SNTP

    Для того чтобы компьютеры поддерживали актуальное время, они могут обращаться

    к серверам точного времени SNTP (Simple Network Time Protocol). К сожалению, компьютер

    не может просто получить время у сервера, потому что информация по сети передаётся не

    мгновенно: пока сообщение с текущим временем дойдёт до компьютера, оно потеряет свою

    актуальность. Протокол взаимодействия клиента (компьютера, запрашивающего точное

    время) и сервера (компьютера, выдающего точное время) выглядит следующим образом:

    1) Клиент отправляет запрос на сервер и запоминает время отправления A

    (по клиентскому времени).

    2) Сервер получает запрос в момент времени B (по точному серверному времени)

    и отправляет клиенту сообщение, содержащее время B.

    3) Клиент получает ответ на свой запрос в момент времени C (по клиентскому времени)

    и запоминает его. Теперь клиент, из предположения, что сетевые задержки при

    передаче сообщений от клиента серверу и от сервера клиенту одинаковы, может

    определить и установить себе точное время, используя известные значения A, B, C.

    Вам предстоит реализовать алгоритм, с точностью до секунды определяющий точное

    время для установки на клиенте по известным A, B и C. При необходимости округлите

    результат до целого числа секунд по правилам арифметики (в меньшую сторону, если

    дробная часть числа меньше ½, иначе в большую сторону).

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

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

    от сервера прошло менее 24 часов.

    Программа получает на вход три временные метки A, B, C. Каждая временная метка

    состоит из трёх целых чисел: количества часов, количества минут, количества секунд. То есть

    первые три строки входных данных содержат числа Ah, Am, As – часы, минуты, секунды

    момента A по клиентскому времени. Следующие три строки содержат числа Bh, Bm, Bs – часы,

    минуты, секунды момента B по времени сервера. Следующие три строки содержат числа Сh,

    Сm, Сs – часы, минуты, секунды момента С по времени клиента.

    Программа должна вывести три целых числа: часы, минуты, секунды вычисленного

    точного времени, которое должен установить себе клиент.

    Пример входных и выходных данных

    Ввод

    15

    1

    0

    18

    9

    45

    15

    1

    40
    Вывод:
    18

    10

    5
    ПРИМЕЧАНИЕ
    Клиент отправил запрос в 15:01:00 по своим часам, сервеР получил запрос в 18:09:45 по своим часам. Клиент получиЛ ответ в 15:01:40, в этот момент точное время будет 18:10:05.

    Система оценивания

    Решение, правильно работающее только для случаев, когда все три входных времени

    и ответ на задачу принадлежат одним суткам, будет оцениваться в 6 баллов.

Ответы 1

  • #!/usr/bin/env python3

    from collections import namedtuple

    Timestamp = namedtuple('Timestamp', ['h', 'm', 's'])

    Timestamp.__str__ = lambda self: "{h:02}:{m:02}:{s:02}".format(

    h=self.h, m=self.m, s=self.s

    )

    def get_timestamp(s):

    slices = (

    (0, 2), (3, 5), (6, 9),

    )

    return Timestamp(*(int(s[l:r]) for l, r in slices))

    SECS_IN_MINUTE = 60

    SECS_IN_HOUR = SECS_IN_MINUTE * 60

    SECS_IN_DAY = SECS_IN_HOUR * 24

    def get_seconds(t):

    ret = t.h * SECS_IN_HOUR

    ret += t.m * SECS_IN_MINUTE

    ret += t.s

    return ret

    Timestamp.__int__ = get_seconds

    def get_timestamp_from_seconds(secs):

    h = secs // SECS_IN_HOUR

    h %= 24

    secs %= SECS_IN_HOUR

    m = secs // SECS_IN_MINUTE

    secs %= SECS_IN_MINUTE

    s = secs

    return Timestamp(h, m, s)

    A, B, C = [int(get_timestamp(input())) for _ in range(3)]

    tm2 = 2*B + (C-A) % SECS_IN_DAY

    tm = tm2 // 2 + tm2 % 2

    tm = get_timestamp_from_seconds(tm)

    print(tm)

    • Автор:

      jacey
    • 5 лет назад
    • 0
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years