आधा-विस्तारक कार्य


21

एक अर्ध-घातीय फ़ंक्शन वह है, जो स्वयं के साथ रचना करने पर एक घातीय फ़ंक्शन देता है। उदाहरण के लिए, यदि f(f(x)) = 2^x, तो fएक आधा घातीय कार्य होगा। इस चुनौती में, आप एक विशिष्ट अर्ध-घातीय फ़ंक्शन की गणना करेंगे।

विशेष रूप से, आप निम्न गुणों वाले गैर-ऋणात्मक पूर्णांकों से गैर-नकारात्मक पूर्णांकों तक फ़ंक्शन की गणना करेंगे:

  • नीरस रूप से बढ़ रहा है: यदि x < y, तबf(x) < f(y)

  • कम से कम आधा घातांक: सभी के लिए x,f(f(x)) >= 2^x

  • लेक्सोग्राफिक रूप से सबसे छोटा: उपरोक्त गुणों के साथ सभी कार्यों के बीच, जो कम से कम f(0)होता है उसे आउटपुट देता है , जो कि पसंद को कम करता है f(1), फिर f(2), और इसी तरह।

इनपुट के लिए इस फ़ंक्शन के प्रारंभिक मूल्य 0, 1, 2, ...हैं:

[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]

आप इस फ़ंक्शन को निम्न विधियों में से किसी एक फ़ंक्शन के रूप में या पूर्ण प्रोग्राम के रूप में आउटपुट कर सकते हैं:

  • xइनपुट, आउटपुट के रूप में लें f(x)

  • xइनपुट के रूप में लें , का पहला xमान आउटपुट करें f

  • असीम रूप से सभी का उत्पादन f

यदि आप लेना xऔर उत्पादन करना चाहते हैं f(x), xतो शून्य अनुक्रमित होना चाहिए।

संदर्भ कार्यान्वयन

यह कोड गोल्फ है - बाइट्स जीत में सबसे छोटा कोड। मानक खामियों पर हमेशा की तरह प्रतिबंध लगा दिया जाता है।


लगता है कि परिभाषा 0: f (f (0)) = f (1) = 2 के लिए सत्यापित नहीं है, लेकिन 2 ^ 0 = 1
Nahuel Fouilleul

और 1: f (f (1)) = f (2) = 3 के लिए, लेकिन 2 ^ 1 = 2
नहुएल फौलीउल

1
@NahuelFouilleul की आवश्यकता f (f (x)) > = 2 ^ x है।
मार्टिन एंडर

1
क्या हमें OEIS को प्रस्तुत करना चाहिए ?
जेपी स्टिग नीलसन 13

जवाबों:


8

जावास्क्रिप्ट (ईएस 7), 51 48 बाइट्स

सहेजे गए 3 बाइट @Arnauld के लिए धन्यवाद

f=i=>i?f[f[q=f(i-1),r=f[i]||q+1]=(i>1)<<i,i]=r:1

N में लेता है और अनुक्रम में n 'वें आइटम को आउटपुट करता है।


जावास्क्रिप्ट (ईएस 7), 70 68 64 बाइट्स

f=(n,a=[],q=1)=>n?f(n-1,a,(n=2**a.indexOf(a.push(q)))<++q?q:n):a

एक पुनरावर्ती फ़ंक्शन जो अनुक्रम xके पहले xआइटम को एक सरणी के रूप में लेता और वापस करता है ।

यह काम किस प्रकार करता है

सरणी एक प्रक्रियात्मक रूप से उत्पन्न होती है, एक बार में एक आइटम, जब तक यह वांछित लंबाई तक नहीं पहुंच जाता। ( Xnor के उत्कृष्ट पायथन उत्तर में प्रयुक्त अनंत तकनीक का एक पोर्ट संभवतः छोटा होगा।)

हम प्रत्येक सूचकांक i (0-अनुक्रमित) के लिए निम्नलिखित अवलोकन कर सकते हैं :

  • अगर मैं में एक आइटम के रूप में मौजूद एक सूचकांक पर जे ( एक [जे] = मैं ), तो एक [i] कम से कम होने की जरूरत है 2 जे

यह सच है क्योंकि है च (च (जे)) कम से कम होने की जरूरत है 2 जे , और च (च (जे)) के बराबर है एक [एक [जे]] , जो करने के लिए बारी बराबर में है एक [i]

आम तौर पर सही विकल्प 2 जे है । हालांकि, विलक्षण मामले के लिए मैं = 2 , 2 सूचकांक में सरणी में मौजूद है j = 1 , जिसका अर्थ है कि 2 j होगा 2 इस का मतलब है -लेकिन है कि हम के लिए होता है 2 दोनों में एक [1] और एक [2] । इसके चारों ओर जाने के लिए, हम अधिकतम 2 j और एक [i-1] + 1 (पिछले आइटम से एक अधिक) लेते हैं , जो i = 2 के लिए 3 देता है ।

