浅滩混洗是一种混洗,将甲板分为两个分区,然后将这些分区拼接在一起以创建新的混洗甲板。
卡以这样的方式拼接在一起:卡在它们所属的分区中保持其相对顺序。例如,如果卡片A在卡组中的卡片B之前,并且卡片A和B在同一分区中,则在最终结果中,卡片A必须在卡片B之前,即使它们之间的卡片数量增加了。如果A和B在不同的分区中,则它们在最终结果中可以采用任何顺序,而不管它们的开始顺序如何。
然后,可以将每个浅滩混洗视为原始纸牌的排列。例如排列
1,2,3 -> 1,3,2
是浅滩洗牌。如果你像这样分割甲板
1, 2 | 3
我们看到其中的每张卡1,3,2
与其分区中的每张其他卡具有相同的相对顺序。 2
仍在1
。
另一方面,以下排列不是浅滩混洗。
1,2,3 -> 3,2,1
我们可以看到这一点,因为对于所有两个(非平凡的)分区
1, 2 | 3
1 | 2, 3
有一对卡不保持其相对顺序。在第一个分区1
,并2
改变他们的排序,而在第二个分区2
,并3
改变它们的顺序。
但是我们确实看到3, 2, 1
可以通过组合两个浅滩混洗来实现,
1, 3, 2 + 2, 3, 1 = 3, 2, 1
实际上,要证明的一个非常简单的事实是,通过结合一定数量的浅滩混洗排列,可以进行任何排列。
任务
您的任务是制作一个程序或函数,将一个排列(大小为N)作为输入,并输出最少数量的浅滩混洗排列(大小为N),可以组合形成输入排列。您无需输出浅滩混音本身,就可以输出多少。
这是代码高尔夫球,因此答案将以字节计分,而字节越少越好。
您可以输出1或0进行身份置换。
测试用例
1,3,2 -> 1
3,2,1 -> 2
3,1,2,4 -> 1
2,3,4,1 -> 1
4,3,2,1 -> 2
3
那么,我们很快就会看到RiffleSort算法吗?
—
mbomb007 '18
不
—
Halvard Hummel '18
4,3,2,1
应该2
吗?首先,我们在中间分裂并获得收益3,1,4,2
,然后在中间再次分裂并使用相同的排列
@HalvardHummel是的。我必须在我的参考实现中找到问题。
—
小麦巫师