Avaliar dados rolando seqüências de notação

Regras

Escreva uma função que aceite string como um parâmetro, retornando o valor avaliado da expressão emnotação de dados, incluindo adição e multiplicação.

Para esclarecer as coisas, aqui vem a definição EBNF de expressões legais:

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

Exemplo de entradas:

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

Usandoeval funções, ou similar, não é proibido, mas incentivo a resolver sem usá-las. A reentrada é bem-vinda.

Não posso fornecer casos de teste, pois a saída deve ser aleatória;).

Formate os títulos das suas respostas: idioma, n caracteres (notas importantes - não eval, etc.)

Minhasrubi solução,92 81 caracteres, usando eval:

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

Outrorubi solução, não mais curto (92 caracteres), mas acho interessante - ele ainda usa eval mas desta vez de forma bastante criativa.

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

questionAnswers(14)

yourAnswerToTheQuestion