यह तकनीक यह तय करने की देखभाल करने के लिए भी होती है कि क्या j मौजूद है या नहीं - यदि ऐसा नहीं होता है, तो JS की .indexOf()विधि -1 लौटती है , जो एक [i-1] + 1 और 2 -1 = 0.5 का अधिकतम लाभ लेती है । चूंकि अनुक्रम में सभी आइटम कम से कम 1 हैं , यह हमेशा पिछले आइटम को प्लस एक लौटाएगा।

(मैं यह स्पष्टीकरण देर रात को लिख रहा हूं, इसलिए कृपया मुझे बताएं कि कुछ गड़बड़ है या मैंने कुछ भी याद किया है)


ध्यान दें कि 272पूर्णांक समस्याओं के कारण इनपुट और अप गलत उत्तर देते हैं। यह ठीक है, क्योंकि यह डेटाटाइप की सीमा तक काम करता है।
isaacg

का प्रयोग करें 2**बजाय 1<<उम्मीद है कि इस समस्या को ठीक।
user202729

अब .99समाधान को मारता है। लेकिन +.99सिर्फ और सिर्फ इस्तेमाल क्यों नहीं +.9? क्या फर्क पड़ता है?
user202729

@ user202729 मैं एक बेवकूफ की तरह महसूस करता हूं - जो कि पिछले संस्करण से बचा हुआ था जहां मैं उपयोग कर रहा था Math.log2(...)और छत की गणना करना था। अब इसकी बिल्कुल जरूरत नहीं है। धन्यवाद! मैं इस 2**बात पर गौर करूंगा - मैं 2**...+.99|0मूल रूप से उपयोग कर रहा था , लेकिन 1<<कम था क्योंकि मुझे इसकी आवश्यकता नहीं थी |0। अब मुझे लगता है कि कोई अंतर नहीं है ...
ETHproductions




1

जेली , 14 बाइट्स

iL’2*»Ṁ‘$ṭ
⁸Ç¡

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

यह काम किस प्रकार करता है

⁸Ç¡         Main link. No arguments.

⁸           Set the left argument and the return value to [].
 Ç¡         Read an integer n from STDIN and call the helper link n times, first on
            [], then on the previous result. Return the last result.


iL’2*»Ṁ‘$ṭ  Helper link. Argument: A (array)

 L          Take the length of A. This is the 0-based index of the next element.
i           Find its 1-based index in A (0 if not present).
  ’         Decrement to a 0-based index (-1 if not present).
   2*       Elevate 2 to the 0-based index.
      Ṁ‘$   Take the maximum of A and increment it by 1.
            Note that Ṁ returns 0 for an empty list.
     »      Take the maximum of the results to both sides.
         ṭ  Tack (append) the result to A.

0

पायथन 2 , 111 बाइट्स

def f(x):
 a=range(1,2**x)
 for i in range(1,x):a[i]=max(a[i],a[i-1]+1);a[a[i]]=max(a[a[i]],2**i)
 return a[:x]

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

यह user202729 के उत्तर का एक महत्वपूर्ण संशोधन है । मैंने इस सुधार को एक टिप्पणी के रूप में पोस्ट किया होगा, लेकिन उत्तर हटा दिया गया है और इसलिए टिप्पणियाँ अक्षम हैं।


यह "सूची से बाहर की सूची के साथ विफल रहता है" इनपुट 258 पर अपवाद। मुझे लगता है कि समस्या x**2बहुत छोटी है।
isaacg

खैर ... अजगर 2 अलग है (अक्सर कम बाइट्स) पायथन 3 से
user202729

1
जैसा कि अपेक्षित था, अर्ध-घातीय द्विघात से बड़ा है। समाधान में "सूची सूचकांक को सीमा से बाहर" मिलता है x=1000। आप कोशिश कर सकते हैं 2**x- बहुत बड़ा है, लेकिन कोडगोल्फ कोडगोल्फ है।
user202729

@ user202729 आह, यह सच है। दुर्भाग्य से यह अब बड़े इनपुट के साथ एक पूरी तरह से अलग समस्या का सामना करता है जो कि 2**xपायथन के लिए जारी रखने के लिए बहुत अधिक रेंज बनाता है।
नॉटजागन

0

स्विफ्ट , 137 बाइट्स

func f(n:Int){var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};print(l)}

Int(पूर्णांक) के रूप में इनपुट लेता है और [Int](पूर्णांक सरणी) के रूप में प्रिंट करता है ।

अनप्लग्ड संस्करण

func f(n:Int){
    var l = Array(1...n).map{$0 > 3 ? 0 : $0} // Create the range from 1 to n and set all
    var p = 8                                 // values greater than 3 to 0
    if n > 3 {
        for i in 3 ..< n {
            if l[i] < 1 {
                l[i] = l[i - 1] + 1
            }
            if l[i] < n {
                l[l[i]] = p
            }
            p *= 2
        }
    }
    print(l)
}

मैं उत्सुक हूँ, यदि आप अंतरिक्ष को इससे पहले हटा दें तो क्या होगा ??
ETHproductions

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