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で動作するはずです(入力が有効なcharのみであると仮定します)

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

そして、これはこれと重複していません、これは逆になっています。

それで、Pythonでそれを短くすることは可能ですか、それともrubyのような他の言語をそれより短くすることができますか?

4

4 に答える 4

7

codegolf.comからの最短のソリューション

しばらく前にコードゴルフで「ローマから小数へ」の競争がありました。(まあ、実際には終わらないのでまだ実行中です。)eyepopslikeamosquitoという名前のPerlゴルファーは、 4つの言語(Perl、PHP、Python、Ruby)すべてに勝つことを決めました。彼は魅力的な4部構成のシリーズ「ゴルフコースは素晴らしく、私のスイングは心地よく、私のチャンスが好きです」(パートIIパートIIIパートIV )を書き、 PerlMonksでの彼のアプローチについて説明しました。

彼の解決策は次のとおりです。

ルビー、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ストロークのソリューションも持っていますが、おそらく今は機能しません:( $^T2011年の数秒間に変数を使用します!)

$\+=$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;

の6つの奇妙な文字はmd5(..)Perlchr(111).chr(178).chr(219).chr(246).chr(172).chr(209)表記です。

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
于 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

Haskellが近づきます。

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

以前に尋ねられた同様の質問に対するJonSkeetからの応答を採用する:

私のカスタムプログラミング言語「CPL1839079」では、3バイトです。

r=f
于 2009-12-03T10:49:00.877 に答える