यूलरियन संख्या की गणना करें


17

Eulerian संख्या A(n, m) के क्रमपरिवर्तन की संख्या है [1, 2, ..., n], जिसमें वास्तव में mतत्वों पिछले तत्व से अधिक है। इन्हें उगता भी कहा जाता है । उदाहरण के लिए, यदि n = 3, 3 हैं! = 6 के क्रमपरिवर्तन[1, 2, 3]

1 2 3
 < <  2 elements are greater than the previous

1 3 2
 < >  1 ...

2 1 3
 > <  1 ...

2 3 1
 < >  1 ...

3 1 2
 > <  1 ...

3 2 1
 > >  0 ...

के लिए outputs तो A(3, m)के लिए mमें [0, 1, 2, 3]हो जाएगा

A(3, 0) = 1
A(3, 1) = 4
A(3, 2) = 1
A(3, 3) = 0

इसके अलावा, यह OEIS अनुक्रम A173018 है

नियम

  • यह इसलिए सबसे छोटा कोड जीतता है।
  • इनपुट nएक nonnegative पूर्णांक mहोगा और सीमा में पूर्णांक होगा [0, 1, ..., n]

परीक्षण के मामलों

n   m   A(n, m)
0   0   1
1   0   1
1   1   0
2   0   1
2   1   1
2   2   0
3   0   1
3   1   4
3   2   1
3   3   0
4   0   1
4   1   11
4   2   11
4   3   1
4   4   0
5   1   26
7   4   1191
9   5   88234
10  5   1310354
10  7   47840
10  10  0
12  2   478271
15  6   311387598411
17  1   131054
20  16  1026509354985
42  42  0

पर कोई सीमा n, m?
लवजो

इसकी कोई सीमा नहीं है, लेकिन इसकी आवश्यकता नहीं है कि आपका सबमिशन एक निश्चित समय में एक परीक्षण मामले को पूरी तरह से निष्पादित करने में सक्षम हो, केवल सही तर्क हो। अधिमानतः, मैं 20 तक के मानों को संभालने के लिए प्रस्तुतियाँ चाहूंगा, लेकिन मैंने इसे निष्पादन-आवश्यकता के बिना ब्रूट-बल समाधानों की अनुमति देने के लिए छोड़ दिया, जो केवल काम कर सकते हैं n = 10
मील

क्या इनपुट में m> = n, n> 0 हो सकता है?
feersum

नहीं होना चाहिए, "मीटर रेंज में पूर्णांक होगा [0, 1, ..., n]" हो "... [0, 1, ..., n-1]"?
जोनाथन एलन

@feersum आपका समाधान किसी भी समर्थन कर सकते हैं mअगर वांछित है, लेकिन मैं केवल आवश्यकता है कि इसके लिए 0 <= मान्य होना मीटर <= n के साथ 0 <= n
मील

जवाबों:


9

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

Œ!Z>2\Sċ

इसे ऑनलाइन आज़माएं! (कुछ समय लगता है) या छोटे परीक्षण मामलों को सत्यापित करें

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

Œ!Z>2\Sċ  Main link. Arguments: n, m

Œ!        Generate the matrix of all permutations of [1, ..., n].
  Z       Zip/transpose, placing the permutations in the columns.
   >2\    Compare columns pairwise with vectorizing greater-than.
          This generates a 1 in the column for each rise in that permutation.
      S   Compute the vectorizing sum of the columns, counting the number of rises.
       ċ  Count how many times m appears in the computed counts.

6

जावास्क्रिप्ट (ईएस 6), 50 46 45 बाइट्स

f=(n,m,d=n-m)=>m?d&&f(--n,m)*++m+f(n,m-2)*d:1

पुनरावर्ती सूत्र के आधार पर:

A(n, m) = (n - m)A(n - 1, m - 1) + (m + 1)A(n - 1, m)    

परीक्षण के मामलों


4

MATL , 10 बाइट्स

:Y@!d0>s=s

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

व्याख्या

