Правила
Напишите функцию, которая принимает строку как параметр, возвращая оценивается значение выражения в нотация кости, включая сложение и умножение.
Чтобы прояснить ситуацию, здесь приводится определение юридических выражений EBNF:
roll ::= [positive integer], "d", positive integer
entity ::= roll | positive number
expression ::= entity { [, whitespace], "+"|"*"[, whitespace], entity }
Пример ввода:
- "3d6 + 12"
- "4 * d12 + 3"
- "d100"
Использование функций eval или подобных функций не запрещено, но я поощряю к решению без их использования. Добро пожаловать в Re-entrancy.
Я не могу предоставить тестовые примеры, так как вывод должен быть случайным;).
Отформатируйте названия своих ответов: язык, n символов (важные заметки - нет eval и т.д.)
Мое рубиновое решение, 92 81 символ, используя eval:
def f s
eval s.gsub(/(\d+)?d(\d+)/i){eval"a+=rand $2.to_i;"*a=($1||1).to_i}
end
Еще одно рубиновое решение, но не короче (92 символа), но я считаю это интересным - он по-прежнему использует eval, но на этот раз совершенно творческим способом.
class Fixnum
def**b
eval"a+=rand b;"*a=self
end
end
def f s
eval s.gsub(/d/,'**')
end