Tiến trình số học cùng màu


15

Định lý của Van der Waerden nói rằng

Đối với bất kỳ số nguyên dương đã cho nào rk, có một số số Nsao cho nếu các số nguyên {1, 2, ..., N}có màu, mỗi số có một r màu khác nhau, thì có ít nhất ksố nguyên trong tiến trình số học tất cả cùng một màu. Ít nhất Nlà số Van der Waerden W(r, k).

Mục tiêu của bạn là tính toán số Van der Waerden W(r, k)cho các đầu vào số nguyên dương rk. Ít byte nhất sẽ thắng.

Coi chừng chức năng này phát triển cực kỳ nhanh và tốn thời gian để tính toán. Thậm chí W(4, 4)là không biết. Bạn có thể giả sử mã của bạn chạy trên một máy tính lý tưởng với tài nguyên không giới hạn (thời gian, bộ nhớ, độ sâu ngăn xếp, v.v.). Về mặt lý thuyết, mã của bạn phải đưa ra câu trả lời đúng ngay cả đối với các giá trị mà câu trả lời không được biết.

Tích hợp tính toán chức năng này không được phép.

Thí dụ

Đối với r = 2màu sắc và tiến trình của chiều dài k = 3, có một 8chuỗi độ dài tránh sự tiến triển như vậy, tức là 3các phần tử có khoảng cách đều nhau của cùng một màu:

B R R B B R R B

Nhưng, không có 9trình tự dài như vậy, vì vậy W(2, 3) == 9. Ví dụ,

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

chứa 3tiến trình số học cùng màu được hiển thị.

Các trường hợp thử nghiệm

Có lẽ bạn sẽ chỉ có thể kiểm tra các trường hợp nhỏ.

+-----+-----+-----+-----+-----+-----+------+
|     | 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 |     |     |      |
+-----+-----+-----+-----+-----+-----+------+

Câu trả lời:


7

Python 3.5, 125 124 119 byte

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))

Thật buồn cười bởi vì, trong quá trình chơi golf này, chương trình thực sự có nhiều hiệu quả. Bất cứ điều gì vượt quá f(2,4)hoặc f(3,3)vẫn mất mãi mãi, mặc dù.

Giải trình

Phiên bản ban đầu đã kiểm tra xem một chuỗi có tiến trình độ dài hay không kbằng cách thử tất cả các chỉ số và bước bắt đầu có thể.

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))

Phiên bản golfed chỉ cần thử tất cả các bước có thể vì nó prepends yếu tố chuỗi mới. Các x*knắp là để chăm sóc những trường hợp như [0, 0, 1], trong đó có một tiến trình có độ dài 2 nhưng sẽ không đáp ứng việc kiểm tra tính độc đáo uncapped.

Đối với kiểm tra

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

Trên đường chuyền đầu tiên của phiên bản golf, khi Ltrống, len(L)là 0. Do đó, nửa sau của ý orchí sẽ luôn luôn được thực thi. Sau đó Llà không trống, vì vậy {*L[:x*k:x]}(chỉ là Python 3.5 cho set(L[:x*k:x])) sẽ có ít nhất một phần tử.

L[:x*k:x]có thể có tối đa các kphần tử và đối với phần tử Lkhông trống k*(*{*L[:x*k:x]},)có ít nhất kcác phần tử, hai phần tử chỉ có thể bằng nhau khi có chính xác kcác phần tử trong cả hai phần tử. Để điều này xảy ra {*L[:x*k:x]}phải có chính xác một yếu tố, tức là chúng ta chỉ có một màu trong tiến trình của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.