но и правильно конвертировать он как бы тоже не будет.
попробовал до 100000 вроде работает корректно (проверял по числам с картинки https://cs4.pikabu.r...115442438.jpg),
можете предложить число на котором он споткнется при условии что все римские цифры будут объявлены в alpha?
Так что если хотите Решить Задачку Вам придется еще немножко Поразбираться
я с кодом поразбирался поверхностно, т.к. не питонист
путем вставки трассирующих сообщений:
from math import sqrt
alpha = "IVXLCDMFGLRDM"
raz = lambda n, s: (n % 5 >> n % 5 // 4 * 2) * alpha[s]
dva = lambda n, s: (3 < n) * alpha[s + (3 < n) + (8 < n)]
tri = lambda n, s: ((4 == n) or (9 == n)) and ''.join(reversed(s)) or s
poehali = lambda n, s: tri(n, dva(n, s) + raz(n, s))
def Mr_Bool(data, s = 0, conc = ""):
print('------------------------------------------------')
print('Params:')
print(data, s, conc)
d, m = divmod(data, 10)
print('after div:', d, m)
print(d, m)
print(m, s)
print('raz('+str(m) +', '+ str(s)+'): ' + raz(m, s))
print('dva('+str(m) +', '+ str(s)+'): ' + dva(m, s))
text = poehali(m, s) + conc
print('text: ' + text)
r = d and Mr_Bool(d, s + 2, text) or text
print('result: ' + r)
return r
a = input()
b = Mr_Bool(a)
print a,"=>",b
по поводу попытки понять код, я его понимаю так (повторяю я не питонист):
основа:
число делится на 10
d - частное
m - остаток
т.к. римские числа строятся на базовых числах 1 и 5 и кратных им по 10, т.е.: 1,5,10,50,100,500 и т.д.
имеются два метода один для вычисления единичных символов, например символ I (используется в I,II,III,IV,VI,VII,VIII,IX)
второй метод для вычисления 5 и 10
третий метод используется для переворвачивания строк в случае если число его квадратный корень целочисленный (хотя наверное тут можно было бы сравнивать с 4 и 9 в моем примере сделал так), думаю код работал бы быстрее
ну и четвертый метод собственно все собирает в месте - перевод одной десятичной цифры в римские
рекурсивный метод Mr_Bool выполняет все эти действия для каждой цифры путем деления исходного числа в каждой итерации на 10 пока не останется 0
при этом есть код: s + 2
он необходим для позиционирования в массиве alpha на цифрах отвечающих за 10,100,1000 и т.д. и собственно этот индекс и выходил за пределы массива когда пытались получить результат для 4000
ЗЫ: то что у меня в alpha - это просто набор символов, которые будут использоваться в результате - сами эти символы не корректные для римских чисел, я вписывал их только для того чтоб проверить работу алгоритма на больших числах и сопоставлял результат с картинкой адрес которой приведен выше
Сообщение отредактировал Nurlan74: 08.10.2019, 02:10:58