एक उदाहरण के इनपुट के रूप में विचार करें n=3,m=1 । आप %उस बिंदु से कोड पर टिप्पणी करने के लिए एक प्रतीक रख सकते हैं और इस प्रकार मध्यवर्ती परिणाम देख सकते हैं। उदाहरण के लिए, लिंक पहले चरण के बाद स्टैक दिखाता है।

:      % Input n implicitly. Push [1 2 ... n]
       % STACK: [1 2 ... n]
Y@     % Matrix of all permutations, one on each row
       % STACK: [1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1]
!      % Transpose
       % STACK: [1 1 2 2 3 3; 2 3 1 3 1 2; 3 2 3 1 2 1]
d      % Consecutive differences along each column
       % STACK: [1 2 -1 1 -2 -1; 1 -1 2 -2 1 -1]
0>     % True for positive entries
       % STACK: [1 1 0 1 0 0; 1 0 1 0 1 0]
s      % Sum of each column
       % STACK: [2 1 1 1 1 0]
=      % Input m implicitly. Test each entry for equality with m
       % STACK: [0 1 1 1 1 0]
s      % Sum. Implicitly display
       % STACK: 4

4

CJam ( 21 19 बाइट्स - या 18 यदि तर्क आदेश मुफ़्त है)

{\e!f{2ew::>1b=}1b}

यह एक अनाम ब्लॉक (फ़ंक्शन) है जो n mस्टैक पर ले जाता है । (यदि इसे m nस्टैक पर ले जाने की अनुमति है तो \बचाया जा सकता है)। यह सभी क्रमपरिवर्तन और फिल्टर की गणना करता है, इसलिए ऑनलाइन टेस्ट सूट सीमित होना चाहिए।

मार्टिन के लिए एक सन्निकटन इंगित करने के लिए धन्यवाद filter-with-parameter

विच्छेदन

{        e# Define a block. Stack: n m
  \      e#   Flip the stack to give m n
  e!f{   e#   Generate permutations of [0 .. n-1] and map with parameter m
    2ew  e#     Stack: m perm; generate the list of n-1 pairs of consecutive
         e#     elements of perm
    ::>  e#     Map each pair to 1 if it's a rise and 0 if it's a fall
    1b   e#     Count the falls
    =    e#     Map to 1 if there are m falls and 0 otherwise
  }
  1b     e#   Count the permutations with m falls
}

ध्यान दें कि यूलरियन संख्या सममित हैं: E(n, m) = E(n, n-m)इसलिए यह अप्रासंगिक है कि क्या आप गिरते हैं या उगते हैं।

कुशलता से: 32 बाइट्स

