你能超越比尔·盖茨吗?


13

煎饼分类是一个数学问题的通俗术语,即当可以将抹刀插入堆叠中的任意点并用来翻转其上方的所有煎饼时,按大小顺序对无序的煎饼堆叠进行分类的数学问题。煎饼数P(n)n个煎饼所需的最小翻转次数。1个

1979年,年轻的比尔·盖茨(Bill Gates)和克里斯托斯(Christos Papadimitriou)撰写了一篇论文,证明P(n)=(5n + 5)/ 3的上限。2

我认为可以肯定的是,盖茨(和/或帕帕第米特里奥)编写了一个程序,使用他们开发的算法(可能晚于1979年)执行煎饼分类。由于盖茨是一位熟练的程序员,因此他们可能会尽可能地尝试编写此代码,但是源代码的大小尚未公开(AFAIK)。

挑战:

创建一个执行煎饼分类的函数/程序,最大翻转次数不超过盖茨和帕帕第米特里乌找到的界限。3您可以选择是要列表递增还是递减,只要它是一致的即可。

您可以假设n <50。因此,您必须将翻转次数限制为(一些随机选择的n值):

 n   P(n)
38   65
49   83
50   85

输出应该是每次翻转之前刮刀的位置。输出可能是零索引或一个索引,您可以选择从顶部还是底部进行计数。

附加规则:

  • 运行时必须是确定性的
  • 没有固定的时间限制,但是您必须能够提供包含50个元素的列表的输出

测试清单:

我无法提供最困难的列表(如果是的话,我会写一篇论文,而不是挑战),所以我将提供一些随机数字列表,您可以在这些数字上测试函数/程序。如果事实证明这些列表“容易”,我可能会添加其他人。

9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21

希望Bill Gates和Papadimitriou将看到这一挑战,并提供他们的代码,以便我们可以确定您是否确实超越了他们。

3已找到更好的上限,但是您不必关心那些上限。


相关,但不重复。那里的答案在这里行不通。
Stewie Griffin

那时我在解决方案中使用了BFS,它仍然可以在这里工作(稍作更新)以找到翻转次数最少的解决方案。
英里

@miles然后随意发布。我没有详细介绍所有答案,但是大多数只是使用幼稚的方法。
Stewie Griffin

Answers:


4

Python 2中(PyPy) 238个 235 222字节

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

*(2个空格=制表符)

在线尝试!

借用一种对列表进行排名的方法,节省了13个字节。

具有简单启发式功能的DFS,可检查翻转是否将排序时相邻的一对“煎饼”分开。按升序排序。输出从左为0索引,其中0翻转前2,依此类推。使用的移动次数是2009年的上限(5/3)*n+1 < 5/3*(n+1)(18/11)*n < (5/3)*n+1 < 5/3*(n+1)并且(18/11)*n是更严格的上限。

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.