- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
public int RomeToArab (string str)
{
int[] arabian = new int[13] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
strint[] rome = new string[13] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
int n = 0;
int i = 0;
do
{
if (str.StartsWith(rome[i]))
{
n = n + arabian[i];
str = str.Substring(rome[i].Length, str.Length - rome[i].Length);
}
if (!str.StartsWith(rome[i])
i++;
}
while (i < 13);
return n;
}
Вполне в духе времени (почти как Linq)? если синтаксических ошибок нет, то будет работать :)
Упс, факир был пьян, вот теперь нормально.
об этом ещё упоминается в Dive Into Python
Самый простой способ, на мой взгляд - воспользоваться format для составления таблицы соответствий и потом просто делать gethash
Тут фишка же в чем: интуитивно хочется составить LR(k) (в лучшем случае LR(1)) парсер. Но задача лучше решается через RL(k), особенно потому, что легко строится RL(1) парсер и с минимальными накладными расходами. Т.е. перефразируя, для того, чтобы работал LR парсер в lookahead нужно чтобы было 2 символа, а для RL достаточно одного.
EDIT: А, хотя, мой вариант тоже бы не работал для MMMM, так что да.
Ну раз уж такое дело... можно сделать немного более функционально.
*Main> romanToArabic "LC"
Left (line 1, column 2):
unexpected 'C'
expecting "X", "IX", "IV", "V", "I" or end of input