Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 解析字符串中的数字_Ruby_Algorithm_Parsing - Fatal编程技术网

Ruby 解析字符串中的数字

Ruby 解析字符串中的数字,ruby,algorithm,parsing,Ruby,Algorithm,Parsing,我正试图让我的代码通过这个测试。如果你在聚会上玩过魔术,你可能会觉得很熟悉 Test.assert_equals(can_cast("11RB","10B","1R"), true) Test.assert_equals(can_cast("13BBRR","10BR","2R","B"), true) 但我似乎无法正确解析元素中的正确数字。有没有人看到我的代码中有一个让我无法通过这些测试的缺陷 def can_cast(hand, *spell_cost) colored

我正试图让我的代码通过这个测试。如果你在聚会上玩过魔术,你可能会觉得很熟悉

    Test.assert_equals(can_cast("11RB","10B","1R"), true)
    Test.assert_equals(can_cast("13BBRR","10BR","2R","B"), true)
但我似乎无法正确解析元素中的正确数字。有没有人看到我的代码中有一个让我无法通过这些测试的缺陷

def can_cast(hand, *spell_cost)
  colored_mana_hand = Array.new
  colored_mana_cost_aggregate = Array.new
  colored_mana_spent = Array.new

  colorless_mana_hand_array = []
  colorless_mana_hand = 0

  colorless_mana_cost_array = []
  colorless_mana_cost_aggregate_array = []
  colorless_mana_cost_aggregate = 0


  hand.split("").each do |i|
    if i.to_i != 0                        # extracting existing colorless mana from hand
    colorless_mana_hand_array << i
    else
    colored_mana_hand << i
    end
  end
  colorless_mana_hand = colorless_mana_hand_array.join.to_i

  spell_cost.each do |i|                   # extracting existing colorless mana from cost
    i.split("").each do |j|
      if j.to_i != 0                  
      colorless_mana_cost_array << j
    else
      colored_mana_cost_aggregate << j
    end
    end
      colorless_mana_cost_aggregate_array << colorless_mana_cost_array.join
      colorless_mana_cost_array.clear
  end

    colorless_mana_cost_aggregate_array.each do |i|
    colorless_mana_cost_aggregate += i.to_i
  end

    colored_mana_cost_aggregate.each do |i|                                                  # pay colored mana first
     if colored_mana_hand.include?(i)
       colored_mana_spent << i
       colored_mana_hand.rotate(colored_mana_hand.index(i)).shift
     end
  end

  (colored_mana_spent.sort == colored_mana_cost_aggregate.sort) && (colored_mana_hand.length + colorless_mana_hand) >= colorless_mana_cost_aggregate 
end 

这是一种从字符串中提取数字的有趣方式。使用scan可能会更容易,以下是如何使用它:

# extracting existing colorless
colorless_mana_hand_array = hand.scan(/\d/).join.to_i
这将把字符串中的数字提取到一个数组中,将它们连接起来,然后转换成整数

有没有人看到我的代码中有一个让我无法通过这些测试的缺陷

def can_cast(hand, *spell_cost)
  colored_mana_hand = Array.new
  colored_mana_cost_aggregate = Array.new
  colored_mana_spent = Array.new

  colorless_mana_hand_array = []
  colorless_mana_hand = 0

  colorless_mana_cost_array = []
  colorless_mana_cost_aggregate_array = []
  colorless_mana_cost_aggregate = 0


  hand.split("").each do |i|
    if i.to_i != 0                        # extracting existing colorless mana from hand
    colorless_mana_hand_array << i
    else
    colored_mana_hand << i
    end
  end
  colorless_mana_hand = colorless_mana_hand_array.join.to_i

  spell_cost.each do |i|                   # extracting existing colorless mana from cost
    i.split("").each do |j|
      if j.to_i != 0                  
      colorless_mana_cost_array << j
    else
      colored_mana_cost_aggregate << j
    end
    end
      colorless_mana_cost_aggregate_array << colorless_mana_cost_array.join
      colorless_mana_cost_array.clear
  end

    colorless_mana_cost_aggregate_array.each do |i|
    colorless_mana_cost_aggregate += i.to_i
  end

    colored_mana_cost_aggregate.each do |i|                                                  # pay colored mana first
     if colored_mana_hand.include?(i)
       colored_mana_spent << i
       colored_mana_hand.rotate(colored_mana_hand.index(i)).shift
     end
  end

  (colored_mana_spent.sort == colored_mana_cost_aggregate.sort) && (colored_mana_hand.length + colorless_mana_hand) >= colorless_mana_cost_aggregate 
end 
是的,的确如此

您可以通过以下方式拆分您的法术费用字符串:

i.split("").each do |j|
  # ...
end
代码将为块生成每个字符。对于10BR,这给出:

"10BR".split("").each do |j|
  p j: j
end
输出:

{:j=>"1"}
{:j=>"0"}
{:j=>"B"}
{:j=>"R"}
此外,您还有这张支票:

if j.to_i != 0
  colorless_mana_cost_array << j
else
  colored_mana_cost_aggregate << j
end
因为0.0比1!=0计算为false,就像B和R一样

如果我正确理解了您的代码,0应该进入无色的“魔法成本”数组。

我从未玩过魔法:收集。10BR真的应该解释为1,0/B,R两位数字和两个字母,还是10/B,R一个数字和两个字母?