{1a@{0\+_ee::*(;\W%ee::*W%.+}*=}

ऑनलाइन टेस्ट सूट

यह पूरी पंक्तियों पर पुनरावृत्ति को लागू करता है।

{          e# Define a block. Stack: n m
  1a@      e#   Push the row for n=0: [1]; and rotate n to top of stack
  {        e#   Repeat n times:
           e#     Stack: m previous-row
    0\+_   e#     Prepend a 0 to the row and duplicate
    ee::*  e#     Multiply each element by its index
           e#     This gives A[j] = j * E(i-1, j-1)
    (;     e#     Pop the first element, so that A[j] = (j+1) * E(i-1, j)
    \W%    e#     Get the other copy of the previous row and reverse it
    ee::*  e#     Multiply each element by its index
           e#     This gives B[j] = j * E(i-1, i-1-j)
    W%     e#     Reverse again, giving B[j] = (i-j) * E(i-1, j-1)
    .+     e#     Pointwise addition
  }*
  =        e#   Extract the element at index j
}

यह एक मानचित्र का उपयोग करके चर से बचने के लिए छोटा है {e!f{2ew::>1b=}1e=}:। या सिर्फ मनोरंजन के लिए:{e!f{2ew::>+:-}0e=}
मार्टिन एंडर

वह मूर्ख था, निश्चित रूप से। 1e=पहले समाधान में हो सकता है 1b
मार्टिन एंडर

आपको अपने स्वयं के तर्क क्रम का उपयोग करने की अनुमति है
मील

3

पायथन, 55 56 बाइट्स

a=lambda n,m:n>=m>0and(n-m)*a(n-1,m-1)-~m*a(n-1,m)or m<1

सभी पर repl.it परीक्षण

OEIS पर पुनरावर्ती सूत्र लागू करता है।
ध्यान दें कि +(m+1)*a(n-1,m)यह गोल्फ है -~m*a(n-1,m)
(प्रतिनिधित्व 1या करने के लिए बूलियन मान 0वापस Trueकर n<0 and m<=0सकते हैं m<0


किनारे के मामलों को संभालने के लिए कई अन्य तरीके हैं। यह संभालने के लिए पर्याप्त होता है m<1 ? 1 : m==n ? 0 : formula, समतुल्य रूप m%n<1 ? (m<1) : formula; या वैकल्पिक रूप से m<1 ? (n>=0) : formula
पीटर टेलर

मुझे यह मिल गया, बस धन्यवाद अपडेट कर रहा हूं
जोनाथन एलन

चूँकि हमारे उत्तर बहुत मिलते-जुलते हैं, और आपका पोस्ट पहले था (और छोटा है), मैं आगे जाऊंगा और मेरा डिलीट कर दूंगा।
लवजो

@ लेलोवो ने कुछ हद तक उन्मत्त बिखरते हुए कहा :( आपको मेरे द्वारा वैसे भी एक ^ वोट मिला!
जोनाथन एलन

3

गणितज्ञ, ५ ९ ५६ बाइट्स

_~f~0=1
n_~f~m_:=If[m>n,0,(n-m)f[n-1,m-1]+(m+1)f[n-1,m]]

और यहां एक 59 बाइट संस्करण है जो परिभाषा को और अधिक शाब्दिक रूप से लागू करता है:

Count[Count@1/@Sign/@Differences/@Permutations@Range@#,#2]&

सिर्फ f[n_,m_]:=...49 के लिए क्यों नहीं ?
जोनाथन एलन

@JonathanAllan मुझे यकीन नहीं है कि मैं समझ गया हूँ। कैसे आधार मामले को संभालता है?
मार्टिन एंडर

ठीक है, कुछ कैश किया गया था - बस एक नई वर्कशीट में किया था और यह पुनरावृत्ति सीमा के साथ विफल रहा। :)
जोनाथन एलन

वहाँ भी सूत्र है जो 46 बाइट्स का उपयोग करता है Sum[Binomial[#+1,k](#2+1-k)^#(-1)^k,{k,0,#2}]&जो अधिक गोल्फ के लिए संभव हो सकता है
मील

3

पायथन, 53 बाइट्स

t=lambda n,k:n and(n-k)*t(n-1,k-1)-~k*t(n-1,k)or k==0

OEIS से पुनरावृत्ति। जब तक बूलियन आउटपुट Trueकरता है ।1n==k



2

गेममेकर भाषा, 62 बाइट्स

यह A@ अर्नुल्ड के सूत्र पर आधारित एक पुनरावर्ती स्क्रिप्ट है।

n=argument0;m=argument1;return (n-m)*A(n-1,m-1)+(m+1)*A(n-1,m)

कुछ समय में ऐसा नहीं देखा गया!
टॉस

1

पर्ल, 98 बाइट्स

sub a{my($b,$c)=@_;return$c?$c>$b?0:($b-$c)*a($b-1,$c-1)+($c+1)*a($b-1,$c):1;}print a(@ARGV[0,1]);

अरनौलद के जवाब के समान संपत्ति के आधार पर।


1

आर, 72 बाइट्स

OEIS पर तर्क के बाद पुनरावर्ती कार्य।

A=function(n,m)if(!m)1 else if(m-n)0 else(n-m)*A(n-1,m-1)+(m+1)*A(n-1,m)

यह चुनौती मेरे द्वारा आजमाए गए अलग-अलग तरीकों के बीच काफी करीब से सामने आई। उदाहरण के लिए, विकिपीडिया फॉर्मूला का उपयोग करते हुए और योग पर लूपिंग के परिणामस्वरूप 92 बाइट्स हुए:

function(n,m){s=0;if(!n)1 else for(k in -1:m+1)s=c(s,(-1)^k*choose(n+1,k)*(m+1-k)^n);sum(s)}

या 87 बाइट्स के लिए वेक्टर किए गए संस्करण:

function(n,m)if(!m)1 else sum(sapply(-1:m+1,function(k)(-1)^k*choose(n+1,k)*(m+1-k)^n))

और अंत में जानवर बल समाधान (103 बाइट्स) जो permuteपैकेज और फ़ंक्शन का उपयोग करके सभी क्रमपरिवर्तन का एक मैट्रिक्स उत्पन्न करता है allPerms। यह दृष्टिकोण केवल n<8हालांकि काम करता है ।

function(n,m){if(!m)1 else sum(apply(rbind(1:n,permute:::allPerms(n)),1,function(x)sum(diff(x)>0))==m)}

1

रैकेट 141 बाइट्स

(count(λ(x)(= x m))(for/list((t(permutations(range 1(+ 1 n)))))(count
(λ(x)x)(for/list((i(sub1 n)))(>(list-ref t(+ 1 i))(list-ref t i))))))

Ungolfed:

(define (f n m)
  (let* ((l (range 1 (add1 n)))                ; create a list till n
         (pl (permutations l))                 ; get all permutations
         (enl (for/list ((t pl))               ; check each permutation; 
                (define rl
                  (for/list ((i (sub1 n)))     ; check if an element is a 'rise'
                    (> (list-ref t (add1 i))
                       (list-ref t i))))
                (count (lambda(x)x) rl))))     ; how many numbers are 'rises'
    (count (lambda(x) (= x m)) enl)))          ; how many permutations had m rises
                                               ; i.e. Eulerian number

परिक्षण:

(f 3 0)
(f 3 1)
(f 3 2)
(f 3 3)
(f 4 2)
(f 5 1)
(f 7 4)

आउटपुट:

1
4
1
0
11
26
1191

1

दरअसल , २१ 19 बाइट्स

यह उत्तर एक डेनिस के समान एल्गोरिथ्म का उपयोग करता है जो उसके जेली उत्तर में उपयोग होता है । <मेरे गिनते समय मूल परिभाषा मायने रखती है >। यह अंत में समतुल्य होता है। गोल्फ सुझाव का स्वागत करते हैं। इसे ऑनलाइन आज़माएं!

;R╨`;\ZdX"i>"£MΣ`Mc

Ungolfing

         Implicit input m, then n.
;        Duplicate n. Stack: n, n, m
R        Push range [1..n].
╨        Push all n-length permutations of the range.
`...`M   Map the following function over each permutation p.
  ;\       Duplicate and rotate p so that we have a list of the next elements of p.
  Z        Zip rot_p and p.
           (order of operands here means the next element is first,
            so we need to use > later)
  dX       Remove the last pair as we don't compare the last and first elements of the list.
  "i>"£    Create a function that will flatten a list and check for a rise.
  M        Map that function over all the pairs.
  Σ        Count how many rises there are in each permutation.
c        Using the result of the map and the remaining m, 
          count how many permutations have m rises.
         Implicit return.


0

जे, 28 बाइट्स

+/@((!>:)~*(^~#\.)*_1^])i.,]

सूत्र का उपयोग करता है

सूत्र

प्रयोग

   f =: +/@((!>:)~*(^~#\.)*_1^])i.,]
   0 f 0
1
   1 f 0
1
   1 f 1
0
   (f"+i.,]) 6
1 57 302 302 57 1 0
   20x f 16x
1026509354985

व्याख्या

+/@((!>:)~*(^~#\.)*_1^])i.,]  Input: n (LHS), m (RHS)
                        i.    Range [0, 1, ..., m-1]
                           ]  Get m
                          ,   Join to get k = [0, 1, ..., m]
                      ]       Get k
                   _1^        Raise -1 to each in k
              #\.               Get the length of each suffix of k
                                Forms the range [m+1, m, ..., 2, 1]
            ^~                  Raise each value by n
                  *           Multiply elementwise with (-1)^k
    (   )~                      Commute operators
      >:                        Increment n
     !                          Binomial coefficient, C(n+1, k)
          *                   Multiply elementwise
+/@                           Reduce by addition to get the sum and return
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.