【发布时间】:2010-11-05 02:41:24
【问题描述】:
规则
编写一个接受字符串作为参数的函数,返回 dice notation 中表达式的评估值, 包括加法和乘法。
为了清楚起见,这里是 EBNF 对法律表达式的定义:
roll ::= [positive integer], "d", positive integer
entity ::= roll | positive number
expression ::= entity { [, whitespace], "+"|"*"[, whitespace], entity }
示例输入:
- “3d6 + 12”
- “4*d12 + 3”
- “d100”
不禁止使用 eval 函数或类似函数,但我鼓励 不使用这些来解决。欢迎再次入园。
我不能提供测试用例,因为输出应该是随机的;)。
格式化您的答案标题:语言、n 个字符(重要说明 — 无 eval 等)
我的ruby解决方案,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
另一个 ruby 解决方案,不是更短(92 个字符),但我觉得它很有趣——它仍然使用 eval,但这次以非常有创意的方式。
class Fixnum
def**b
eval"a+=rand b;"*a=self
end
end
def f s
eval s.gsub(/d/,'**')
end
【问题讨论】:
-
@Johannes,我想 4*d12 可能意味着滚动一个 d12 并将结果乘以 4(而不是将 d12 滚动 4 次并将结果相加)。无论如何,这听起来像是某人的作业,原始发布者应该发布一些他们自己的代码,以表明他们至少做出了努力。
-
听起来更像是回避家庭作业而不是家庭作业 ;-)
-
2d2d6 确实有一个有用的含义,即 (2-4)d6,而且我见过要求掷随机数骰子的游戏。 2d(2d6) 对我来说没有意义。并不是说它需要在问题中。
-
Onorio 是对的 - 标准 RPG 表示法是 4d12 表示 d12 + d12 + d12 + d12,但 4*d12 将是 4 * d12。
-
RPG?谁说的RPG?!我敢肯定这是针对完全不相关的事情。对 Wisdom 进行检查,看看你是否相信我。
标签: language-agnostic dice expression-evaluation