2

すべてのラウンドをプレイしてトーナメントに戻るじゃんけんトーナメントシミュレーターを実装する必要があります。

これは私のトーナメント配列です:

tournament = [
    [
        [ 
            ["Armando", "P"], ["Dave", "S"] 
        ],
        [ 
            ["Richard", "R"],  ["Michael", "S"] 

        ],
    ],
    [
        [ ["Allen", "S"], ["Omer", "P"] ],
        [ ["David E.", "R"], ["Richard X.", "P"] ]
    ]
]

たとえば、["Richard"、 "R"]、["Michael"、 "S"]は、リチャードがロックとマイケルはさみをプレイしたゲームを表します。リチャードが勝者となり、次のラウンドに進む必要があります。

このために再帰関数を実装しようとしていますが、配列を正しく取得するのに問題があります

これが私の方法です:

 def rps_tournament_winner(tournament)

  qualifying_round_winners = []
   round_winners = []
  # last round

  if tournament.length < 1
    return
  end

  tournament.each_with_index do |round,i|   
 puts round.inspect
     qualifying_round_winners[i] = []
     round_winners = []
     round.each_with_index do |game,j|
         winner = rps_game_winner(game)
         round_winners.push winner
     end
     qualifying_round_winners[i] = round_winners

  end

  rps_tournament_winner(qualifying_round_winners)
end

私は勝者を認定するためのアレイを使って多くのことを発明しましたが、解決策を見つけることができません。あなたが私を助けてくれることを願っています。ありがとうございました。

編集:

これが、メソッドの各反復で取得する必要があるものです

最初のラウンドの後

tournament = [
    [
        [ 
            ["Dave", "S"], ["Richard", "R"] 
        ],
        [ 
            ["Allen", "S"],  ["Richard X.", "P"] 

        ]
    ]
]

第2ラウンド後:

tournament = [
    [
        [ 
            ["Richard", "R"] , ["Allen", "S"]
        ]
    ]
]

勝者

["Richard", "R"] 

編集:2

ここに完全なコードがあります:http: //pastebin.com/gjKfiWLD

4

2 に答える 2

7

再帰する際に考慮しなければならないケースが 2 つあります。

rps_tournament_winner の引数がゲームであるか、rps_tournament_winner の引数がトーナメントです。トーナメントのサブセクション自体がトーナメントであることに注意してください (ラウンドが 1 つ少ないだけです)。ゲームの場合は勝者を返します。サブセクション/トーナメントの場合、再帰的にその 2 つの子の勝者を見つけます。

def rps_tournament_winner(tournament)
    # Check if we're at a game
    if tournament[0][0].is_a? String
        return rps_game_winner(tournament)
    end
    # Otherwise keep going down the rabbit hole
    return rps_game_winner([rps_tournament_winner(tournament[0]),rps_tournament_winner(tournament[1])])
end

これで理解できましたか?

于 2013-01-17T23:32:25.733 に答える
0

それは私のために働いた。手順は次のとおりです。

  1. トーナメント[0][0]が配列かどうかをチェックする
    1.1 ゲームの勝者を返す
  2. if not
    2.1 ツアーに勝つ人が最後までチェックするトーナメント関数を再帰的に呼び出す[0]
    2.2 ツアーに勝つ人が最後までチェックするトーナメント関数を
    再帰的に呼び出す[0] 2.3 ツアーに勝つ人が最後までチェックするトーナメント関数を再帰的に呼び出す[0] [1]
  3. リスト項目
于 2013-07-15T17:55:35.193 に答える