Форум сайта python.su
Нужно написать программу в которую вводим римсое число а она выдает арабское. Например вводим I она выдаеи 1.. вводим V выдает 5. Вводим X выдает 10… вводим XVII выдает 17 и так далее.
нужно использовать 10 римских цифр: I =1 V =5 X = 10 L = 50 C = 100 D = 500 M = 1000. например ввели LIX оно выдало 59.
кто знает где взять такой алгоритм или поможет?
Офлайн
sudo easy_install roman
>>> roman.fromRoman("LIX")
59
>>> roman.toRoman(59)
'LIX'
Офлайн
Один из вариантов:
d={'I':'1','V':'5','X':'10','L':'50','C':'100','M':'1000'}
def func(*arg):
r=[]
for x in arg[0]:
if x in d:
r.append(d[x])
return reduce(lambda x,y:x+y,[int(z) for z in r])
Офлайн
python4ikнеправильно работает
Один из вариантов:Может можно и попроще как-то сделатьd={'I':'1','V':'5','X':'10','L':'50','C':'100','M':'1000'}
def func(*arg):
r=[]
for x in arg[0]:
if x in d:
r.append(d[x])
return reduce(lambda x,y:x+y,[int(z) for z in r])
Офлайн
Вот что-то похожее:
def func(*arg):
a=arg[0]
r=[]
if 'IX' in a:
r.append(9)
a=a.replace('IX','')
for x in a:
if x in d:
r.append(d[x])
return reduce(lambda x,y:x+y,[int(z) for z in r])
Офлайн
python4ik, ты прикалываешься или серьезно?)
Офлайн
Прикалываюсь серьёзно! Честно? Давно не тренировался на Питоне писать! Решил вспомнить. Вникаю пока что чуть в другой язык.
Офлайн
Из того, что быстро придумалось:
def roman2arabic(roman):
digit = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
arabic = 0
for d in roman:
try:
if digit[d]<=digit[roman[roman.find(d)+1]]:
arabic-=digit[d]
else:
arabic+=digit[d]
except IndexError:
arabic+=digit[d]
return arabic
Отредактировано (Сен. 17, 2010 01:41:59)
Офлайн
вариант из восьмого поста выглядит несколько сомнительно - если есть повторяющиеся символы, каким образом find определит, какой именно символ ищется? Вот вариант записанный немного короче и без find:
from operator import add
def roman2arabic(roman):
d = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
if roman:
return reduce(add, ((-d[x], d[x])[y is None or d[x] >= d[y]] for x, y in map(None, roman, roman[1:])))
from operator import add
from functools import reduce
from itertools import zip_longest
def roman2arabic(roman):
d = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
if roman:
return reduce(add, ((-d[x], d[x])[y is None or d[x] >= d[y]] for x, y in zip_longest(roman, roman[1:])))
Отредактировано (Сен. 17, 2010 08:13:37)
Офлайн
pyuserДа, действительно, вы правы. Ну я же говорю, что это то, что сходу придумалось за 5 минут. Если немного подправить, то будет вполне сносно работать:
каким образом find определит, какой именно символ ищется?
def roman2arabic(roman):
digit = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}
arabic = 0
for d in xrange(len(roman)):
try:
if digit[roman[d]]<digit[roman[d+1]]:
arabic-=digit[roman[d]]
else:
arabic+=digit[roman[d]]
except IndexError:
arabic+=digit[roman[d]]
return arabic
Офлайн