Oceniaj ciągi notacji kości

Zasady

Napisz funkcję, która przyjmuje łańcuch jako parametr, zwracając wartość wyrażenia wyrażonego wnotacja kości, w tym dodawanie i mnożenie.

Aby to wyjaśnić, oto definicja EBNF wyrażeń prawnych:

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

Przykładowe dane wejściowe:

„3d6 + 12”„4 * d12 + 3”„d100”

Za pomocąeval funkcje lub podobne nie są zabronione, ale zachęcam do ich rozwiązywania bez ich używania. Ponowna entrancy jest mile widziana.

Nie mogę dostarczyć przypadków testowych, ponieważ dane wyjściowe powinny być losowe;).

Formatuj tytuły odpowiedzi: język, n znaków (ważne notatki - bez ewaluacji itp.)

Mójrubin rozwiązanie,92 81 znaków, używając eval:

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

Innerubin rozwiązanie, nie krótsze (92 znaki), ale uważam to za interesujące - wciąż używa eval, ale tym razem w dość kreatywny sposób.

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

questionAnswers(14)

yourAnswerToTheQuestion