क्या आप बिल गेट्स को पछाड़ सकते हैं?


13

पैनकेक सॉर्टिंग आकार के क्रम में पेनकेक्स के एक अव्यवस्थित स्टैक को छांटने की गणितीय समस्या के लिए बोलचाल की अवधि है, जब स्टैक में किसी भी बिंदु पर एक स्पैटुला डाला जा सकता है और इसके ऊपर सभी पेनकेक्स को फ्लिप किया जा सकता है। एक पैनकेक नंबर P (n) n पेनकेक्स के लिए आवश्यक न्यूनतम फ्लैप है। 1

1979 में, एक युवा बिल गेट्स और क्रिस्टोस पापादिमित्रिउ ने P (n) = (5n + 5) / 3 की ऊपरी सीमा साबित करते हुए एक पत्र लिखा । 2

मुझे लगता है कि यह मान लेना सुरक्षित है कि गेट्स (और / या पापादिमित्रिउ) ने एल्गोरिथ्म का उपयोग करके पैनकेक छांटने का एक कार्यक्रम लिखा था, जो उन्होंने विकसित किया था (संभवतः 1979 के बाद)। चूंकि गेट्स एक कुशल प्रोग्रामर थे, उन्होंने संभवतः इस कोड को गोल्फ के साथ-साथ वे करने की कोशिश की, लेकिन स्रोत कोड का आकार सार्वजनिक रूप से उपलब्ध नहीं है (AFAIK)।

चुनौती:

एक फ़ंक्शन / प्रोग्राम बनाएं जो पैनकेक सॉर्टिंग करता है, जहां अधिकतम संख्या में फ़्लिप गेट्स और पापादिमित्रिउ द्वारा पाए गए बाउंड से अधिक नहीं है। 3 यदि आप सूची को आरोही या अवरोही चाहते हैं, तब तक आप इसे चुन सकते हैं, जब तक यह सुसंगत है।

आप मान सकते हैं कि n <50 । इसलिए आपको फ़्लिप की संख्या को सीमित करना होगा (कुछ बेतरतीब ढंग से चयनित n- स्तर):

 n   P(n)
38   65
49   83
50   85

आउटपुट प्रत्येक फ्लिप से पहले स्पैटुला की स्थिति होना चाहिए। उत्पादन शून्य या एक-अनुक्रमित हो सकता है, और यदि आप ऊपर या नीचे से गिनते हैं, तो आप चुन सकते हैं।

अतिरिक्त नियम:

  • रनटाइम निर्धारक होना चाहिए
  • कोई निश्चित समय सीमा नहीं है, लेकिन आपको 50 तत्वों के साथ सूची के लिए आउटपुट प्रदान करने में सक्षम होना चाहिए

परीक्षण सूचियाँ:

मैं सबसे कठिन सूची प्रदान नहीं कर सकता (यदि हां, तो मैं एक पेपर लिखूंगा, एक चुनौती नहीं), इसलिए मैं कुछ यादृच्छिक सूचियां प्रदान करूंगा, जिन पर आप अपने कार्यों / कार्यक्रमों का परीक्षण कर सकते हैं। यदि यह सूची "आसान" है तो मैं दूसरों को जोड़ सकता हूं।

9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21

उम्मीद है कि बिल गेट्स और पापादिमित्रियो इस चुनौती को देखेंगे, और अपना कोड प्रदान करेंगे, ताकि हम यह निर्धारित कर सकें कि क्या आपने वास्तव में उन्हें आउटगोल्फ किया था।

3 बेहतर ऊपरी सीमाएं मिली हैं, लेकिन आपको उन लोगों की परवाह करने की आवश्यकता नहीं है।


संबंधित , लेकिन डुप्लिकेट नहीं। वहाँ जवाब यहाँ काम नहीं करेगा।
स्टिव ग्रिफ़िन

मैंने अपने समाधान में बीएफएस का उपयोग वहां किया था, फिर भी, यह कम से कम फ़्लिप की संख्या के साथ समाधान खोजने के लिए यहां (थोड़े अपडेट के साथ) काम करना चाहिए।
मील

@ मीलों इसे पोस्ट करने के लिए स्वतंत्र महसूस करें। मैं सभी उत्तरों के बारे में विस्तार से नहीं जानता था, लेकिन ज्यादातर सिर्फ भोले दृष्टिकोण का उपयोग करते थे।
स्टीवी ग्रिफिन

जवाबों:


4

पायथन 2 (PyPy) , 238 235 222 बाइट्स

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

* (2 रिक्त स्थान = टैब)

इसे ऑनलाइन आज़माएं!

सहेजे गए 13 बाइट्स एक सूची रैंकिंग के लिए एक विधि ।

डीएफएस एक साधारण हेयुरिस्टिक के साथ जो यह जांचता है कि क्या एक फ्लिप "पेनकेक्स" की एक जोड़ी को अलग करता है जो क्रमबद्ध होने पर आसन्न होगा। इसे आरोही क्रम में ले जाता है। आउटपुट 0 बाईं ओर से अनुक्रमित है जहां 0 पहले 2 फ़्लिप करता है और इसी तरह। इस्तेमाल किए गए चालों की संख्या 2009 में (5/3)*n+1 < 5/3*(n+1)कहाँ पाई गई है (18/11)*n < (5/3)*n+1 < 5/3*(n+1)और (18/11)*nएक तंग ऊपरी सीमा है ।

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