你有一副牌,由非负数牌组成,而且你还没有洗牌,没有任何玩家相信其他玩家在洗牌时是公平的。你想出一种方法来洗牌,这是完全确定性的,但足够混乱,其他玩家都可以使用它。下面是您执行一次洗牌的方式:
这种方法在手工操作时是非常直观的,但是在几个游戏之后,一些玩家想要一台电脑来做,因为小组内部根深蒂固的不信任和一些幸运的抽签。他们拒绝使用其他能更好运作的甲板洗牌程序。编写一个以非负整数列表(以您指定的格式)作为输入的程序,并使用此方法对其进行一次改组,输出结果。您可以假设整数和列表的长度小于2^16。
下面是一些经过处理的示例(布局是甲板存储区,第1层,第2层,第2层,第3层.\Mth,卡片自下而上):
9,8,7,6,5,4,3,2,1,0|||||||||||
9,8,7,6,5,4,3,2,1|0||||||||||
9,8,7,6,5,4,3|0,1|2|||||||||
9,8,7|0,1,3|2,4|5|6|||||||
|0,1,3,7|2,4,8|5,9|6|||||||
0,1,3,7,2,4,8,5,9,6||||||||||| (starting another iteration)
0,1,3|6|9|5|8|4|2|7||||
|6,3|9,1|5,0|8|4|2|7||||
6,3,9,1,5,0,8,4,2,7|||||||||||下面是一长串连续的洗牌:
[9,8,7,6,5,4,3,2,1,0]->[0,1,3,7,2,4,8,5,9,6]->[6,3,9,1,5,0,8,4,2,7]->
[7,3,2,6,4,8,0,5,1,9]->[9,1,5,0,8,4,6,2,3,7]->[7,1,3,9,2,6,4,8,0,5]->
[5,9,0,3,8,1,4,7,6,2]->[2,4,9,6,1,5,7,8,3,0]->[0,3,1,9,8,6,4,7,2,5]->
[5,9,2,1,7,3,4,0,6,8]->[8,5,6,0,4,3,7,1,2,9]->[9,2,1,7,3,4,0,6,5,8]另外几个:
[1,0,1,0]->[0,1,1,0]->[0,1,0,1]->[1,1,0,0]->[0,0,1,1]->[1,0,0,1]->[1,0,1,0]
[1,1,1,0]->[0,1,1,1]->[1,1,1,0]
[1,0,1,1]->[1,0,1,1]
[4,3,2,1]->[1,3,2,4]->[4,2,3,1]->[1,2,3,4]->[4,3,2,1]
[1,2,1,2,1,2]->[2,1,1,1,2,2]->[2,1,2,2,1,1]->[1,2,2,1,2,1]->[1,1,2,2,2,1]发布于 2016-03-31 11:12:04
可能有更好的方法来创建数组。也许还有一种更短的方法来做所有的洗牌。我们将看到未来的答案和评论带来的桌子和所有高尔夫建议是欢迎的。
->d{z=(1..d.size).map{[]};([d[-1]+1,d.size].min.times{|i|z[i]<<d.pop})while d[0];z.flatten}def shuffle(deck)
# an array of arrays
z = (1..deck.size).map{[]}
# while there are still cards in the deck
while deck[0]
# if we're almost out of cards, use how many are left
# else, put in deck[-1] + 1 in the piles (that is, including deck[-1])
card = [deck[-1] + 1, deck.size].min
card.times do |i|
z[i] << deck.pop
end
end
# flatten all of those arrays done and return
return z.flatten
endhttps://codegolf.stackexchange.com/questions/74501
复制相似问题