堆放甲板!


15

爱丽丝(Alice)和鲍勃(Bob)喜欢玩纸牌游戏,其中一副纸牌用连续的非负整数编号。

不过,爱丽丝有一种非常特殊的方式来洗牌。首先,她从卡组中取出顶卡,并将其放在卡组的底部。然后,她取出下一张卡片,并开始堆放。然后,她再次将顶部卡循环到底部,然后将新的顶部卡放到堆上。她重复此过程,直到排空甲板为止,此时堆垛就是新甲板。

  deck     |  pile
-----------+-----------
 3 1 4 0 2 | 
 1 4 0 2 3 | 
 4 0 2 3   |         1
 0 2 3 4   |         1
 2 3 4     |       0 1
 3 4 2     |       0 1
 4 2       |     3 0 1
 2 4       |     3 0 1
 4         |   2 3 0 1
           | 4 2 3 0 1
 4 2 3 0 1 | 

图1:爱丽丝在5张卡片组“ 3、1、4、0、2”上进行洗牌。卡的背面全部朝左。

有一天,鲍勃宣布他要休假一周。没有人玩的爱丽丝(Alice)招募了她的朋友夏娃(Eve)。现在,夏娃是个无耻的骗子,所以当她看到爱丽丝的奇特洗牌时,她意识到自己可以事先堆放甲板以利于她!

当夏娃在第一天过后回到家时,她对游戏进行了一些分析,发现自己最好的几率是当纸牌顺序为0、1、2、3、4、5,...时,她没有但是,她抓住了甲板上有多少张卡,于是她孵化了一个计划繁琐的方案,在自己的手臂上写了一些代码,该代码在运行时占用了甲板的大小,并显示了夏娃需要放入卡的顺序,以便爱丽丝(Alice)整理牌组,最后一张牌组的顺序为0、1、2、3,...

Eve所用的语言(她都知道)完全无关紧要,或者该代码是使用整数参数并返回数组的函数,还是使用命令行参数或STDIN进行输入的完整程序,都无关紧要并将结果写入STDOUT。但是,她确实需要尽可能短的代码,以最大程度地减少Alice看到并抓住她的机会。

也许不道德,你们能帮助夏娃吗?

输入和输出示例:

in  out
 1  0
 2  0 1
 5  2 4 0 3 1
10  2 9 4 8 0 7 3 6 1 5
52  6 51 25 50 12 49 24 48 1 47 23 46 11 45 22 44 5 43 21 42 10 41 20 40 2 39 19
    38 9 37 18 36 4 35 17 34 8 33 16 32 0 31 15 30 7 29 14 28 3 27 13 26

3
措辞可爱,我会开裂的。
ɐɔıʇǝɥʇuʎs

您的堆栈在顶部对齐有点令人困惑。明确说明堆栈的顺序也将有助于使问题更清晰。
马丁·恩德2014年

甲板也一样。
马丁·恩德

另外:您是否尝试通过长度为5的样本来欺骗我们?不希望破坏:shuffle(shuffle(range(5))) == range(5)...
ɐɔıʇǝɥʇuʎs

@Synthetica我猜是在5张牌上的爱丽丝洗牌是一次内卷。发布时,我并没有真正考虑过它,因为它通常不适用。
algorithmhark

Answers:


5

GolfScript,15 14 13字节

])~,{\+)\+}/`

在线尝试。

$ golfscript alice.gs <<< 10
[2 9 4 8 0 7 3 6 1 5]

怎么运行的

])    # Collect the stack into an array and pop. This leaves [] below the input string.
~     # Interpret the input string.
,     # For input “N”, push the array [ 0 … N-1 ] (the pile).
{     # For each card on the pile:
  \+  # Put the card on top of the deck.
  )   # Remove a card from the bottom of the deck.
  \+  # Put the card on top of the deck.
}/    #
`     # Convert the deck into a string.

1
您可以使用{}/而不是map运算符来保存字符。
霍华德

谢谢!我想要一个数组,所以我使用了map。习惯的力量……
丹尼斯

1
](因为前两个字符有效地在输入下放置了一个空数组,为您节省了稍后时间[]\
彼得·泰勒

谢谢!我花了很长时间才弄清楚为什么它不能与在线解释器一起使用。忘了清理堆栈...
丹尼斯

5

朱莉娅83岁

u(n)=(a=[n-1:-1:0];l=Int[];[push!(l,shift!(push!(l,pop!(a)))) for i=1:length(a)];l)

返回的向量中的最后一个元素是卡片组的顶部。


4

Mathematica,92 77 46字节

期望输入变量n

l={};(l=RotateRight[{#-1}~Join~l])&/@Range@n;l

实际上,它只是通过向后移动一张牌,然后将底部的牌放在顶部来向后播放随机播放。

编辑:无需跟踪输出堆栈,只需遍历整数即可。


2

Python 2.7-57

d=[0]
for j in range(1,input()):d=[d.pop()]+[j]+d
print d

简单又好,只需反转随机播放即可。非常接近Golfscript的工作方式。


1

J(13个字符)和K(9个字符)

事实证明,这是一个简单的过程撤消洗牌,和APL-喜欢有折副词/来帮助他们使这一尽可能短。

j取13炭用(_1|.,)/@i.@-,而ķ只需要9: |(1!,)/!:。APL同样会简洁。

这是J版本的分步跟踪。

(_1|.,)/@i.@- 4                  NB. recall that J is right-associative
(_1|.,)/@i. - 4                  NB. u@v y  is  u v y
(_1|.,)/@i. _4                   NB. monad - is Negate
(_1|.,)/ i. _4                   NB. @
(_1|.,)/ 3 2 1 0                 NB. monad i. is Integers, negative arg reverses result
3 (_1|.,) 2 (_1|.,) 1 (_1|.,) 0  NB. u/ A,B,C  is  A u B u C
3 (_1|.,) 2 (_1|.,) _1 |. 1 , 0  NB. x (M f g) y  is  M f x g y
3 (_1|.,) 2 (_1|.,) _1 |. 1 0    NB. dyad , is Append
3 (_1|.,) 2 (_1|.,) 0 1          NB. dyad |. is Rotate
3 (_1|.,) _1 |. 2 , 0 1          NB. repeat ad nauseam
3 (_1|.,) _1 |. 2 0 1
3 (_1|.,) 1 2 0
_1 |. 3 , 1 2 0
_1 |. 3 1 2 0
0 3 1 2

你可能会注意到,在J,我们首先反转的整数数组,但在K我们做到这一点算账:这是因为k重更像是foldl,相比于J的foldr

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.