Avaliar dados rolando seqüências de notação
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