Würfelnotationszeichenfolgen auswerten

Regeln

Schreiben Sie eine Funktion, die Zeichenfolge als Parameter akzeptiert und den ausgewerteten Wert von expression in zurückgibtWürfelnotationeinschließlich Addition und Multiplikation.

Um die Dinge zu klären, folgt die EBNF-Definition von Rechtsausdrücken:

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

Beispieleingaben:

3d6 + 124 * d12 + 3"d100"

Verwendeneval funktionen oder ähnliches sind nicht verboten, aber ich empfehle das lösen ohne diese zu benutzen. Wiederaufnahme ist willkommen.

Ich kann keine Testfälle bereitstellen, da die Ausgabe zufällig sein sollte;).

Formatieren Sie die Titel Ihrer Antworten: Sprache, n Zeichen (wichtige Hinweise - keine Bewertung usw.)

MeineRubin Lösung,92 81 Zeichen mit eval:

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

Ein weitererRubin Lösung, nicht kürzer (92 Zeichen), aber ich finde es interessant - es verwendet immer noch eval, aber diesmal auf sehr kreative Weise.

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

Antworten auf die Frage(14)

Ihre Antwort auf die Frage