Задача валидации отрезков времени

Рейтинг: 0Ответов: 1Опубликовано: 31.01.2023

Вход:

  • Первая строка входных данных содержит количество наборов тестовых
    данных. Затем следуют 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

Ответы

▲ 0

Если все правильно понял:

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)