Местный провайдер собирает большое количество логов, однако зачастую файлы с отчётами приходят в негодность.
Самые частые проблемы — ошибки вида ##
и @@@
.
Напишите программу, которая избавляется от:
- Двух символов
#
в начале информационных сообщений; - Строк, заканчивающихся тремя символами
@
.
Формат ввода
Вводятся строки отчёта. Признаком завершения ввода считается пустая строка.
Формат вывода:
Очищенные данные.
Пример
Ввод
Hello, world
Hello, @@@
##Goodbye
Вывод
Hello, world
Goodbye
Ввод
First Message
##Second Message
@@@Third Message##
##Fourth Message@@@
Вывод
First Message
Second Message
@@@Third Message##
Решение
Задача проще чем кажется на первый взгляд. Если не пытаться усложнять, то нужно проверить всего два условия:
1) строка начнинается с двух символов # (##) – отрезаем первые два символа
2) строка заканчивается тремя символами @ (@@@) – пропускаем строку.
Задачу можно решить с помощью срезов или с помощью методов startswith/endswith
Эту задачу выгоднее начинать решать с последнего условия.
Посмотреть код
Решение
# Срезы
while string := input():
if string[-3:] != '@@@':
if string[0:2] == '##':
string = string[2:]
print(string)
Решение
# Методы
while string := input():
if not string.endswith('@@@'):
if string.startswith('##'):
string = string[2:]
print(string)
Доброго времени суток!
В Хендбуке часто встречаются задачи с “потоковым” вводом данных (как и в данной задаче). Но нет, как мне кажется, очень важного пояснения, что программа либо должна выводить результат по окончанию ввода данных (то есть нам необходимо задействовать дополнительную память), либо данные могут выводится сразу не дожидаясь последующего ввода.
Ввод:
Hello, world
Hello, @@@
##Goodbye
Вывод “1” (как в примере)
Hello, world
Goodbye
Вывод “2”
Hello, world
Hello, world
Hello, @@@
##Goodbye
Goodbye
Если судить по примерам из Хендбука, то напрашивается вывод данных по окончанию ввода:
list_string = []
while (string := input()) != ”:
if string[-3:] == ‘@@@’:
continue
elif string[:2] == ‘##’:
list_string.append(string[2:])
else:
list_string.append(string)
for string in list_string:
print(string)
Возможно я ошибаюсь.
Накапливать данные или обрабатывать их сразу во многом вопрос философский.
Требование накапливать данные возникает в том случае, когда вам придется дополнительно модифицировать или как-то еще обрабатывать данные в будущем. То есть при многократном использовании этих самых данных.
Но бывают ситуации, когда требование обратное – у нас мало памяти, нам надо преобразовать данные и отдать их, чтобы получить следующую порцию и работать уже с ней.
И все это случается в рамках потоковых данных.
В решениях, которые я представляю для ознакомления используются оба подхода. Просто в этой задаче, на мой взгляд, важнее сконцентрироваться на самой обработке, чем на накоплении данных.
И если уж на то пошло:
Скорее как-то так. Не люблю continue и break там где можно обойтись без них.
Спасибо за ответ! Претензий к Вашим решениям ни в коем случае не подразумевалось. Это лишь небольшой крик души когда не до конца понятно, какой именно ответ от тебя ожидают в Хендбуке))) Просто если бы писали вывод очищенного после полного ввода текста, пришлось бы задействовать дополнительную память чтобы его запомнить, а если в условии допускается чистить в процессе ввода, то конечно глупо использовать дополнительные ресурсы.