正则表达式骰子卷

时间:2016-10-02 21:41:24

标签: ruby regex

这是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.

2 个答案:

答案 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

相关问题