Найти - Пользователи
Полная версия: нужно сделать перевод римских чисел в арабские
Начало » Python для новичков » нужно сделать перевод римских чисел в арабские
1 2
a123cvn4
Нужно написать программу в которую вводим римсое число а она выдает арабское. Например вводим 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.


кто знает где взять такой алгоритм или поможет?
Zubchick
sudo easy_install roman
>>> roman.fromRoman("LIX")
59
>>> roman.toRoman(59)
'LIX'
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])
Может можно и попроще как-то сделать
Zubchick
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])
Может можно и попроще как-то сделать
неправильно работает

>>> func(“LIX”)
61
python4ik
Вот что-то похожее:
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])
Zubchick
python4ik, ты прикалываешься или серьезно?)
python4ik
Прикалываюсь серьёзно! Честно? Давно не тренировался на Питоне писать! Решил вспомнить. Вникаю пока что чуть в другой язык.
Vader
Из того, что быстро придумалось:
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
А вобще, готовых решений в гугле полно :)
pyuser
вариант из восьмого поста выглядит несколько сомнительно - если есть повторяющиеся символы, каким образом 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:])))
Vader
pyuser
каким образом find определит, какой именно символ ищется?
Да, действительно, вы правы. Ну я же говорю, что это то, что сходу придумалось за 5 минут. Если немного подправить, то будет вполне сносно работать:
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB