ความก้าวหน้าทางคณิตศาสตร์สีเดียวกัน


15

ทฤษฎีบทของ Van der Waerdenกล่าวว่า

สำหรับจำนวนเต็มบวกใด ๆ ที่ได้รับrและkมีบางจำนวนNเช่นนั้นหากจำนวนเต็ม{1, 2, ..., N}เป็นสีแต่ละr สีมีสีต่างกันหนึ่งสีดังนั้นอย่างน้อยก็มีkจำนวนเต็มอย่างน้อยในการดำเนินการทางคณิตศาสตร์ที่มีสีเดียวกันทั้งหมด เช่นอย่างน้อยเป็นแวนเดอร์จำนวนN WaerdenW(r, k)

เป้าหมายของคุณคือการคำนวณ Van der Waerden จำนวน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

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

รุ่นแข็งแรงเล่นกอล์ฟเพียงต้องการที่จะลองขั้นตอนเป็นไปได้ทั้งหมดเพราะมันprependsองค์ประกอบลำดับใหม่ x*kหมวกคือการดูแลในกรณีเช่น[0, 0, 1]ซึ่งมีความคืบหน้าของความยาว 2 แต่จะไม่ตอบสนองการตรวจสอบเอกลักษณ์จุก

สำหรับการตรวจสอบ

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

ในรอบแรกของเวอร์ชัน golfed เมื่อ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.