Онлайн-расчет времени покрытия для временного диапазона - PullRequest
1 голос
/ 31 октября 2019

Предположим, у меня есть временной диапазон, он может быть представлен видео как время его начала (0 с) и время его окончания. Например, с видео, которое длится 1 минуту, у меня есть диапазон времени, который идет от 0 до 60 с.

Предположим, у меня есть онлайн-поток, который отправляет мне временные интервалы, подобные этому:

[0, 10]
[8, 14]
[2, 3]
[20, 25]

Предположим, что эти интервалы представляют время, прошедшее при воспроизведении видео. Я хотел бы вычислить, каждый раз, когда приходит новый интервал, эффективное время воспроизведения видео без повторений.

Это должно быть примерно так:

[0, 10]
#time_played = 10s
[8, 14]
#time_played = 14s because [0,10]+[8,14] -> [0,14] is the effective time interval
[2, 3]
#time_played = 14s because this time interval has already been covered
[20, 25]
#time_played = 19s because [0, 14] + [20, 25] makes 19s the video was effectively played

Я не могу найти решениепотому что я не знаю, что такое определение проблемы. Как вы думаете, может быть разумным способом решить эту проблему, используя python

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вы можете добавить все времена, которые были переданы в массив, а затем получить длину массива следующим образом.

times = []
def get_time(interval = None): # If we don't pass the interval it will return the current time passed
    if interval:
        for time in range(interval[0], interval[1]):
            if time not in times: # Don't append to the array if we already have the time value
                times.append(time)
    return len(times) # Return the length of the array of times


print(get_time([0, 10]))
#time_played = 10s
print(get_time([8, 14]))
#time_played = 14s because [0,10]+[8,14] -> [0,14] is the effective time interval
print(get_time([2, 3]))
#time_played = 14s because this time interval has already been covered
print(get_time([20, 25]))
#time_played = 19s because [0, 14] + [20, 25] makes 19s the video was effectively played

## Expected output:
## 10
## 14
## 14
## 19

Надеюсь, это полезно ?

0 голосов
/ 31 октября 2019

Вот мой новый ответ. Функция get time делает несколько вещей: 1, вычисляя время: Functon создает локальный список с именем times и добавляет к нему значения времени (как в предыдущем ответе, но на этот раз мы используем локальный список, поэтому он неЭто не занимает много памяти), учитывая все previous_intervals и интервалы, передаваемые функции. Затем он экономит время воспроизведения до переменной с именем time_played. Это то, что будет возвращено позже. 2, вычисляя previous_intervals - переменная previous_intervals очищается тогда, если число раз больше 0 (чтобы избежать pop(0) повышения IndexError, если нет, то previous_intervals в любом случае пустые)Программа отсортирует время и выяснит все интервалы, необходимые для создания списка времени, которое там есть. Затем он сохранит значение в previous_intervals для следующего запуска функции 3, возвращая - программа вернет переменную time_played, которую мы создали ранее. Он не возвращает len(times), так как с тех пор, как мы выделили предмет, это будет неправильно в большинстве случаев;однако, это не будет неправильным, если не прошло ни одной секунды (т. е. пройденный интервал был [0, 0]), поэтому мы также не можем вернуть len(times) + 1.

Особая благодарность Диармуиду О'Брайну, который ответил на Пары из единого списка , помог мне написать previous_intervals расчет

previous_intervals = []
def get_time(*intervals):
    global previous_intervals
    times = []
    intervals = list(intervals) + previous_intervals
    for interval in intervals:
        for time in range(interval[0], interval[1]):
            if time not in times:
                times.append(time)

    time_played = len(times)

    previous_intervals = []
    if len(times) > 0:
        times.sort()
        lastTime = times.pop(0)
        important_intervals = [lastTime]
        for time in times:
            if time != lastTime + 1:
                important_intervals.append(lastTime + 1)
                important_intervals.append(time)
            lastTime = time
        important_intervals.append(lastTime + 1)
        while(important_intervals):
            start_time = important_intervals.pop(0)
            end_time = important_intervals.pop(0)
            previous_intervals.append([start_time,end_time])


    return time_played

print(get_time([0, 0]))
#time_played = 0s, not 1s as would happen if we returned len(times) with correction for the missing values
print(get_time([0, 0], [1, 1]))
#time_played = 0s, we can now pass multiple intervals. ([0, 0] = No time passed + [1, 1] = No time passed, so even though this may look odd it's totally correct)
print(get_time([0, 10]))
#time_played = 10s
print(get_time([8, 14]))
#time_played = 14s because [0,10]+[8,14] -> [0,14] is the effective time interval
print(get_time([2, 3]))
#time_played = 14s because this time interval has already been covered
print(get_time([20, 25]))
#time_played = 19s because [0, 14] + [20, 25] makes 19s the video was effectively played

## Expected output:
## 0
## 0
## 10
## 14
## 14
## 19

Надеюсь, это полезно helpful

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...