阵列可以改组吗?


15

背景

非常熟练的卡处理人员能够运用这样的技术:将卡座完美地切成两半,然后完美地插入卡。如果他们从已排序的牌组开始并连续52次完美执行此技术,则牌组将恢复为已排序的顺序。您面临的挑战是将一副纸牌组成一个整数数组,并确定是否只能使用Faro随机排序对其进行排序。

定义

从数学上来说,法鲁混洗是对2 n个元素(对于任何正整数n)的置换,它将位置i(1索引)中的元素移到位置2 i(mod 2 n +1)。我们还希望能够处理奇数长度的列表,因此在这种情况下,只需将一个元素添加到列表的末尾(如果您有一个方便的话,一个小丑即可),然后Faro像上面那样洗净新列表,但是忽略检查列表顺序时添加的虚拟元素。

目标

编写程序或函数,该程序或函数接受整数列表,如果一定数量的Faro混洗会导致该列表以不降序排列(即使该数字为零-小列表也应显示真值),则返回或输出真值。否则,返回或输出错误。

例子

[1,1,2,3,5,8,13,21]  => True
[5,1,8,1,13,2,21,3] => True
[9,36,5,34,2,10,1] => True
[1,0] => True
[0] => True
[] => True
[3,2,1] => True
[3,1,2] => False
[9,8,7,6,5,4,3,2,1,0] => True
[9,8,7,6,5,4,3,2,0,1] => False
[3,1,4,1,5,9,2,6,9] => False
[-1,-1,-1,-2] => True

计分

这是因此以字节为单位的最短源代码获胜。


为避免与其他持卡人混淆,应该注意,有两种法鲁洗牌。一个在洗牌进行洗牌。此处描述的方法是混洗。有趣的是,仅需8次改组即可将牌组恢复到原始顺序。更多信息
BrainSteel 2015年

这不就是“随机洗N + 1次,看看是否对列表进行了排序”?
lirtosiast

实际上,n次就足够了,因为这样做可以保证找到所有可能的排列2n次,但是在前n个中您至少会获得升序或降序之一。
quintopia


1
第一个元素不是总是保持在第一位置吗?
Eumel 2015年

Answers:


3

Pyth- 26 25 24字节

使用累积归约可多次应用Faro Shuffle并保留所有结果。然后,它通过它映射并检查它们在排序下是否不变,然后使用sum来检查是否为真。返回正数或零。

smSI-db.usC_c2NQsC.tc2Qb

测试套件


3

MATL,41字节

itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx

输出为10

说明

i              % get input array
tn2\           % is size odd?
?              % if that's the case
  YNh          % concat NaN at the end
]              % end if
tn             % get size of input array
t1+:           % vector 1:n+1, where n is input size, so loop will be entered even with []
"              % for loop
  x[]2e!PY)    % delete result from previous iteration and do the shuffling
  ttZN~)       % remove NaN, if there's any
  tS=A         % check if array is sorted
  t.           % copy the result. If true, break loop
]              % end for
wx             % remove unwanted intermediate result

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
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.