같은 색의 산술 진행


15

반 데르 베르 덴의 정리에 따르면

임의의 주어진 양의 정수 r및에 대해 k, N정수 {1, 2, ..., N}r 서로 다른 색 중 하나를 사용하여 착색 되는 경우, 적어도 k동일한 색으로 산술적으로 진행되는 정수가있는 수가있다. NVan 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 |     |     |      |
+-----+-----+-----+-----+-----+-----+------+

답변:


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]},)

골프 버전의 첫 번째 패스에서 L비어 있으면 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]}려면 정확히 하나의 요소를 가져야합니다. 즉, 진행시 하나의 색상 만 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.