爱丽丝(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
shuffle(shuffle(range(5))) == range(5)
...