2013-08-06 2 views
3

Я пытаюсь оценить строку с неопределенной переменной. Например: Formula = 2 * 3 + a Результат должен возвращать строку 6 + a. Может ли метод eval сделать что-то подобное? Или, можете ли вы дать мне несколько идей о том, как это сделать?Как вычислить формулу с неопределенной переменной

Обновление: Спасибо за все входы. Думаю, это не так просто, как я думал. Скажем, если мне не нужно упрощать формулу, и все, что мне нужно сделать, это заменить переменную значением в строке?

Пример:

a = { "Bob" => 82, 
     "Jim" => 94, 
     "Billy" => 58, ........ and more} 

Как преобразовать эту строку

"2 * 3 + а [" Боб "] * б"

к этому: «2 * 3 + 82 * b "

Еще раз спасибо за помощь.

+4

В языках программирования ничего подобного нет, вы хотите, скорее всего, провести математическую функцию. – nicooga

+0

Каков ваш прецедент? Мы могли бы дать лучшее решение, если вы дадите еще какой-то контекст. – Nick

ответ

3

То, что вы пытаетесь сделать, сложно, и я не думаю, что это стоит того.

Вы можете использовать некоторый камень для разбора строки в дерево жетонов. Затем найдите любой узел, в котором нет неопределенной переменной, и замените узел на вычисленное значение. После этого верните дерево в строку.

0

Вот наивное решение:

str = "+ 1 * 2 - 3/2 + b - a" 

terms = str.gsub(/^[^+-]+|[+-][^+-]+/).to_a 
=> ["+ 1 * 2 ", 
    "- 3 ", 
    "+ b ", 
    "- a"] 

numbers, variables = terms.partition { |exp| eval(exp.to_s) rescue false } 
=> [["+ 1 * 2 ", "- 3 "], 
    ["+ b ", "- a"]] 

numbers.map! { |exp| exp.gsub(/\d+/, &:to_f) } 
=> ["+ 1.0 * 2.0 ", 
    "- 3.0/2.0 "] 

numbers.map! { |exp| eval(exp) } 
=> [2.0, -1.5] 

sum = numbers.reduce(:+) 
=> "0.5" 

result = "#{sum} #{variables.join}" 
=> "0.5 + b - a" 
+0

Вы можете удалить пробелы из 'str' в первой строке (что приводит к возможно более подверженному ошибкам коду?) – Shoe

+0

Также' str = "124 + 3 * 2 + 20 + 100/2 - c" 'не работает : возвращает '' 150 + 100/2 - c "'. – Shoe

+0

Вот почему это наивное решение. Я думаю, что у меня что-то есть, позвольте мне отредактировать ответ. – nicooga

3

насчет используя нечто вроде Parslet и делая выражение грамматики разбора для упрощения выражений? Посмотрите на начальную страницу, где вы проходите через простой пример, в котором Parslet уменьшает целочисленные выражения.

Смежные вопросы