这是codefights.com的一个示例问题 目的是计算骰子卷的最大分数。为了解决这个问题,我创建了一个正则表达式。它失败了一个案例(并通过所有其他案件):
pat = /(?<rolls>\d{1,2})?d(?<sides>\d{1,2})(?<sign>\+|\-)?(<mod>\d{1,2}|L)?/
规则:&#34; 4d6-L1d20-10没想到&#34; 输出: 47 预期产出: 38
我可以将输入加到38的唯一方法是我考虑(4x6) - 6(在此上下文中为L https://en.wikipedia.org/wiki/Dice_notation)然后(忽略没有空格)+(1x20)。我想不出为什么总数不是28而不是38的原因。(1x20) - 10是根据规则的合法公式。我真的很感激这个问题的一些见解,或者我可以用什么逻辑来解决它的想法。
def bugsAndBugfixes(rules)
matches = []
pat = /(?<rolls>\d{1,2})?d(?<sides>\d{1,2})(?<sign>\+|\-)?(?<mod>\d{1,2}|L)?/
rules.scan(pat) { matches << $~ }
result = 0
matches.each do |match|
c= Hash[ match.names.zip( match.captures ) ]
c['rolls'] = 1 unless c['rolls']
if c['sign'] == '-'
result+=(c['rolls'].to_i * c['sides'].to_i) - c['mod'].to_i
else
result+=(c['rolls'].to_i * c['sides'].to_i) + c['mod'].to_i
end
end
result
end
端
对于规则=&#34;滚动d6-3和4d4 + 3选择武器,并用3d7完成boss!&#34;, 输出应该是 bugsAndBugfixes(rules)= 43。
规则中有三个公式。
d6-3表示单面6面模具,从结果中减去3。因此,可获得的最大数量为6 - 3 = 3。 4d4 + 3代表4卷4面模具,其中3个添加到结果中。可以得到4 * 4 + 3 = 19分。 3d7表示3面7面模具。获得的最大数量是3 * 7 = 21.
答案 0 :(得分:0)
def calc(str)
n, _, m, sign, p = str.split /\s*/
tot = n.to_i * m.to_i
sign ? tot.send(sign, p.to_i) : tot
end
calc "4d3+3" #=> 15
calc "4d3-3" #=> 9
calc "4d3" #=> 12
calc "4 d 3 + 3" #=> 15
答案 1 :(得分:0)
def bugsAndBugfixes(rules)
matches = []
pat = /(?<rolls>\d+)?d(?<sides>\d+)(?<sign>\+|\-)?(?<mod>\d+)?/
rules.scan(pat) { matches << $~ }
result = 0
matches.each do |match|
c = Hash[ match.names.zip( match.captures ) ]
c['rolls'] = 1 unless c['rolls']
if c['sign'] == '-'
tmp=(c['rolls'].to_i * c['sides'].to_i) - c['mod'].to_i
else
tmp=(c['rolls'].to_i * c['sides'].to_i) + c['mod'].to_i
end
p "#{tmp} #{c}"
result += tmp
end
result
端