Во фрагменте текста (текстовый файл) для красоты решили записать все натуральные числа (годы, номера королей) римскими числами. Известно, что числа там встречаются от 1 до 3100. Напишите программу, которая введет с клавиатуры имя текстового файла в кодировке UTF-8, переведет все такие числа в римскую запись (по правилам Шварцмана) и выведет текст с заменой их записи на экран. Учтите, что даты и дробные числа преобразовывать нельзя – хотя цифры там есть. Напоминаем: - Римские целые числа записываются буквами I,V,X и некоторыми другими - Числа написанные с уменьшением значения слева направо - суммируются (VI - 6), с уменьшением справа налево - вычитаются (IX - 9). - Количество символов в записи должно быть минимальным - Больше 3 одинаковых символов подряд писать нельзя.
Обратите внимание: все данные для работы программы поступают из стандартного потока ввода (в Python используется функция input() ), каждый параметр - отдельной строкой. Все результаты выводятся в стандартный поток вывода ( в Python используется функция print() ). Пожалуйста учтите, что весь вывод программы будет сравниваться с ответом, не выводите лишние комментарии.Во фрагменте текста (текстовый файл) для красоты решили записать все натуральные числа (годы, номера королей) римскими числами. Известно, что числа там встречаются от 1 до 3100. Напишите программу, которая введет с клавиатуры имя текстового файла в кодировке UTF-8, переведет все такие числа в римскую запись (по правилам Шварцмана) и выведет текст с заменой их записи на экран. Учтите, что даты и дробные числа преобразовывать нельзя – хотя цифры там есть. Напоминаем: - Римские целые числа записываются буквами I,V,X и некоторыми другими - Числа написанные с уменьшением значения слева направо - суммируются (VI - 6), с уменьшением справа налево - вычитаются (IX - 9). - Количество символов в записи должно быть минимальным - Больше 3 одинаковых символов подряд писать нельзя.
Обратите внимание: все данные для работы программы поступают из стандартного потока ввода (в Python используется функция input() ), каждый параметр - отдельной строкой. Все результаты выводятся в стандартный поток вывода ( в Python используется функция print() ). Пожалуйста учтите, что весь вывод программы будет сравниваться с ответом, не выводите лишние комментарии.
Ответы
Ответ:
import re
text = open('имяфайла.txt', 'r', encoding='utf8').read()
#как-то получаем текст, например из файла
def convert(n):
result = ''
for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
'M CM D CD C XC L XL X IX V IV I'.split()):
result += n // arabic * roman
n %= arabic
return result
for num in re.findall(' \d+ *', text):
n = int(num.strip())
if n < 1 or n > 3100: continue
text = text.replace(num, ' ' + convert(n) + ' ' if num.endswith(' ') else '')
print(text)
Объяснение:
получаем текст
с помощью регекса ищем цифры с пробелами перед и возможно после цифры
т.е. отсеиваем дробные числа и даты
далее отсеиваем числа которые не от 1 до 3100
потом конвертируем число в римские, и печатаем результат