Я решил конкурсную задачу, но не смог ее отправить, поскольку не могу воспроизвести входные данные, встроенные в интерфейс конкурса. Ввод определяется четырьмя строками, каждая из которых может быть пустой, но имеет в конце символ разрыва строки (я думаю, «\n»). Если не пусто, строки состоят из 3-х буквенных дней недели с 1 пробелом между:
MON\n
MON WED\n
\n
FRI THU SUN\n
Я пробовал:
text = []
while True:
line = input()
if line:
text.append(line)
else:
break
text = [line.rstrip() for line in text]
Но для того, чтобы условие останова сработало, требуется ввести ввод пятый раз, что приводит к сбою решения. Я не уверен, считает ли компилятор строки, содержащие только «\n», не пустыми. sys.stdin.readlines()
требует CTRL-D после ввода, поэтому его нельзя использовать. Мне нужно ввести 4 строки с "\n" в конце (независимо от того, пусты они или полны), чтобы поместить их в список (в идеале список списков):
[['WED', 'FRI'], ['MON', 'TUE'], [], ['MON', 'WED', 'THU', 'SAT', 'FRI', 'SUN', 'TUE']] # ideally
['WED FRI', 'MON TUE', '', 'MON WED THU SAT FRI SUN TUE'] # also okay
Кроме того, я проверил вводимые данные из системы соревнований в консоли отладки PyCharm. В любом случае, я ввел, знак «\n» не удалился из строк. Как заставить отладчик понимать знак «\n»?
MON\n
MON"\n"
MON'\n'
"MON\n" # neither of them cleared the "\n" from the string.
@OneCricketeer, спасибо за совет, но система ввода конкурса, к сожалению, не позволяет применять файлы для ввода.
Вероятно, именно так система уже подает входные данные. Я говорил не вводить данные явно, когда вы пытаетесь запустить их локально. Код, который у вас есть, выглядит нормально, за исключением разделения дней
Если «Ввод определен как 4 строки», то вам определенно не нужен цикл while
с условием выхода; используйте цикл for
, который выполняется четыре раза, или просто четыре input()
, каждый из которых присваивается переменной.
@OneCricketeer, Ааа, понял твою точку зрения. Да, возможно, это может помочь, но, видите ли, я попробовал все это, чтобы воспроизвести входные данные конкурсной системы. С моим участием моя задача успешно решена.
@jasonharper, спасибо, это было как-то очевидно, но все же... :D И все же - а что, если нет? Что делать, если количество строк не определено?
Насколько я знаю, нет возможности войти '\n'
с помощью функции input
. Когда вы нажимаете клавишу ввода или вставляете символ '\n'
в командную строку, функция ввода прекращает возвращать символы до этой точки, но не включая символ новой строки.
Должно быть НЕКОТОРОЕ явное указание на конец ввода, иначе проблема не будет разрешима. Завершение на пустой строке работает только в том случае, если в середине ввода не может быть пустой строки. Другие параметры включают в себя первую строку ввода, которая указывает количество дальнейших строк для чтения или чтение до определенной строки, например «КОНЕЦ».
@jasonharper, спасибо. Ведь, похоже, это не я туплю, это просто невозможно без дополнительного ввода ввода или указания количества итераций.
Что на самом деле говорит вопрос конкурса о том, каким методом он подает входные данные в тестируемую программу? Это через стандартный ввод, в качестве аргумента командной строки, что-то еще...?
@CrazyChucky, это не так :) Только время (1 секунда), размер памяти (256 МБ), версия компилятора (3.10.6) и описание, которое я упомянул выше.
Если это не указано в самом вопросе, я надеюсь, что это стандартное правило для вопросов на любом сайте, на котором вы его нашли... Например, я видел сайты с вызовами кода, которые ожидают, что вы создадите функцию с именем solution
, которая принимает вход в качестве аргумента. Если нигде в вопросе или остальной части сайта не говорится, как будет тестироваться ваш код, то я не знаю, как они ожидают, что люди решат эти задачи.
@CrazyChucky, ну в этом случае обычно требуют ввод через стандартные функции.
Если я правильно понял, вы хотите прочитать ввод с консоли и сохранить его в списке списков. в этом случае, поскольку всегда есть 4 строки ввода, вы могли бы сделать это вот так
text = []
for _ in range(4):
line = [weekday for weekday in input().split()]
text.append(line)
print(text)
так, например, если ввод в консоли
Wed Thu Fri
Sat Sun Mon Tue
Tue Sun
тогда значение печатаемого текста равно [['Wed', 'Thu', 'Fri'], [], ['Sat', 'Sun', 'Mon', 'Tue'], ['Tue', 'Sun']]
И если по какой-либо причине количество строк может быть больше 4, то в этом случае необходимо будет указать количество строк, и поэтому код станет таким
text = []
num_lines = int(input())
for _ in range(num_lines):
line = [weekday for weekday in input().split()]
text.append(line)
print(text)
Надеюсь, это то, что вы искали.
Можно упростить до text.append(input().split())
или text = [input().split() for _ in range(4)]
.
@OneCricketeer, я думаю, поскольку я не хотел, чтобы это был один лайнер, мне понравилось, чтобы было ясно, иначе text = [input().split() for _ in range(num_lines)]
должен помочь
Создайте внешний файл. Запустите
python main.py < input.txt
для четырехстрочного файла.