这个Roman Number to Integer转换器代码可以更短吗?

YOU*_*YOU 6 language-agnostic roman-numerals

目前在python中有95个字节

I,V,X,L,C,D,M,R,r=1,5,10,50,100,500,1000,vars(),lambda x:reduce(lambda T,x:T+R[x]-T%R[x]*2,x,0)
Run Code Online (Sandbox Code Playgroud)

以下是一些测试结果,它应该适用于1到3999(假设输入仅为有效字符)

>>> r("I")
1
>>> r("MCXI")
1111
>>> r("MMCCXXII")
2222
>>> r("MMMCCCXXXIII")
3333
>>> r("MMMDCCCLXXXVIII")
3888
>>> r("MMMCMXCIX")
3999
Run Code Online (Sandbox Code Playgroud)

这是不是有重复的这个,这是相反的一个.

那么,是否可以在Python中缩短它,或者像ruby这样的其他语言可以做得更短?

A. *_*Rex 7

来自codegolf.com的最短解决方案

不久前在Code Golf举行了" 罗马到十进制 "竞赛.(嗯,实际上它仍在运行,因为它们永远不会结束.)一位名叫eyepopslikeamosquito的 Perl高尔夫球手决定赢得所有四种语言(Perl,PHP,Python和Ruby),所以他做到了.他写了一个迷人的四部分系列" 球场看起来很棒,我的挥杆感觉很好,我很喜欢我的机会 "(第二部分,第三部分,第四部分描述他的方法在以上),Perl的僧人.

以下是他的解决方案:

红宝石,53招

n=1;$.+=n/2-n%n=10**(494254%C/9)%4999while C=getc;p$.
Run Code Online (Sandbox Code Playgroud)

Perl,58招

$\+=$z-2*$z%($z=10**(19&654115/ord)%1645)for<>=~/./g;print
Run Code Online (Sandbox Code Playgroud)

他还有一个53冲程的解决方案,但它现在可能不起作用:(它$^T在2011年的几秒钟内使用该变量!)

$\+=$z-2*$z%($z=10**(7&$^T/ord)%1999)for<>=~/./g;print
Run Code Online (Sandbox Code Playgroud)

PHP,70招

<?while(A<$c=fgetc(STDIN))$t+=$n-2*$n%$n=md5(o²Ûö¬Ñ.$c)%1858+1?><?=$t;
Run Code Online (Sandbox Code Playgroud)

在这六个怪异字符md5(..)chr(111).chr(178).chr(219).chr(246).chr(172).chr(209)在Perl符号.

Python,78招

t=p=0
for r in raw_input():n=10**(205558%ord(r)%7)%9995;t+=n-2*p%n;p=n
print t
Run Code Online (Sandbox Code Playgroud)