На вход подаётся текст (строка произвольной длины). Выведите сколько раз в этом тексте встречается имя Иван. Требования: Учитываются только точные совпадения слова "Иван" (без учета регистра, но без учета частей слов, например, "Иванов" не считается). Имя "Иван" может встречаться в любом месте текста и в любом регистре: "Иван", "иван", "ИВАН" и т.п. Знаки препинания, стоящие рядом, не мешают определению слова. Проверка вашей программы осуществляется с использованием наших тестовых данных, поэтому вывод в консоли может отличаться от введённых вами значений. Проверяется: Использование метода .lower() — программа должна преобразовать текст к нижнему регистру. Использование метода .count() — программа должна подсчитывать количество вхождений. Соответствие ответа правильному.
Цель решения: понять по шагам, как посчитать точно отдельно стоящие слова Иван в произвольном тексте, без учёта регистра и без подсчета части слова (например, Иванов не считается). Также учтём условия проверки (.lower() и .count()).
Подход (пошагово):
- Привести входной текст к нижнему регистру (используем .lower()).
- Заменить все символы, которые не являются русскими буквами, на пробелы. Это позволяет трактовать знаки препинания как разделители слов.
- Разбить строку на слова по пробелам и отбросить пустые элементы.
- Посчитать количество слов, равных "иван", с помощью метода .count() на списке слов. Это обеспечивает точное совпадение слова, а не вхождение части слова.
Пример реализации на Python (со строгим использованием .lower() и .count()):
import re
text = input() # входной текст (одна строка)
lower_text = text.lower()
# заменить все не-русские буквы на пробелы (оставляем а-я и ё)
normalized = re.sub(r'[^а-яё]', ' ', lower_text)
# получить список слов
words = [w for w in normalized.split() if w]
# посчитать точные совпадения слова "иван"
count = words.count('иван')
print(count)
Пояснения по коду:
- re.sub(r'[^а-яё]', ' ', lower_text) заменяет любые символы, не являющиеся кириллицей (включая пробелы, знаки препинания, цифры и т. д.), на пробелы. Это позволяет корректно отделять слова, и при этом не считать "(Иванов)" как слово "иван".
- words.count('иван') подсчитывает число элементов списка, равных exactly "иван" (после приведения к нижнему регистру и разбиения на слова).
Примеры:
- Ввод: "Иван, иванов! Иван." -> слова: ['иван', 'иванов', 'иван']; count = 2.
- Ввод: "Иван ивана, ИВАН." -> слова: ['иван', 'ивана', 'иван']; count = 2.
- Ввод: "ИвАнОв и Иван" -> слова: ['иванов', 'иван']; count = 1.
Сложность:
- Время: O(n), где n — длина входной строки (нужно пройти по символам и затем разобрать слова).
- Память: O(k), где k — количество слов после разбиения.
Если хочешь, могу адаптировать код под другую среду (например, без модуля re) или показать альтернативу на другом языке.