2012-07-29 51 views
1

我是Ruby的新手,并且正在尝试使用该语言来实施一个剪纸比赛。在Ruby中实施岩石,纸张,剪刀比赛

在下面的代码中调用的rps_game_winner方法会返回一对竞争对手中的赢家。

这是迄今为止我尝试:

def rps_tournament_winner(tournament) 
    qualifying_round_winners = [] 
    for i in 0..0 
    tournament.each_with_index do |x, xi| 
    x.each_with_index do |y, yi| 
     winner = rps_game_winner(y) 
     qualifying_round_winners.push(winner) 
     qualifying_round_winners = qualifying_round_winners.each_slice(2).to_a 
    end 
    end 
    tournament = qualifying_round_winners.each_slice(2).to_a 
    end 
    return tournament 
end 

这是我提供输入:

puts rps_tournament_winner([ 
[ 
    [ ["Armando", "P"], ["David", "S"] ], 
    [ ["Richard", "R"], ["Michael", "S"] ] 
] 

]) 

我得到的输出是:

David 
S 
Richard 
R 

这是我得到的卡住。我无法让这两人相互竞争,并宣布最终的胜利者。

正如您在上面的代码中看到的,for循环的终止条件需要注意。

任何帮助?

+1

建议:使用更多的表达式映射/选择/ ...和较少的语句为/每个。 – tokland 2012-07-29 14:13:42

+0

递归解决方案可能更容易,尤其是如果您必须处理任意深度的括号。因为这个标记为“家庭作业”,所以我暂且放弃。 – 2012-07-29 12:51:52

回答

2

我已经在你的代码中做了一些修改。

注:如果我给[ ["Armando", "P"], ["David", "S"] ]作为输入我的rps_game_winner()功能,它会给结果像["David", "S"]

def rps_tournament_winner(tournament) 
    qualifying_round_winners = [] 
    for i in 0..0 
    tournament.each_with_index do |x, xi| 
    x.each_with_index do |y, yi| 
     winner = rps_game_winner(y) 
     qualifying_round_winners.push(winner) 
    end 
    end 
    tournament = rps_game_winner(qualifying_round_winners) 
    end 
    return tournament 
end 

因此,对于你输入

[[ [["Armando", "P"], ["David", "S"]], [["Richard", "R"], ["Michael", "S"]] ]] 

它也将返回像["Richard", "R"]结果。