रिकैमैन के डुप्लिकेट


14

Recamán के अनुक्रम को इस प्रकार परिभाषित किया गया है:

an={0if n = 0an1nif an1n>0 and is not already in the sequence,an1+notherwise

या छद्म कोड में:

a(0) = 0,
if (a(n - 1) - n) > 0 and it is not 
   already included in the sequence,
     a(n) = a(n - 1) - n 
else 
     a(n) = a(n - 1) + n. 

पहले नंबर हैं ( OEIS A005132 ):

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 25, 43, 62, 42, 63, 41, 18, 42

यदि आप इस क्रम का अध्ययन करते हैं, तो आप देखेंगे कि डुप्लिकेट हैं, उदाहरण के लिए a(20) = a(24) = 42(0-अनुक्रमित)। यदि अनुक्रम में इसके सामने कम से कम एक समरूप संख्या है तो हम एक नंबर को डुप्लिकेट कहेंगे।


चुनौती:

एक पूर्णांक इनपुट k लें , और आउटपुट या तो पहले k डुप्लिकेट संख्याओं के क्रम में पाए जाते हैं जो उन्हें Recamán's Sequence में डुप्लिकेट के रूप में मिलता है, या केवल k 'th संख्या।

यह पहली डुप्लिकेट संख्या हैं:

42, 43, 78, 79, 153, 154, 155, 156, 157, 152, 265, 261, 262, 135, 136, 269, 453, 454, 257, 258, 259, 260, 261, 262

ध्यान देने योग्य कुछ बातें:

  • a (n) एक डुप्लिकेट के रूप में गिना नहीं जाता है अगर (0) ... (n-1) में समान संख्याएं नहीं हैं , भले ही a (n + m) == a (n)
  • 42 43 से पहले होगा, क्योंकि इसकी नकल 43 के डुप्लिकेट से पहले होती है
  • अनुक्रम को क्रमबद्ध नहीं किया गया है
  • इस क्रम में डुप्लिकेट तत्व भी हैं। उदाहरण के लिए 12 वीं और 23 वीं संख्या दोनों 262 (0-अनुक्रमित) हैं।

परीक्षण के मामले (0-अनुक्रमित)

k      Output
    0      42
    9     152
   12     262
   23     262
  944    5197
  945   10023
10000   62114

यह , इसलिए प्रत्येक भाषा में सबसे छोटा कोड जीतता है!

स्पष्टीकरण को प्रोत्साहित किया जाता है!



43पहले आउटपुट क्यों नहीं है 42? यह रिकैमैन के अनुक्रम में पहले दिखाई देता है। क्या आपका मतलब है कि पहले आउटपुट जो पहले एक डुप्लिकेट पाया जाता है?
लुइस मेंडो

1
@LuisMendo जैसा कि मैं इसे समझता हूं, को बाद दिखाई देना चाहिए क्योंकि इसकी डुप्लिकेट घटना बाद में अनुक्रम में है (इसलिए की दूसरी घटना की दूसरी घटना से पहले होती है )। ४२ ४२ ४३43424243
मिस्टर एक्सकोडर

मैंने लोकप्रिय गणित भी देखा। हाल ही में प्रश्न:
ऑरलपी

@orlp हुह? क्या आप इसे लिंक कर सकते हैं? मैंने इसे नहीं देखा है ...
स्टीव ग्रिफिन

जवाबों:


5

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 88 85 76 बाइट्स

(For[i=k=j=p=0,k<#,i~FreeQ~p||k++,i=i|p;p+=If[p>++j&&FreeQ[i,p-j],-j,j]];p)&

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

1 अनुक्रमित।

व्याख्या

For[

For पाश।

i=k=j=p=0

i={a1,a2,}kj=np=an1

k<#

kइनपुट से कम होने पर दोहराएं ।

i=i|p

संलग्न pकरने के लिए iसिर का उपयोग कर Alternatives(की एक golfier संस्करण Listइस मामले में)।

p+=If[p>++j&&FreeQ[i,p-j],-j,j]

jpjan1>np-jian1np-jpj

i~FreeQ~p||k++

प्रत्येक यात्रा, वेतन वृद्धि kकरता है, तो pमें नहीं है i( ||(= or) शॉर्ट सर्किट अन्यथा)।

... ;p

वापसी p





2

जावास्क्रिप्ट (ईएस 6), 66 59 बाइट्स

एन-वें कार्यकाल लौटाता है , 0-अनुक्रमित।

i=>(g=x=>!g[x+=x>n&!g[x-n]?-n:n]||i--?g(g[n++,x]=x):x)(n=0)

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

कैसे?

हम का उपयोग ग्राम () हमारी मुख्य पुनरावर्ती समारोह के रूप में और एक वस्तु के रूप डुप्लिकेट का ट्रैक रखने के।

i => (                    // given i
  g = x =>                // g = recursive function and generic object
    !g[x +=               // update x:
      x > n & !g[x - n] ? //   if x is greater than n and x - n was not visited so far:
        -n                //     subtract n from x
      :                   //   else:
        n                 //     add n to x
    ]                     // if x is not a duplicate
    || i-- ?              // or x is a duplicate but not the one we're looking for:
      g(g[n++, x] = x)    //   increment n, mark x as visited and do a recursive call
    :                     // else:
      x                   //   stop recursion and return x
)(n = 0)                  // initial call to g() with n = x = 0

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