6

目前在 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)

这是几个测试结果,它应该适用于 1 到 3999(假设输入仅是有效字符)

>>> r("I")
1
>>> r("MCXI")
1111
>>> r("MMCCXXII")
2222
>>> r("MMMCCCXXXIII")
3333
>>> r("MMMDCCCLXXXVIII")
3888
>>> r("MMMCMXCIX")
3999

这与 this 不重复这是相反的。

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

4

4 回答 4

7

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

前段时间在Code Golf举办了一场“从罗马到十进制”的比赛。(嗯,实际上它仍在运行,因为它们永无止境。) 一个名叫eyepopslikeamosquito的 Perl 高尔夫球手决定赢得所有四种语言(Perl、PHP、Python 和 Ruby),他做到了。他写了一个引人入胜的四部分系列“高尔夫球场看起来很棒,我的挥杆感觉很好,我喜欢我的机会”(第二部分,第三部分,第四部分)描述了他在Perl Monks的方法。

以下是他的解决方案:

红宝石,53 笔

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

Perl,58 笔画

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

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

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

PHP, 70 笔画

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

中的六个怪异字符md5(..)chr(111).chr(178).chr(219).chr(246).chr(172).chr(209)Perl 表示法。

蟒蛇,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
于 2009-12-03T22:55:11.760 回答
3

Python - 94 个字符

便宜的镜头:)

I,V,X,L,C,D=1,5,10,50,100,500
M,R,r=D+D,vars(),lambda x:reduce(lambda T,x:T+R[x]-T%R[x]*2,x,0)
于 2009-12-03T11:37:06.057 回答
1

其实定义我自己的fromJust比较小,一共98个

r=foldl(\t c->t+y c-t`mod`y c*2)0 --34
y x=f$lookup x$zip"IVXLCDM"[1,5,10,50,100,500,1000] --52
f(Just x)=x --12
  -- assumes correct input

哈斯克尔接近了。

import Data.Maybe --18
r=foldl(\t c->t+y c-t`mod`y c*2)0 --34
y x=fromJust$lookup x$zip"IVXLCDM"[1,5,10,50,100,500,1000] --59

总字节数 = 111

如果我不需要 fromJust 的导入,将是 93

于 2009-12-03T11:36:59.800 回答
0

采用Jon Skeet 对先前提出的类似问题的回应

在我的自定义编程语言“CPL1839079”中,它是 3 个字节:

r=f
于 2009-12-03T10:49:00.877 回答