Evaluar dados de notación rodando cadenas
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