Rules
Write a function that accepts string as a parameter, returning evaluated value of expression in dice notation, including addition and multiplication.
To clear the things up, here comes EBNF definition of legal expressions:
roll ::= [positive number], "d", positive number
entity ::= roll | positive number
expression ::= entity { [, whitespace], "+"|"*"[, whitespace], entity }
Example inputs:
- "3d6 + 12"
- "4*d12 + 3"
- "d100"
Using eval functions, or similar, is not forbidden, but I encourage to solving without using these. Re-entrancy is welcome.
I cannot provide test-cases, as output should be random ;).
Format your answers' titles: language, n characters (important notes — no eval, etc.)
My ruby solution, 92 81 characters, using eval:
def f s
eval s.gsub(/(\d+)?d(\d+)/i){eval"a+=rand $2.to_i;"*a=($1||1).to_i}
end
Another ruby solution, not shorter (92 characters), but I find it interesting — it still uses eval but this time in quite creative way.
class Fixnum
def**b
eval"a+=rand b;"*a=self
end
end
def f s
eval s.gsub(/d/,'**')
end