Имам проблем с часовника. Не знам къде греша
Здравейте, имам проблем със следната задача:
8.Навреме за изпит
Студент трябва да отиде на изпит в определен час (например в 9:30 часа). Той идва в изпитната зала в даден час на пристигане (например 9:40). Счита се, че студентът е дошъл навреме, ако е пристигнал в часа на изпита или до половин час преди това. Ако е пристигнал по-рано повече от 30 минути, той е подранил. Ако е дошъл след часа на изпита, той е закъснял. Напишете програма, която прочита време на изпит и време на пристигане и отпечатва дали студентът е дошъл навреме, дали е подранил или е закъснял и с колко часа или минути е подранил или закъснял.
Вход
От конзолата се четат 4 цели числа (по едно на ред), въведени от потребителя:
- Първият ред съдържа час на изпита - цяло число от 0 до 23;
- Вторият ред съдържа минута на изпита - цяло число от 0 до 59;
- Третият ред съдържа час на пристигане - цяло число от 0 до 23;
- Четвъртият ред съдържа минута на пристигане - цяло число от 0 до 59.
Изход
На първия ред отпечатайте:
- "Late", ако студентът пристига по-късно от часа на изпита;
- "On time", ако студентът пристига точно в часа на изпита или до 30 минути по-рано;
- "Early", ако студентът пристига повече от 30 минути преди часа на изпита.
Ако студентът пристига с поне минута разлика от часа на изпита, отпечатайте на следващия ред:
- "mm minutes before the start" за идване по-рано с по-малко от час;
- "hh:mm hours before the start" за подраняване с 1 час или повече. Минутите винаги печатайте с 2 цифри, например "1:05”;
- "mm minutes after the start" за закъснение под час;
- "hh:mm hours after the start" за закъснение от 1 час или повече. Минутите винаги печатайте с 2 цифри, например "1:03”.
Примерен вход и изход
Вход |
Изход |
|
Вход |
Изход |
|
Вход |
Изход |
9 30 9 50 |
Late 20 minutes after the start |
9 00 10 30 |
Late 1:30 hours after the start |
10 00 10 00 |
On time |
||
9 00 8 30 |
On time 30 minutes before the start |
|
14 00 13 55 |
On time 5 minutes before the start |
11 30 10 55 |
Early 35 minutes before the start |
|
16 00 15 00 |
Early 1:00 hours before the start |
|
11 30 8 12 |
Early 3:18 hours before the start |
11 30 12 29 |
Late 59 minutes after the start |
Може би има нещо, което не разбирам в логиката на задачата. Това е моето решение, което е грешно:
hour_of_exam = int(input())
minute_of_exam = int(input())
hour_of_arrival = int(input())
minute_of_arrival = int(input())
exam_time_in_minutes = (hour_of_exam * 60) + minute_of_exam
arrival_time_in_minutes = (hour_of_arrival * 60) + minute_of_arrival
hour = hour_of_exam // 60
minute = minute_of_exam % 60
difference = abs(exam_time_in_minutes - arrival_time_in_minutes)
if arrival_time_in_minutes == exam_time_in_minutes:
print("On time")
if arrival_time_in_minutes < exam_time_in_minutes:
if difference <= 30:
print("On time")
print(f"{minute:02d} minutes before the start")
else:
if difference <= 59:
print("Early")
print(f"{minute:02d} minutes before the start")
else:
print("Early")
print(f"{hour}:{minute:02d} hours before the start")
elif arrival_time_in_minutes > exam_time_in_minutes:
if difference <= 59:
print("Late")
print(f"{minute:02d} minutes after the start")
else:
print("Late")
print(f"{hour}:{minute:02d} hours after the start")
Не си отривам грешките, а решението ми няма кой знае колко разлика с това на преподавателя, освен в имената на променливите и структурата на проверките:
hour_of_exam = int(input())
minute_of_exam = int(input())
hour_of_arrive = int(input())
minute_of_arrive = int(input())
exam_time_in_minutes = (hour_of_exam * 60) + minute_of_exam
arrive_time_in_minutes = (hour_of_arrive * 60) + minute_of_arrive
diff = (exam_time_in_minutes - arrive_time_in_minutes)
hour = diff // 60
minutes = diff % 60
if exam_time_in_minutes == arrive_time_in_minutes:
print("On time")
elif exam_time_in_minutes > arrive_time_in_minutes:
if diff <= 30:
print("On time")
print(f"{diff} minutes before the start")
elif 30 < diff <= 59:
print("Early")
print(f"{diff} minutes before the start")
else:
print("Early")
print(f"{hour}:{minutes:02d} hours before the start")
elif arrive_time_in_minutes > exam_time_in_minutes:
if diff < 60:
print("Late")
print(f"{diff} minutes after the start")
else:
print("Late")
print(f"{hour}:{minutes:02d} hours after the start")
Дори това решение не премина всички тестове в judje, а при тестване на входни данни получавах и отрицателни числа. Също така не разбирам това с принтирането на часовете. При по-малко от час се изписва difference, а при повече hour и форматирана minute. Но разликата не е ли именно минутите? Къде е разликата? Моля ви да посочите грешките ми.
Много благодаря за помощта! Между другото, каква е разликата между abs и fabs и защо трябва да се вземе цялото число? Също, има ли значение дали при принтиране си написал difference или minute?
Няма функция math.abs(), има math.fabs(), справка: https://docs.python.org/3.8/library/math.html#math.fabs
Тя връща дробно число като резултат, а на нас ни трябват цели числа за минутите и часовете. Пробвай да видиш какво ще се получи, ако няма int(), a e само с math.fabs() - или дава резултат с .0 накрая, или гърми.
А относно difference или minute - при така написаното решение diff се ползва, ако общият брой на минутите са < 60, иначе се прилагат вече изчислените hour и minute.