编写一个接受字符串作为参数的函数,以骰子表示法返回表达式的计算值,包括加法和乘法.
为了清楚起来,EBNF对法律表达的定义如下:
roll ::= [positive integer], "d", positive integer
entity ::= roll | positive number
expression ::= entity { [, whitespace], "+"|"*"[, whitespace], entity }
Run Code Online (Sandbox Code Playgroud)
示例输入:
不禁止使用eval函数或类似函数,但我鼓励在不使用这些函数的情况下求解.欢迎重新入门.
我无法提供测试用例,因为输出应该是随机的;).
格式化答案的标题:语言,n个字符(重要说明 - 没有评估等)
我的红宝石溶液,92 81个字符,使用eval:
def f s
eval s.gsub(/(\d+)?d(\d+)/i){eval"a+=rand $2.to_i;"*a=($1||1).to_i}
end
Run Code Online (Sandbox Code Playgroud)
另一种红宝石的解决方案,而不是更短(92个字符),但我觉得很有意思-它仍然使用eval但这次颇有创意的方式.
class Fixnum
def**b
eval"a+=rand b;"*a=self
end
end
def f s
eval s.gsub(/d/,'**')
end
Run Code Online (Sandbox Code Playgroud)