- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
def run(code):
def func(operator):
from functools import reduce
add = lambda a, b: float(a) + float(b)
mul = lambda a, b: float(a) * float(b)
div = lambda a, b: float(a) / float(b)
deduct = lambda a, b: float(a) - float(b)
d = {
'+': lambda arr: reduce(add, arr),
'*': lambda arr: reduce(mul, arr),
'/': lambda arr: reduce(div, arr),
'-': lambda arr: reduce(deduct, arr)
}
return d[operator]
def lex(token):
if token in ('+', '-', '/', '*', '%'):
return "operator"
elif token == '(':
return "lbracket"
elif token == ')':
return "rbracket"
elif token[0].isalpha():
return "name"
elif token[0] == token[-1] and token[0] in ('"', "'"):
return "string"
else:
try:
float(token)
return "number"
except:
raise ValueError
def getArgs(words):
args = []
arg = []
i = 0
for word in words[2:]:
if word == '(':
i += 1
arg.append(word)
elif word == ')':
i -= 1
arg.append(word)
if i == 0:
args.append(arg)
arg = []
elif i == 0:
arg.append(word)
args.append(arg)
arg = []
else:
arg.append(word)
return args
def expr(words):
args = getArgs(words)
args_ = []
for arg in args:
if len(arg) == 1:
args_.append(arg)
else:
args_.append(expr(arg))
if lex(words[1]) == "operator":
return func(words[1])(list(map(lambda a: (type(a) in (list, tuple) and a[0]) or a, args_)))
lines = code.split("\n")
for line in lines:
word = ''
words = []
chars = tuple(line)
for i in tuple(line):
if i in ('(', ')'):
if word: words.append((word, lex(word)))
words.append((i, lex(i)))
word = ''
elif i == ' ':
if word: words.append((word, lex(word)))
word = ''
else:
word += i
if word: words.append((word, lex(word)))
words_ = list(map(lambda arr: arr[0], words))
print(expr(words_))
функция считает лиспоподобные арифметические выражения, например так:
run("(+ 2 (* 3 4))") # 14
в своё оправдание могу лишь сказать, что писал это в электричке на планшете
greenx 27.05.2015 12:35 # 0
pushistayapodmyshka 27.05.2015 14:47 # 0
bormand 27.05.2015 14:58 # +1
kegdan 27.05.2015 15:01 # 0
>> в своё оправдание могу лишь сказать, что писал это в электричке на планшете
Ой ты моя лапочка, давай я тебя обниму да поглажу...
Боже мой, да всем на тебя насрать
1024-- 27.05.2015 15:41 # +1
Пофиксил Подавил в v 1.2.1.
kegdan 27.05.2015 15:43 # 0
1024-- 27.05.2015 15:46 # +1
TarasB 27.05.2015 16:01 # 0
/\(([-+*/%])\s*(\d+(?:\s+\d+)*)\s*\)/g
1024-- 27.05.2015 16:07 # 0
Матчит подстроку, начинающуяся на скобку, после которой идёт один из символов -+*/% (1), затем пробелы по вкусу, затем последовательности цифр, разделённые более, чем одним пробелом (2), затем пробелы по вкусу и закрывающая скобка. Это регулярное выражение также захватывает символ (1) и строку из чисел, разделённую пробелами (2).
1024-- 27.05.2015 16:16 # 0
не менее, чем одним пробелом
> пробелы по вкусу
т.е. если невкусно, их может и не быть
bormand в http://govnokod.ru/18239#comment287489 написал:
> несколько натуральных десятичных чисел (возможно, что ни одного)
как минимум одно должно быть
bormand 27.05.2015 16:07 # −1
kegdan 27.05.2015 17:50 # 0
Самое примечательное, что проверок на ошибки нет в принципе
bormand 27.05.2015 19:36 # 0
Вот как в настоящей scheme: Identifiers may denote variables, keywords, or symbols, depending upon context. They are formed from sequences of letters, digits, and special characters. With three exceptions, identifiers cannot begin with a character that can also begin a number, i.e., they cannot begin with ., +, -, or a digit. The three exceptions are the identifiers ..., +, and -.
AHCKujlbHblu_netyx 25.08.2021 00:46 # 0