Может ли этот код преобразования римского числа в целое число быть короче? - PullRequest
6 голосов
/ 03 декабря 2009

95 байт в настоящее время в Python

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

И это не дублируется с этим , это обратный.

Итак, возможно ли сделать это короче в Python, или в других языках, таких как ruby, можно сделать короче?

Ответы [ 4 ]

7 голосов
/ 04 декабря 2009

Кратчайшие решения от codegolf.com

Некоторое время назад было соревнование " от римского до десятичного " на Code Golf . (Ну, на самом деле он все еще работает, потому что они никогда не заканчиваются.) Игрок в Perl по имени eyepopslikeamosquito решил выиграть все четыре языка (Perl, PHP, Python и Ruby), и так он и сделал. Он написал захватывающую серию из четырех частей: « Поле для гольфа выглядит великолепно, мои качели чувствуют себя хорошо, мне нравятся мои шансы » ( часть II , часть III , часть IV ) с описанием его подходов в Монахи Perl .

Вот его решения:

Рубин, 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-тактное решение, но оно, вероятно, сейчас не работает: (в течение нескольких секунд в 2011 году используется переменная $^T!)

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

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
3 голосов
/ 03 декабря 2009

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)
1 голос
/ 03 декабря 2009

На самом деле определение моего от просто меньше, всего 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

Было бы 93, если бы мне не нужен импорт для fromJust

0 голосов
/ 03 декабря 2009

Принятие ответа Джона Скита на ранее заданный аналогичный вопрос :

В моем собственном языке программирования "CPL1839079" это 3 байта:

r=f
...