Ошибка чтения входных данных

IDE выполняет код корректно, но онлайн интерпретатор на курсе выдает ошибку:

line 6, inp = input() EOFError: EOF when reading a line

Объясните почему так происходит. onlinegdb код тоже успешно выполняет. Обработка исключения с помощью конструкции try - except тоже не помогает, появляется ошибка превышения времени выполнения. Видимо, такое заданием не предусмотрено. Задание звучит следующим образом:

Необходимо написать программу, которая будет считывать последовательности измерений. В каждой последовательности нужно выбрать максимальное значение, а в итоге вывести отсортированный по убыванию список этих макс значений, разделенных символом “;”. Во входных данных в первой строке будет задано целое положительное число – сколько записей нужно обработать, причем самих записей может быть больше чем это число, это нужно учесть. Значения в рамках одной записи разделены пробелом, минимальное число значений в записи – 1. Записи разделены переводом строки.

num = int(input())
lst, between = [], []
while True:
    inp = input()
    if inp == "":
        break
    else:
        for spin in inp.split():
            between.append(int(spin))
        lst.append(max(between))
        between.clear()
print(*sorted(lst[:num], reverse=True), sep=';')

Ответы (4 шт):

Автор решения: Vladimir Ignatenko

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

if inp == "":

А вот на курсе такого нет. И вы пытаетесь читать строку, когда уже достигнут конец файла (потока). О чем и получаете ошибку.

В общем случае правильным было бы добавить еще проверку и на EOF. Но в вашем учебном примере будет достаточно считать число строк - так как вы знаете, сколько их должно всего быть. Да и в условии задачи говорится, что строк в исходных данных может быть больше, чем указано в первой строке. Т.е. если вы не будете это учитывать, то считаете "лишнего" и ваш результат будет неправильным.

Самое простое, это перед чтением проверять что еще нужно считать строку, а при чтении строки вычитать из num единицу.

if num <= 0:
    break

inp = input()
num = num - 1
#... дальше операции с inp ...
→ Ссылка
Автор решения: Глeб

Все это делается гораздо проще:

n, *l = open(0)
l = [max(map(int, i.split())) for i in l]
print(';'.join(map(str, sorted(l)))

Весь список можно спокойно считать с потока через open(0) (он считывает все из stdin до EOF'а как раз), да и остальную работу поместить в две строчки.

→ Ссылка
Автор решения: CrazyElf

Раз уж все стали код писать. Незачем читать лишние строки и потом отрезать их от результата. Читайте ровно столько строк, сколько вам указано во вводе, не читайте лишнего. И не полагайтесь на то, что в конце будет пустая строка. Вот вам однострочник по приколу:

print(*sorted((max(int(spin) for spin in input().split()) for _ in range(int(input()))), reverse=True), sep=';')
→ Ссылка
Автор решения: Paradise

Ответ был получен. Не совсем верно понял задание, а именно

причем самих записей может быть больше чем это число, это нужно учесть.

отсюда и неправильный алгоритм. Если изменить мой код следующим образом, то такое решение сработает:

num = int(input())
n = 0
while n < num:...
→ Ссылка