Ruby 如何按特定格式拆分多级数组

Ruby 如何按特定格式拆分多级数组,ruby,arrays,Ruby,Arrays,我有一个数组如下 #bad tourney = [ [ [["Armando", "P"], ["Dave", "S"]], [["Richard", "R"], ["Michael", "S"]] ], [ [["Allen", "S"], [&qu

我有一个数组如下

#bad
tourney = [
  [
    [["Armando", "P"], ["Dave", "S"]],      
    [["Richard", "R"], ["Michael", "S"]]
  ],
  [
    [["Allen", "S"], ["Omer", "P"]],
    [["David E.", "R"], ["Richard X.", "P"]]
  ]
]
我必须实现一个递归的竞赛方法,让每个竞争者互相竞争。只要是2^n,本次比赛就必须增加到任何数字。是否有任何数组方法可以像下面的数组那样将此数组分为两个级别

#good
tourney = [
  ["Armando", "P"], ["Dave", "S"],
  ["Richard", "R"], ["Michael", "S"],
  ["Allen", "S"], ["Omer", "P"],
  ["David E.", "R"], ["Richard X.", "P"]
]
有了这个,我可以使用
每个_片(2)
来让对手彼此对抗


解决了的 下面是我能想到的

def split(array)
  return array.flatten(1)
end

def depth_array(a)
  return 0 unless a.is_a?(Array)
  return 1+depth_array(a[0])
end

def format_array(array)
  good = array
  while depth_array(good) > 2
    good = split(good)
  end
end

tourney = [[[["Armando", "P"], ["Dave", "S"]],      

       [["Richard", "R"], ["Michael", "S"]]],

       [[["Allen", "S"], ["Omer", "P"]],

       [["David E.", "R"], ["Richard X.", "P"]]]]

tourney2 = [[["Armando", "P"], ["Dave", "S"]], 

        [["Allen", "S"], ["Omer", "P"]]]

tourney3 = [["Omer", "P"], ["Allen", "S"]]

tourney4 = [[[[["Armando", "P"], ["Armando", "P"]], [["Armando", "P"], ["Armando", "P"]]], 

         [[["Allen", "S"], ["Allen", "S"]], [["Allen", "S"], ["Allen", "S"]]]], 

         [[[["Dave", "S"], ["Dave", "S"]], [["Dave", "S"], ["Dave", "S"]]], 

          [[["David E.", "R"], ["David E.", "R"]], [["David E.", "R"], ["David E.", "R"]]]]]



format_array(tourney4)

像这样的怎么样:

tourney = [[[["Armando", "P"], ["Dave", "S"]],      
           [["Richard", "R"], ["Michael", "S"]]],
           [[["Allen", "S"], ["Omer", "P"]],
           [["David E.", "R"], ["Richard X.", "P"]]]]

good = [].tap do |arr|
  tourney.flatten.each_slice(2) do |pr|
    arr << pr
  end
end

puts good.inspect

# output 
[["Armando", "P"], ["Dave", "S"], ["Richard", "R"], ["Michael", "S"], ["Allen", "S"], ["Omer", "P"], ["David E.", "R"], ["Richard X.", "P"]]
tourney=[[“Armando”,“P”],[“Dave”,“S”],
[Richard],[R],[Michael],[S],
[Allen]、[S]、[Omer]、[P],
[David E.,“R”],[Richard X.,“P”]]
好=[]点击do | arr|
锦标赛。整平。每片(2)做|

arr
锦标赛。展平(2)
将坏阵型变为好阵型。

您正在寻找
阵型#展平
。。。它可能会走得太远(太平),但它可能会让你走上正确的轨道。这似乎是一个“原始”痴迷的案例。如果“最低级别”对是对象(即[“Allen”,“S”]是数组以外的对象),那么展平将是最简单的方法。我将尝试此方法,但如果说比赛中有16人,我可能必须能够做同样的事情,并且设置方式相同。因此,我必须处理更多的层。由于我必须能够将任意数量的竞争对手置于2的幂下,因此我决定最好将(1)展平,直到阵列的深度等于2,这是我所需的深度。