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

0 голосов
157 просмотров

Задача 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 – часы, минуты, секунды момента С по времени клиента. Программа должна вывести три целых числа: часы, минуты, секунды вычисленноготочного времени, которое должен установить себе клиент.Пример входных и выходных данныхВвод15101894515140Вывод:18105ПРИМЕЧАНИЕКлиент отправил запрос в 15:01:00 по своим часам, сервеР получил запрос в 18:09:45 по своим часам. Клиент получиЛ ответ в 15:01:40, в этот момент точное время будет 18:10:05.Система оцениванияРешение, правильно работающее только для случаев, когда все три входных времении ответ на задачу принадлежат одним суткам, будет оцениваться в 6 баллов.


Информатика (17 баллов) | 157 просмотров
Дан 1 ответ
0 голосов

#!/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)

(33 баллов)