forked from pkolt/design_patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
interpreter.py
42 lines (35 loc) · 1.34 KB
/
interpreter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# coding: utf-8
"""
Интерпретатор (Interpreter) - паттерн поведения классов.
Для заданного языка определяет представление его грамматики,
а также интерпретатор предложений этого языка.
"""
class RomanNumeralInterpreter(object):
"""Интерпретатор римских цифр"""
def __init__(self):
self.grammar = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
def interpret(self, text):
numbers = map(self.grammar.get, text) # строки в значения
if None in numbers:
raise ValueError('Ошибочное значение: %s' % text)
result = 0 # накапливаем результат
temp = None # запоминаем последнее значение
while numbers:
num = numbers.pop(0)
if temp is None or temp >= num:
result += num
else:
result += (num - temp * 2)
temp = num
return result
interp = RomanNumeralInterpreter()
print interp.interpret('MMMCMXCIX') == 3999 # True
print interp.interpret('MCMLXXXVIII') == 1988 # True