Würfelnotationszeichenfolgen auswerten
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