寻找一种方法来获取下面的swingers
数组并交换所有伙伴,同时保持男/女配对。我觉得令人困惑的是如何迭代二维数组
实施Swingers游戏。 swingers方法应该采用数组 对于几个数组并返回相同类型的数据结构,用 情侣们混在一起。假设couple数组中的第一项是a 男人,第二项是女人。不要将某人与某人配对 他们自己的性别(抱歉毁了你的乐趣)。一个例子的运行 程序:
swingers([
["Clyde", "Bonnie"],
["Paris", "Helen"],
["Romeo", "Juliet"]
])
答案 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'解决方案,直到获得有效的配对。