- 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;
}
guest 20.04.2012 21:41 # +4
wvxvw 20.04.2012 22:09 # 0
Вполне в духе времени (почти как Linq)? если синтаксических ошибок нет, то будет работать :)
wvxvw 20.04.2012 22:20 # 0
Упс, факир был пьян, вот теперь нормально.
huitka 21.04.2012 00:02 # 0
wvxvw 21.04.2012 00:33 # 0
guest 21.04.2012 07:56 # 0
wvxvw 21.04.2012 09:51 # 0
roman-kashitsyn 21.04.2012 10:01 # 0
об этом ещё упоминается в Dive Into Python
Самый простой способ, на мой взгляд - воспользоваться format для составления таблицы соответствий и потом просто делать gethash
wvxvw 21.04.2012 12:30 # 0
Тут фишка же в чем: интуитивно хочется составить LR(k) (в лучшем случае LR(1)) парсер. Но задача лучше решается через RL(k), особенно потому, что легко строится RL(1) парсер и с минимальными накладными расходами. Т.е. перефразируя, для того, чтобы работал LR парсер в lookahead нужно чтобы было 2 символа, а для RL достаточно одного.
EDIT: А, хотя, мой вариант тоже бы не работал для MMMM, так что да.
absolut 21.04.2012 13:00 # +2
wvxvw 21.04.2012 21:36 # 0
Ну раз уж такое дело... можно сделать немного более функционально.
bormand 22.04.2012 08:37 # +1
unu-foja 22.04.2012 19:01 # 0
*Main> romanToArabic "LC"
Left (line 1, column 2):
unexpected 'C'
expecting "X", "IX", "IV", "V", "I" or end of input
bormand 21.04.2012 15:16 # +5
bormand 21.04.2012 15:37 # 0
guest 21.04.2012 16:48 # 0