Ошибка чтения входных данных
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 шт):
Похоже, что в вашем примере, который вы используете для проверки последней стоит пустая строка. И поэтому срабатывает break в проверке
if inp == "":
А вот на курсе такого нет. И вы пытаетесь читать строку, когда уже достигнут конец файла (потока). О чем и получаете ошибку.
В общем случае правильным было бы добавить еще проверку и на EOF. Но в вашем учебном примере будет достаточно считать число строк - так как вы знаете, сколько их должно всего быть. Да и в условии задачи говорится, что строк в исходных данных может быть больше, чем указано в первой строке. Т.е. если вы не будете это учитывать, то считаете "лишнего" и ваш результат будет неправильным.
Самое простое, это перед чтением проверять что еще нужно считать строку, а при чтении строки вычитать из num единицу.
if num <= 0:
break
inp = input()
num = num - 1
#... дальше операции с inp ...
Все это делается гораздо проще:
n, *l = open(0)
l = [max(map(int, i.split())) for i in l]
print(';'.join(map(str, sorted(l)))
Весь список можно спокойно считать с потока через open(0)
(он считывает все из stdin до EOF'а как раз), да и остальную работу поместить в две строчки.
Раз уж все стали код писать. Незачем читать лишние строки и потом отрезать их от результата. Читайте ровно столько строк, сколько вам указано во вводе, не читайте лишнего. И не полагайтесь на то, что в конце будет пустая строка. Вот вам однострочник по приколу:
print(*sorted((max(int(spin) for spin in input().split()) for _ in range(int(input()))), reverse=True), sep=';')
Ответ был получен. Не совсем верно понял задание, а именно
причем самих записей может быть больше чем это число, это нужно учесть.
отсюда и неправильный алгоритм. Если изменить мой код следующим образом, то такое решение сработает:
num = int(input())
n = 0
while n < num:...