首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混沌数洗牌

混沌数洗牌
EN

Code Golf用户
提问于 2016-03-01 00:14:15
回答 1查看 303关注 0票数 5

你有一副牌,由非负数牌组成,而且你还没有洗牌,没有任何玩家相信其他玩家在洗牌时是公平的。你想出一种方法来洗牌,这是完全确定性的,但足够混乱,其他玩家都可以使用它。下面是您执行一次洗牌的方式:

  1. 从甲板面朝下开始。有一系列的M空桩(其中M是甲板上的最大数目),标记为1,2,3,…,Mth桩,还有一个空桩。
  2. 当甲板不是空的时候,做以下操作:把第一张牌从甲板的顶部取下来,让N是它的号码,然后把卡片正面朝下放在堆放的顶部。如果甲板上至少剩下N张牌,则将上面的N张牌朝下处理,使上面的牌在第一堆里,从上面的第二张卡在第二堆里,等到第N张牌被放进第N堆为止。如果甲板上的牌少于N张,请全部处理。
  3. 把第一桩放在储存桩上,然后把第二桩放在新的桩上,然后把第三桩放在新的桩上,然后把第四桩放在新的桩上,直到所有的桩都在你的甲板上。

这种方法在手工操作时是非常直观的,但是在几个游戏之后,一些玩家想要一台电脑来做,因为小组内部根深蒂固的不信任和一些幸运的抽签。他们拒绝使用其他能更好运作的甲板洗牌程序。编写一个以非负整数列表(以您指定的格式)作为输入的程序,并使用此方法对其进行一次改组,输出结果。您可以假设整数和列表的长度小于2^16。

下面是一些经过处理的示例(布局是甲板存储区,第1层,第2层,第2层,第3层.\Mth,卡片自下而上):

代码语言:javascript
运行
复制
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|||||||||||

下面是一长串连续的洗牌:

代码语言:javascript
运行
复制
[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]

另外几个:

代码语言:javascript
运行
复制
[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]
EN

回答 1

Code Golf用户

发布于 2016-03-31 11:12:04

Ruby,91字节

可能有更好的方法来创建数组。也许还有一种更短的方法来做所有的洗牌。我们将看到未来的答案和评论带来的桌子和所有高尔夫建议是欢迎的。

代码语言:javascript
运行
复制
->d{z=(1..d.size).map{[]};([d[-1]+1,d.size].min.times{|i|z[i]<<d.pop})while d[0];z.flatten}

高尔夫:

代码语言:javascript
运行
复制
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
end
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/74501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档