Задача валидации отрезков времени
Вход:
Первая строка входных данных содержит количество наборов тестовых
данных. Затем следуют t наборов.Первая строка набора содержит n отрезков времени. В следующих n
строках следуют описания отрезков.
Условия:
- часы, минуты и секунды заданы корректно (то есть часы находятся в промежутке от 0 до 23, а минуты и секунды — в промежутке от 0 до 59);
- левая граница отрезка находится не позже его правой границы (но границы могут быть равны);
- никакая пара отрезков не пересекается(даже в граничных моментах времени).
Задача - Необходимо проверить входящие интервалы на данные условия. В случае, если все условия выполняются, то вывести 'YES', иначе вывести 'NO'.
Я написал следующий код:
from typing import List
def validate_intervals(intervals: List[List[str]]):
intervals_in_seconds = []
for interval in intervals:
start, end = interval.split("-")
start_hours, start_minutes, start_seconds = [int(x) for x in start.split(":")]
end_hours, end_minutes, end_seconds = [int(x) for x in end.split(":")]
if not (0 <= start_hours < 24 and 0 <= start_minutes < 60 and 0 <= start_seconds < 60)\
and not (0 <= end_hours < 24 and 0 <= end_minutes < 60 and 0 <= end_seconds < 60):
return "NO"
start_in_seconds = start_hours * 3600 + start_minutes * 60 + start_seconds
end_in_seconds = end_hours * 3600 + end_minutes * 60 + end_seconds
if start_in_seconds > end_in_seconds:
return "NO"
intervals_in_seconds.append((start_in_seconds, end_in_seconds))
intervals_in_seconds.sort(key=lambda x: x[0])
for i in range(1, len(intervals_in_seconds)):
if intervals_in_seconds[i-1][1] < intervals_in_seconds[i][0]:
return "NO"
return "YES"
def prepare_tests() -> List[List[int]]:
all_test_intervals = []
test_count = int(input())
for i in range(test_count):
intervals = []
intervals_amount = int(input())
for _ in range(intervals_amount):
interval = input()
intervals.append(interval)
all_test_intervals.append(intervals)
return all_test_intervals
if __name__ == '__main__':
tests = prepare_tests()
for t in tests:
print(validate_intervals(t))
input
6
1
02:46:00-03:14:59
2
23:59:59-23:59:59
00:00:00-23:59:58
2
23:59:58-23:59:59
00:00:00-23:59:58
2
23:59:59-23:59:58
00:00:00-23:59:57
6
17:53:39-20:20:02
10:39:17-11:00:52
08:42:47-09:02:14
09:44:26-10:21:41
00:46:17-02:07:19
22:42:50-23:17:46
1
24:00:00-23:59:59
output должен быть такой
YES
YES
NO
NO
YES
NO
но он такой
YES
NO
YES
NO
NO
NO
Ответы (1 шт):
Автор решения: Leksor
→ Ссылка
Если все правильно понял:
from typing import List
def time_to_seconds(time: str) -> int:
hours, minutes, seconds = [int(x) for x in time.split(":")]
if not (0 <= hours < 24 and 0 <= minutes < 60 and 0 <= seconds < 60):
return -1
return hours * 3600 + minutes * 60 + seconds
def validate_intervals(intervals: List[str]) -> str:
end_times = set()
for interval in intervals:
start, end = interval.split("-")
start_time = time_to_seconds(start)
end_time = time_to_seconds(end)
if start_time == -1 or end_time == -1 or start_time >= end_time:
return "NO"
if end_times and max(end_times) >= start_time:
return "NO"
end_times.add(end_time)
return "YES"
def prepare_tests() -> List[List[int]]:
t = int(input().strip())
all_test_intervals = []
for i in range(t):
n = int(input().strip())
test_intervals = []
for j in range(n):
test_intervals.append(input().strip())
all_test_intervals.append(test_intervals)
return all_test_intervals
if __name__ == '__main__':
test_cases = prepare_tests()
for test_case in test_cases:
result = validate_intervals(test_case)
print(result)