एक ही रंग अंकगणितीय प्रगति


15

वान डेर वेर्डन की प्रमेय कहती है कि

किसी भी दिए गए सकारात्मक पूर्णांक के लिए rऔर k, कुछ संख्या Nऐसी है कि यदि पूर्णांक {1, 2, ..., N}रंगीन हैं, प्रत्येक r अलग-अलग रंगों में से एक है , तो kसभी समान रंग के अंकगणितीय प्रगति में कम से कम पूर्णांक हैं। सबसे कम Nवान वेर्डेन संख्या है W(r, k)

आपका लक्ष्य वान-डर वेर्डन संख्या की गणना करना है जो W(r, k)सकारात्मक-पूर्णांक इनपुट देता है rऔर k। सबसे कम बाइट्स जीतता है।

खबरदार कि यह फ़ंक्शन बहुत जल्दी बढ़ता है और गणना करने में समय लगता है। यहां तक W(4, 4)कि अज्ञात भी है। आप अपने कोड को एक आदर्श कंप्यूटर पर असीमित संसाधनों (समय, स्मृति, स्टैक गहराई, आदि) के साथ चला सकते हैं। आपके कोड को सैद्धांतिक रूप से उन मूल्यों के लिए भी सही उत्तर देना होगा जिनके लिए उत्तर ज्ञात नहीं है।

अंतर्निहित फ़ंक्शन जो इस फ़ंक्शन की गणना करते हैं, उन्हें अनुमति नहीं है।

उदाहरण

के लिए r = 2रंग और लंबाई की प्रगति k = 3, वहाँ एक length- है 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))

Golfed संस्करण केवल सभी संभव कदम के बाद से यह कोशिश करने की जरूरत है पहले जोड़ता नया अनुक्रम तत्वों। x*kटोपी के मामलों की देखभाल करने के लिए की तरह है [0, 0, 1]जो, लंबाई 2 के एक प्रगति में शामिल है लेकिन संतुष्ट नहीं होता विशिष्टता की जांच uncapped।

जाँच के लिए

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

गोल्फ संस्करण के पहले पास पर, जब Lखाली होता है, len(L)तो 0. इस प्रकार दूसरी छमाही orको हमेशा निष्पादित किया जाएगा। उसके बाद Lगैर-रिक्त है, इसलिए {*L[:x*k:x]}(जो कि केवल पायथन 3.5 के लिए है set(L[:x*k:x])) में कम से कम एक तत्व होगा।

चूंकि L[:x*k:x]अधिकांश kतत्वों में हो सकता है और Lगैर-खाली k*(*{*L[:x*k:x]},)के लिए कम से कम kतत्व होते हैं, दोनों केवल तभी समान हो सकते हैं जब kदोनों में बिल्कुल तत्व हों। ऐसा होने के {*L[:x*k:x]}लिए बिल्कुल एक तत्व होना चाहिए, अर्थात हमारी प्रगति में केवल एक ही रंग है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.