Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2010 17:05:32

a123cvn4
От:
Зарегистрирован: 2010-09-16
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

Нужно написать программу в которую вводим римсое число а она выдает арабское. Например вводим 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.


кто знает где взять такой алгоритм или поможет?



Офлайн

#2 Сен. 16, 2010 17:35:14

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

sudo easy_install roman

>>> roman.fromRoman("LIX")
59
>>> roman.toRoman(59)
'LIX'



Офлайн

#3 Сен. 16, 2010 18:00:03

python4ik
От:
Зарегистрирован: 2010-01-05
Сообщения: 251
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

Один из вариантов:

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])
Может можно и попроще как-то сделать



Офлайн

#4 Сен. 16, 2010 18:06:49

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

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



Офлайн

#5 Сен. 16, 2010 18:33:43

python4ik
От:
Зарегистрирован: 2010-01-05
Сообщения: 251
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

Вот что-то похожее:

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])



Офлайн

#6 Сен. 16, 2010 19:37:02

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

python4ik, ты прикалываешься или серьезно?)



Офлайн

#7 Сен. 16, 2010 19:52:58

python4ik
От:
Зарегистрирован: 2010-01-05
Сообщения: 251
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

Прикалываюсь серьёзно! Честно? Давно не тренировался на Питоне писать! Решил вспомнить. Вникаю пока что чуть в другой язык.



Офлайн

#8 Сен. 17, 2010 01:40:28

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

Из того, что быстро придумалось:

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)

Офлайн

#9 Сен. 17, 2010 07:47:22

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

вариант из восьмого поста выглядит несколько сомнительно - если есть повторяющиеся символы, каким образом 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)

Офлайн

#10 Сен. 17, 2010 10:52:03

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

нужно сделать перевод римских чисел в арабские

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version