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一个数字和两个字母?