Решение задачи acmp.ru на Python "Время прибыти''
решал задачу с сайта acmp.ru
вот ссылка на саму задачу: https://acmp.ru/index.asp?main=task&id_task=331
Мое решение не проходит 11 тест. Не могу понять, где именно ошибка, вроде на всех данных, которые я проверял всё работает корректно. Буду очень благодарен за помощь! Вроде всё проверил, но так и не проходит тест
Условие:
Задано время отправления поезда и время в пути до конечной станции. Требуется написать программу, которая найдет время прибытия этого поезда (возможно, в другие сутки).
Входные данные
Входной файл INPUT.TXT содержит две строки. В первой строке задано время отправления, а во второй строке – время в пути. Время отправления задается в формате «HH:MM», где HH время в часах, которое принимает значение от 00 до 23, ММ – время в минутах, которое принимает значение от 00 до 59. Время в пути задается двумя неотрицательными целыми числами – количество часов и количество минут. Числа разделяются одним пробелом. Количество часов не превышает 120, минут – 59.
Выходные данные
Выходной файл OUTPUT.TXT должен содержать одну строку – время прибытия поезда на конечную станцию. Формат вывода этого времени совпадает с форматом ввода времени отправления.
Примеры:
тест №1
INPUT.TXT
00:00
10 10
OUTPUT.TXT
10:10
тест №2
INPUT.TXT
01:02
4 6
OUTPUT.TXT
05:08
тест №3
INPUT.TXT
11:00
22 0
OUTPUT.TXT
09:00
Вот само решение(т.к код не самый читаемый добавил комментарии):
inp = open('222.txt','r')
out = open ('11.txt','w')
a = inp.read().split()# прочитал файл
#получаю время отправления : часы и минуты
t = a[0]
h = int(t[:2])
m = int(t[3:])
# рассмотриваю отдельно случай ,когда время отправления равняется 00:00
if h == 0 and m == 0:
# перевожу в минуты время в пути
c =int(a[1]) * 60 + int(a[2])
# рассматриваю случай с переход через сутки
if c >= 1440:
q = abs(1440 - c)
while q > 1440:
q = abs(1440 - q)
# получаю часы и минуты
hours = q // 60
minutes = q % 60
#записываю ответ
ans_hours = str(hours)
ans_minutes = str(minutes)
if len(ans_hours) == 1:
ans_hours = '0' + ans_hours
if len(ans_minutes) == 1:
ans_minutes = '0' + ans_minutes
out.write(ans_hours + ':' + ans_minutes)
# рассматриваю случай ,когда перехода через сутки нету
else:
# получаю часы и минуты
hours = c // 60
minutes = c % 60
# записываю ответ
ans_hours = str(hours)
ans_minutes = str(minutes)
if len(ans_hours) == 1:
ans_hours = '0' + ans_hours
if len(ans_minutes) == 1:
ans_minutes = '0' + ans_minutes
out.write(ans_hours + ':' + ans_minutes)
# рассматриваю общий случай
else:
# перевожу в минуты время в пути и время отправления
m_b = h*60 + m
c = m_b+int(a[1])*60+int(a[2])
# рассматриваю случай с переход через сутки
if c >=1440:
q = abs(1440 - c)
while q > 1440:
q = abs(1440 - q)
# получаю часы и минуты
hours = q //60
minutes = q %60
# записываю ответ
ans_hours = str(hours)
ans_minutes = str(minutes)
if len(ans_hours)==1:
ans_hours = '0'+ans_hours
if len(ans_minutes) == 1:
ans_minutes = '0' + ans_minutes
out.write(ans_hours+':'+ans_minutes)
# рассматриваю случай с переход через сутки
else:
# получаю часы и минуты
hours = c // 60
minutes = c % 60
# записываю ответ
ans_hours = str(hours)
ans_minutes = str(minutes)
if len(ans_hours) == 1:
ans_hours = '0' + ans_hours
if len(ans_minutes) == 1:
ans_minutes = '0' + ans_minutes
out.write(ans_hours + ':' + ans_minutes)
Ответы (1 шт):
Вариант №1
1. Решение можно упростить, осознав, что количество часов большее чем 24, на ответ не влияет. Прибытие поезда через 36 часов, означает прибытие через 1 сутки и 12 часов. Время прибытия от количества суток не меняется и будет одинаковым хоть через 1 сутки, хоть через 3-е суток.
Пример:
Поезд отправился в 10:10, был в пути 56 часов 35 минут.
56 часов 35 минут это 48 часов (2-е суток) + 8 часов 35 минут. Сутки нам не нужно учитывать, поэтому их можно отбросить.
Таким образом, время прибытия будет 10:10 + 8 часов 35 минут = 18:45.
2. Можно все вычисления производить в минутах, чтобы не отслеживать, когда в результате сложения минут, появляется дополнительный час.
Пример:
10:10 + 5:55 можно представить как 610 минут + 295 минут = 905 минут. Потом перевести минуты обратно в формат часы:минуты: 905 минут = 15:05
Решение
departure_hours, departure_minutes = map(int, input().split(':'))
duration_hours, duration_minutes = map(int, input().split())
# Переводим значения времени в минуты.
departure_time_in_minutes = departure_hours * 60 + departure_minutes
duration_time_in_minutes = duration_hours * 60 + duration_minutes
# Вычисляем время прибытия в минутах.
arrival_time_in_minutes = departure_time_in_minutes + duration_time_in_minutes
### Переводим время в минутах обратно в формат "часы:минуты":
# Часы узнаём, разделив время в минутах на 60.
# Количество часов кратное 24 можно отбросить с помощью "% 24".
arrival_hours = (arrival_time_in_minutes // 60) % 24
# Количество минут это то, что осталось от деления на 60
arrival_minutes = arrival_time_in_minutes % 60
print(f"{arrival_hours:02d}:{arrival_minutes:02d}")
Вариант №2
Можно обойтись и без перевода в минуты, в данном случае в этом нет необходимости. Тогда решение получается проще. Однако приём с переводом временных значений к одному знаменателю, будь то минуты или секунды, является типичным для задач подобного рода, поэтому оставлю его как Вариант №1.
departure_hours, departure_minutes = map(int, input().split(':'))
duration_hours, duration_minutes = map(int, input().split())
carry_hour, arrival_minutes = divmod((departure_minutes + duration_minutes), 60)
arrival_hours = (departure_hours + duration_hours + carry_hour) % 24
print(f"{arrival_hours:02d}:{arrival_minutes:02d}")