एन के लिए सबसे छोटे रास्तों की संख्या गिनें


21

इस कोड को चुनौती आप तरीकों तक पहुँचने के लिए की संख्या की गणना करनी होगी n से शुरू 2 फार्म के नक्शे का उपयोग एक्सएक्स+एक्सj (साथ j एक गैर नकारात्मक पूर्णांक), और चरणों की न्यूनतम संख्या में ऐसा करने से।

(ध्यान दें, यह OEIS अनुक्रम A307092 से संबंधित है ।)

उदाहरण

उदाहरण के लिए, (13)=2 क्योंकि तीन नक्शे के लिए आवश्यक हैं, और वहाँ तीन नक्शे भेज देंगे कि के दो अलग दृश्यों हैं 2 करने के लिए 13 :

xx+x0xx+x2xx+x0orxx+x2xx+x1xx+x0

जिसका परिणाम 231213 या 261213

उदाहरण मान

f(2)   = 1 (via [])
f(3)   = 1 (via [0])
f(4)   = 1 (via [1])
f(5)   = 1 (via [1,0])
f(12)  = 2 (via [0,2] or [2,1])
f(13)  = 2 (via [0,2,0] or [2,1,0], shown above)
f(19)  = 1 (via [4,0])
f(20)  = 2 (via [1,2] or [3,1])
f(226) = 3 (via [2,0,2,1,0,1], [3,2,0,0,0,1], or [2,3,0,0,0,0])
f(372) = 4 (via [3,0,1,0,1,1,0,1,1], [1,1,0,2,0,0,0,1,1], [0,2,0,2,0,0,0,0,1], or [2,1,0,2,0,0,0,0,1])

चुनौती

चुनौती यह व्यवस्था एक पूर्णांक लेता है का उत्पादन होता है n2 इनपुट प्रदान करने, और से अलग रास्तों की संख्या आउटपुट 2 के लिए n फार्म के नक्शे का एक न्यूनतम संख्या के माध्यम से xx+xj

यह , इसलिए सबसे कम बाइट जीतती है।


1
मुझे लगता है कि यह स्पष्ट रूप से ध्यान दिया जाना चाहिए कि ^प्रतीक घातांक को दर्शाता है। यह XOR भी हो सकता है (उदाहरण के लिए C बिट बिट ^XOR के लिए उपयोग करता है )।
रामलीज

1
@Ramillies शायद इसे MathJax में बदल दिया जाए। Ie बजाय । x=x+xjx -> x + x^j
केविन क्रूज़सेन

@ केविनक्रूजसेन: अच्छी बात है, यह निश्चित रूप से मदद करेगा।
रामलीज

मैं के रूप में OEIS को यह जोड़ लिया है A309997 । (यह अनुमोदित होने तक एक मसौदा होगा ।)
पीटर केजी

जवाबों:


2

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

2+*¥þ³Ḷ¤F$n³Ạ$¿ċ

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

एक पूर्ण कार्यक्रम अपने तर्क n रूप में ले रहा है और न्यूनतम पथ लंबाई का उपयोग करके n तक पहुंचने के तरीकों की संख्या वापस कर रहा है। बड़े n लिए अक्षम ।


5

जावास्क्रिप्ट (ईएस 6),  111 ... 84  80 बाइट्स

1n=2

f=(n,j)=>(g=(i,x,e=1)=>i?e>n?g(i-1,x):g(i-1,x+e)+g(i,x,e*x):x==n)(j,2)||f(n,-~j)

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

टिप्पणी की गई

f = (                     // f is the main recursive function taking:
  n,                      //   n = input
  j                       //   j = maximum number of steps
) => (                    //
  g = (                   // g is another recursive function taking:
    i,                    //   i = number of remaining steps
    x,                    //   x = current sum
    e = 1                 //   e = current exponentiated part
  ) =>                    //
    i ?                   // if there's still at least one step to go:
      e > n ?             //   if e is greater than n:
                          //     add the result of a recursive call with:
        g(i - 1, x)       //       i - 1, x unchanged and e = 1
      :                   //   else:
                          //     add the sum of recursive calls with:
        g(i - 1, x + e) + //       i - 1, x + e and e = 1
        g(i, x, e * x)    //       i unchanged, x unchanged and e = e * x
    :                     // else:
      x == n              //   stop recursion; return 1 if x = n
)(j, 2)                   // initial call to g with i = j and x = 2
|| f(n, -~j)              // if it fails, try again with j + 1

4

हास्केल , 78 75 बाइट्स

