不使用`transpose`转换数组

时间:2015-08-07 15:01:40

标签: arrays ruby

寻找一种方法来获取下面的swingers数组并交换所有伙伴,同时保持男/女配对。我觉得令人困惑的是如何迭代二维数组

  

实施Swingers游戏。 swingers方法应该采用数组   对于几个数组并返回相同类型的数据结构,用   情侣们混在一起。假设couple数组中的第一项是a   男人,第二项是女人。不要将某人与某人配对   他们自己的性别(抱歉毁了你的乐趣)。一个例子的运行   程序:

swingers([
  ["Clyde", "Bonnie"],
  ["Paris", "Helen"],
  ["Romeo", "Juliet"]
])

2 个答案:

答案 0 :(得分:5)

当然,您根本不需要使用transpose

def swingers(pairs)
  gents = pairs.map(&:first)
  ladies = pairs.map(&:last)
  gents.shuffle.zip(ladies.shuffle)
end

答案 1 :(得分:1)

答案取决于什么"夫妻混合"手段。我怀疑,如果Bob和Zelda一起来参加聚会,他们可能不会互相配对。 (我正在谈论我已经听过的关于浪荡人士和派对的事情)。让我们说"情侣"参加聚会和有效的配对"是一对没有配对的人。

couples = [
  ["Clyde", "Bonnie"],
  ["Paris", "Helen"],
  ["Romeo", "Juliet"]
]

没有随机化

单词"随机"没有出现在问题描述中,因此任何有效的配对都是可以接受的。如果是这种情况,可以采用以下方式:

couples.map(&:first).zip(couples.map(&:last).rotate 1)
  #=> [["Clyde", "Helen"], ["Paris", "Juliet"], ["Romeo", "Bonnie"]]

随机化

如果需要随机化,这里有一种获得有效随机配对的方法:

def pair_em(couples)
  h = Hash[couples]
  gents, ladies = h.keys.shuffle, h.values.shuffle 
  a = gents.map { |g| [g, (h[g]==ladies.first) ? ladies.pop : ladies.shift] }
  # Swap last two gents' ladies if last pairing was a couple
  (a[-2][-1], a[-1][-1] = a[-1][-1], a[-2][-1]) if h[a[-1].first] == a[-1].last
  a
end

10.times { p pair_em(couples) }
[["Paris", "Bonnie"], ["Clyde", "Juliet"], ["Romeo",  "Helen"]]
[["Romeo",  "Helen"], ["Paris", "Bonnie"], ["Clyde", "Juliet"]]
[["Romeo",  "Helen"], ["Paris", "Bonnie"], ["Clyde", "Juliet"]]
[["Romeo", "Bonnie"], ["Clyde",  "Helen"], ["Paris", "Juliet"]]
[["Clyde", "Juliet"], ["Romeo",  "Helen"], ["Paris", "Bonnie"]]
[["Paris", "Bonnie"], ["Romeo",  "Helen"], ["Clyde", "Juliet"]]
[["Paris", "Bonnie"], ["Clyde", "Juliet"], ["Romeo",  "Helen"]]
[["Romeo",  "Helen"], ["Clyde", "Juliet"], ["Paris", "Bonnie"]]
[["Paris", "Juliet"], ["Romeo", "Bonnie"], ["Clyde",  "Helen"]]
[["Clyde", "Juliet"], ["Romeo",  "Helen"], ["Paris", "Bonnie"]]

是否有必要改变男士和女士(正如我所做的那样)以确保随机化是无偏见的?我不这么认为,但我不确定。

或者,人们可以简单地使用@Chris'解决方案,直到获得有效的配对。