Evaluar dados de notación rodando cadenas

Reglas

Escriba una función que acepte la cadena como parámetro, devolviendo el valor evaluado de la expresión ennotación de dados, incluyendo la suma y la multiplicación.

Para aclarar las cosas, aquí viene la definición de las expresiones legales de EBNF:

roll ::= [positive integer], "d", positive integer
entity ::= roll | positive number
expression ::= entity { [, whitespace], "+"|"*"[, whitespace], entity }

Entradas de ejemplo:

"3d6 + 12""4 * d12 + 3""d100"

Utilizandoevaluar Las funciones, o similares, no están prohibidas, pero animo a resolverlas sin usarlas. La re-entrada es bienvenida.

No puedo proporcionar casos de prueba, ya que la salida debe ser aleatoria;).

Formatee los títulos de sus respuestas: idioma, n caracteres (notas importantes, no eval, etc.)

Mirubí solución,92 81 caracteres, utilizando eval:

def f s
eval s.gsub(/(\d+)?d(\d+)/i){eval"a+=rand $2.to_i;"*a=($1||1).to_i}
end

Otrorubí Solución, no más corta (92 caracteres), pero me parece interesante: todavía usa eval, pero esta vez de una manera bastante creativa.

class Fixnum
def**b
eval"a+=rand b;"*a=self
end
end
def f s
eval s.gsub(/d/,'**')
end

Respuestas a la pregunta(14)

Su respuesta a la pregunta