यह कार्यान्वयन "ट्री" में सांस-पहले-खोज का उपयोग करता है जो पुनरावृत्त रूप से सभी आवश्यक मैपिंग का उपयोग करता है x -> x + x^j

j#x=x+x^j
f n=[sum[1|x<-l,x==n]|l<-iterate((#)<$>[0..n]<*>)[2],n`elem`l]!!0

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

व्याख्या

-- computes the mapping x -> x + x^j
j#x=x+x^j                          
--iteratively apply this function for all exponents [0,1,...,n] (for all previous values, starting with the only value [2])
                            iterate((#)<$>[0..n]<*>)[2] 
-- find each iteration where our target number occurs
    [                   |l<-...........................,n`elem`l] 
-- find how many times it occurs
     sum   [1|x<-l,x==n] 
-- pick the first entry
f n=.............................................................!!0




1

CJam (27 बाइट्स)

qi2a{{_W$,f#f+~2}%_W$&!}ge=

ऑनलाइन डेमो

चेतावनी: यह बहुत तेजी से स्मृति-गहन हो जाता है।

विच्छेदन:

qi            e# Read input and parse to int n (accessed from the bottom of the stack as W$)
2a            e# Start with [2]
{             e# Loop
  {           e#   Map each integer x in the current list
    _W$,f#f+~ e#     to x+x^i for 0 <= i < n
    2         e#   and add a bonus 2 for the special case
  }%          e#   Gather these in the new list
  _W$&!       e#   Until the list contains an n
}g
e=            e# Count occurrences

बोनस 2s (इनपुट के विशेष मामले को संभालने के लिए2 , क्योंकि whileलूप्स छोरों से अधिक महंगे हैं do-while) का मतलब है कि सूची का आकार बहुत तेजी से बढ़ता है, और एक्सपोजर का उपयोग करने का n-1मतलब है कि सूची में बड़ी संख्याओं के मान बढ़ते हैं बहुत तेज़।


1

हास्केल , 65 बाइट्स

([2]%)
l%n|elem n l=sum[1|x<-l,x==n]|1>0=[x+x^k|x<-l,k<-[0..n]]%n

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

गोल्फिंग दोष की चौड़ाई-पहली-खोज । मैंने भी पीछे से जाने की कोशिश की n, लेकिन यह लंबा था:

73 बाइट्स

q.pure
q l|elem 2l=sum[1|2<-l]|1>0=q[x|n<-l,x<-[0..n],i<-[0..n],x+x^i==n]

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


1

आर , 78 77 बाइट्स

function(n,x=2){while(!{a=sum(x==n)})x=rep(D<-x[x<n],n+1)+outer(D,0:n,'^')
a}

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

एक सरलीकृत चौड़ाई-पहली खोज का उपयोग करना

स्पष्टीकरण के साथ अनियंत्रित कोड:

function(n){                              # function taking the target value n

  x=2                                     # initialize vector of x's with 2

  while(!(a<-sum(x==n))) {                # count how many x's are equal to n and store in a
                                          # loop while a == 0

    x=rep(D<-x[x<n],n+1)+outer(D,0:n,'^') # recreate the vector of x's 
                                          # with the next values: x + x^0:n
  }
a                                         # return a
}   

विशाल मेमोरी आवंटन के साथ छोटा संस्करण (बड़े मामलों के लिए असफल):

आर , 70 69 बाइट्स

function(n,x=2){while(!{a=sum(x==n)})x=rep(x,n+1)+outer(x,0:n,'^')
a}

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

-1 बाइट @RobinRyder के लिए धन्यवाद


!(a<-sum(x==n))!{a=sum(x==n)}दोनों मामलों में -1 बाइट के लिए हो सकता है ।
रॉबिन राइडर

0

अजगर , 24 बाइट्स

VQIJ/mu+G^GHd2^U.lQ2NQJB

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

यह सही आउटपुट का उत्पादन करना चाहिए, लेकिन बहुत धीमा है (372 टेस्ट केस टाइम आउट TIO पर)। मैं इसे बदल कर कम कर सकता है .lQ2के साथ Qहै, लेकिन इस क्रम खराब होगा।

नोट: अगम्य संख्याओं के लिए कोई आउटपुट नहीं देता है (n1)

व्याख्या

VQ                        # for N in range(Q (=input)):
   J                      #   J =
     m                    #     map(lambda d:
      u                   #       reduce(lambda G,H:
       +G^GH              #         G + G^H,
            d2            #         d (list), 2 (starting value) ),
              ^U.lQ2N     #       cartesian_product(range(log(Q, 2)), N)
    /                Q    #     .count(Q)
  IJ                  JB  #   if J: print(J); break
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.