2014-04-04 52 views
0

我有以下的13名球員排序陣列成組,添加剩餘部分紅寶石

players = ['andre','ben','cameron','deshawn','emmanuel','freddy','gabriel','henry','ian','jadeveon','kentavious','lance','malik'] 

我想要的玩家分類成使用類似的代碼本的4隊的方法數組:

def teams(array) 
    groups = [] 
    array.shuffle.each_slice(4) { |group| groups << group } 
    groups 
end 

給定一組長度不可被4分割的球員,我該如何將餘數添加到現有組中?例如,如果我有13名球員,我如何輸出2支4支球隊和5支球隊?等了22個數組...

預計輸出

[['freddy','malik','cameron','deshawn','jadeveon'],['lance','kentavious','gabriel','ian'],['emmanuel','henry','ben','andre']] 
+1

我沒有得到預期的輸出的邏輯。它會誤導我.. –

+0

你想'N%4'組有一個額外的球員? – AShelly

+0

爲什麼大小是5,4,4? –

回答

1

編輯:我要感謝@AShelly在我原來的解決方案趕上一個缺陷,指出我的代碼生成不正確結果當他們是11名球員。事實證明,它給我提供的所有例子都產生了錯誤的答案,但顯然沒有人注意到。下面我有each_slice(players.size/4),我以前有each_slice(4)。我相信現在的代碼是可以的。

代碼

def deal_players(players) 
    shuffled = players.shuffle 
    shuffled.shift(4*(players.size/4)).each_slice(players.size/4).map { |g| 
    shuffled.any? ? g + [shuffled.shift] : g } 
end 

實例

players = ['andre','ben','cameron','deshawn','emmanuel','freddy', 
      'gabriel','henry','ian','jadeveon','kentavious'] 

deal_players(players) 
    #=> [["emmanuel", "jadeveon" , "gabriel"], 
    # ["cameron" , "henry"  , "ben" ], 
    # ["freddy" , "kentavious", "ian" ], 
    # ["deshawn" , "andre"    ]] 

players = ['andre','ben','cameron','deshawn','emmanuel','freddy','gabriel', 
      'henry','ian','jadeveon','kentavious','lance','malik','betty'] 

deal_players(players) 
    #=> [["betty" , "ian" , "henry" , "kentavious"], 
    # ["ben"  , "freddy", "deshawn", "malik"  ], 
    # ["emmanuel", "lance" , "cameron"    ], 
    # ["gabriel" , "andre" , "jadeveon"    ]] 

說明

players = ['andre','ben','cameron','deshawn','emmanuel','freddy','gabriel', 
      'henry','ian','jadeveon','kentavious','lance','malik'] 

shuffled = players.shuffle 
    #=> ["ben", "henry", "lance", "emmanuel", "malik", "cameron", "freddy", 
    # "deshawn", "andre", "jadeveon", "kentavious", "gabriel", "ian"] 

a = shuffled.shift(4*(players.size/4)) 
    #=> ["ben", "henry", "lance", "emmanuel", "malik", "cameron", "freddy", 
    # "deshawn", "andre", "jadeveon", "kentavious", "gabriel"] 

shuffled #=> ["ian"] 

b = a.each_slice(players.size/4) 
    #=>#<Enumerator:["ben","henry","lance","emmanuel","malik","cameron","freddy", 
    # "deshawn","andre","jadeveon","kentavious","gabriel"]:each_slice(3)> 

要查看枚舉內容愛適易:

b.to_a 
    #=> [["ben"  , "henry"  , "lance" ], 
    # ["emmanuel", "malik"  , "cameron"], 
    # ["freddy" , "deshawn" , "andre" ], 
    # ["jadeveon", "kentavious", "gabriel"]] 

b.map { |g| shuffled.any? ? g + [shuffled.shift] : g } 
    #=> [["ben"  , "henry"  , "lance", "ian"], 
    # ["emmanuel", "malik"  , "cameron"  ], 
    # ["freddy" , "deshawn" , "andre"  ], 
    # ["jadeveon", "kentavious", "gabriel"  ]] 

這最後一步只會增加的剩餘播放器之一(0之間以及3)shuffled到每個b陣列元件,直到沒有更多要添加。在這裏,shuffled只包含「伊恩」,所以「伊恩」被添加到第一組。

+0

這使得一個隊員失去了一名隊員的球員11. – AShelly

+0

@AShelly,謝謝你的收穫。事實證明,問題不僅在於11名球員(見編輯)。 –

3
groups = array.shuffle.each_slice(4).to_a 
spares = groups.pop if groups[-1].size != 4 
spares.each_with_index{|p,i| groups[i]<<p} 
+0

這實際上並不適用於所有數字,因爲問題沒有明確定義。如果有11名球員,你會怎麼做?該解決方案將'[4],[4],[3]'變成了[5] + [5] + NoMethodError'。這可能不理想。預期的分佈是11 [6],[5],[5],[5],[1],[4],[4],[3]或其他什麼? – AShelly

1

不是最簡潔的解決方案,但這應該工作:

if team.length%num == 0 
    teams = team.each_slice(num).to_a 
    else 
    total = (team.length).divmod(num)  //returns array[0]=quotent, array[1]=remainder 
    extra_players= team.shift(total[1]) 
    final_teams = team.each_slice(total[0]).to_a 
    remainder_players.each do |x| 
     final_teams.sample.push(x)     
    end 
    end