同色算术级数


15

范德瓦尔登定理

对于任何给定的正整数rk,都有一些数字N,如果这些整数{1, 2, ..., N}是有色的,每一个都具有一种r 不同的颜色,则k在算术级数中至少存在所有相同颜色的整数。最少的N是Van der Waerden数W(r, k)

您的目标是给W(r, k)定正整数输入r和来计算范德瓦尔登数k。最少的字节数获胜。

请注意,此功能增长非常快,并且计算耗时。甚至W(4, 4)是未知数。您可能会假设您的代码在资源(时间,内存,堆栈深度等)无限制的理想计算机上运行。理论上,即使对于未知答案的值,您的代码也必须给出正确的答案。

不允许使用计算此功能的内置程序。

对于r = 2长度的颜色和渐变k = 3,存在8避免这种渐变的长度序列,即3相同颜色的等距元素:

B R R B B R R B

但是,没有这样的长度9序列W(2, 3) == 9。例如,

R B B R B R R B R
  ^     ^     ^      

包含所示的长度3相同颜色的算术级数。

测试用例

您可能只能测试小案例。

+-----+-----+-----+-----+-----+-----+------+
|     | k=1 | k=2 | k=3 | k=4 | k=5 | k=6  |
+-----+-----+-----+-----+-----+-----+------+
| r=1 |   1 |   2 |   3 |   4 |   5 |    6 |
| r=2 |   1 |   3 |   9 |  35 | 178 | 1132 |
| r=3 |   1 |   4 |  27 | 293 |     |      |
| r=4 |   1 |   5 |  76 |     |     |      |
+-----+-----+-----+-----+-----+-----+------+

Answers:


7

蟒3.5,125个 124 119字节

f=lambda r,k,*L:any(L[:x*k:x]==k*(*{*L[:x*k:x]},)for x in range(1,len(L)+1))*len(L)or max(f(r,k,i,*L)for i in range(r))

这很有趣,因为在打高尔夫球的过程中,该程序实际上变得更加高效。但是,任何超出f(2,4)f(3,3)仍然需要的时间。

说明

初始版本k通过尝试所有可能的起始索引和步骤来检查序列是否包含长度的进度。

def f(r,k,L=[]):
 for i in range(len(L)):
  for j in range(len(L)):
   if len(set(L[i::j+1]))==1 and len(L[i::j+1])==k:
    return len(L)
 return max(f(r,k,L+[i])for i in range(r))

高尔夫版本仅需尝试所有可能的步骤,因为它会添加新的序列元素。该x*k帽是要借箱子护理[0, 0, 1],它含有长度为2的进展,但并不能满足唯一性检查未加帽。

至于支票

L[:x*k:x]==k*(*{*L[:x*k:x]},)

在高尔夫球版本的第一遍中,当Lempty为空时,len(L)为0。因此,or将始终执行第二部分。之后L是非空的,因此{*L[:x*k:x]}(仅适用于Python 3.5 set(L[:x*k:x]))将具有至少一个元素。

由于L[:x*k:x]可以最多k包含元素,而对于L非空元素k*(*{*L[:x*k:x]},)至少k可以包含元素,因此只有当k两个元素中都存在元素时,两者才能相等。为了做到这一点,{*L[:x*k:x]}必须只具有一种元素,即,在进行过程中我们只有一种颜色。

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.