क्रम को आगे बढ़ाते हुए


23

परिचय

आइए निम्नलिखित अनुक्रम (गैर-नकारात्मक पूर्णांक) देखें:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...

उदाहरण के लिए, पहले तीन संख्याएँ लेते हैं । ये हैं 0, 1, 2। इस क्रम में प्रयुक्त संख्याओं को छह अलग-अलग तरीकों से क्रमबद्ध किया जा सकता है:

012   120
021   201
102   210

तो, मान लीजिए कि एफ (3) = 6 । एक और उदाहरण एफ (12) है । इसमें नंबर शामिल हैं:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11

या संक्षिप्त संस्करण:

01234567891011

इसे पुनर्व्यवस्थित करने के तरीकों की संख्या का पता लगाने के लिए, हमें सबसे पहले इस तार की लंबाई को देखना होगा। इस तार की लंबाई है 14। तो हम 14 की गणना करते हैं ! । हालाँकि, उदाहरण के लिए अंतिम स्थानों को बाधित किए बिना स्थानों का आदान-प्रदान कर सकते हैं। 2 शून्य हैं, इसलिए 2 हैं! आदेश को बाधित किए बिना शून्य को बाहर निकालने के तरीके । वहाँ भी 4 हैं, इसलिए 4 हैं!लोगों को स्विच करने के तरीके। हम कुल को इन दो संख्याओं से विभाजित करते हैं:

यह 14 है! / (4! × 2!) = 1816214400 स्ट्रिंग को व्यवस्थित करने के तरीके 01234567891011। तो हम यह निष्कर्ष निकाल सकते हैं कि F (12) = 1816214400

काम

दिए गए एन , आउटपुट एफ (एन) । उन लोगों के लिए जिन्हें परिचय की आवश्यकता नहीं है। एफ (एन) की गणना करने के लिए, हम पहले पहले एन गैर-नकारात्मक पूर्णांक (जैसे एन = 12 के लिए, संक्षिप्त स्ट्रिंग होगा 01234567891011) को संक्षिप्त करते हैं और इस स्ट्रिंग को व्यवस्थित करने के तरीकों की संख्या की गणना करते हैं।

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

Input:   Output:
0        1
1        1
2        2
3        6
4        24
5        120
6        720
7        5040
8        40320
9        362880
10       3628800
11       119750400
12       1816214400
13       43589145600
14       1111523212800
15       30169915776000

ध्यान दें

उत्तर की गणना 10 सेकंड की समय सीमा के भीतर की जानी चाहिए , ब्रूट-फोर्सिंग को रोक दिया गया है

यह , इसलिए कम से कम बाइट्स जीत के साथ सबमिशन!


क्या आउटपुट 10सही है? ऐसा लगता है कि इसे 10 से कम होना चाहिए!, क्योंकि यह दोहराव अंक शुरू होता है।
भूतकाल

@Geobits पहले 10अंक हैं 0, 1, 2, 3, 4, 5, 6, 7, 8, 9। दस अलग-अलग अंक, इसलिए परिणाम 10 है!
अदनान

ठीक है। मुझे लगता है कि 0मामला मेरी गिनती बंद कर रहा था (बेवकूफ खाली तार)।
22

1
अब उस बारे में चिंता करने की जरूरत नहीं है। जब मैं टिप्पणी पोस्ट करता था, तो लूपहोल प्रस्ताव +4 पर था । यह अभी +9 पर है ।
डेनिस

1
इस पहेली के बारे में एक दिलचस्प गणित का सवाल है: N के सापेक्ष F (N) का मान क्या है !? N के कई मान हैं जिनके लिए F (N) / F (N-1) <N है, लेकिन यह आमतौर पर थोड़ा अधिक है। मुझे पूरा यकीन है कि F(N)ऐसा नहीं है O(N!)और यह log F(N)है, O(log N!)लेकिन वे सिर्फ hunches हैं ...
rici

जवाबों:


5

जेली, 17 15 बाइट्स

R’DFµ=€QS;@L!:/

इसे ऑनलाइन आज़माएं! या एक ही बार में सभी परीक्षण मामलों को सत्यापित करें

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

R’DFµ=€QS;@L!:/    Main link. Input: n

R                  Yield [1, ..., n] for n > 0 or [0] for n = 0.
 ’                 Decrement. Yields [0, ..., n - 1] or [-1].
  D                Convert each integer into the list of its decimal digits.
   F               Flatten the resulting list of lists.
    µ              Begin a new, monadic chain. Argument: A (list of digits)
       Q           Obtain the unique elements of A.
     =€            Compare each element of A with the result of Q.
                   For example, 1,2,1 =€ Q -> 1,2,1 =€ 1,2
                                           -> [[1, 0], [0, 1], [1, 0]]
        S          Sum across columns.
                   This yields the occurrences of each unique digit.
         ;@L       Prepend the length of A.
            !      Apply factorial to each.
             :/    Reduce by divison.
                   This divides the first factorial by all remaining ones.

क्या यह वास्तव में जेली है? मैं कई ASCII पात्रों को देखता हूं :-P
लुइस मेंडो

3
वे हमेशा किसी भी तरह से चुपके का प्रबंधन करते हैं ...
डेनिस

10

ईएस 6, 118 81 78 बाइट्स

n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r

किसी ने मुझे यह बताने के लिए बाध्य किया कि संख्याओं को बढ़ाने का एक छोटा तरीका है n

@ Edc65 के विचार को ले कर और स्टेरॉयड पर चलाकर एक शांत 37 बाइट्स को बचाया। (इसके बजाय '|' का उपयोग करके एक अतिरिक्त बाइट सहेजें)&& लेकिन यह परिणाम 31 बिट तक सीमित करता है।)

संपादित करें: सहेजे गए 3 और बाइट्स फिर से @ edc65 के लिए धन्यवाद।


अंकों के संक्षिप्तिकरण को छोटा करने का कोई तरीका नहीं मिला। लेकिन बाकी सभी कम हो सकते हैं
edc65

2 बाइट्स बचाएं reduce:n=>[...[...Array(n).keys()].join``].reduce((r,c,i)=>r*++i/(o[c]=-~o[c]),1,o=[])
user81655

1
वाह! लेकिन 78 बेहतर है:n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r
edc65

1
@ edc65 r/=(...)/i++की तुलना में अधिक सटीक है r*=i++/(...)? मैंने अब तक जो सबसे आकर्षक गोल्फ देखा है!
नील

2
मुझे एक पल के लिए रुकना पड़ा, क्योंकि मुझे लगा कि आपके पास वहाँ एक रेगीक्स है।
मामा फन रोल

7

APL (Dyalog Extended) , 13 बाइट्स

×/2!/+\⎕D⍧⍕⍳⎕

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

एक पूरा कार्यक्रम। उपयोग करता है ⎕IO←0

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

×/2!/+\⎕D⍧⍕⍳⎕
               Take input from stdin (N)
               Generate range 0..N-1
               Stringify the entire array (S)
                (The result has spaces between items)
       D       The character array '0123456789'
               Count occurrences of each digit in S
×/2!/+\         Calculate multinomial:
     +\           Cumulative sum
  2!/             Binomial of consecutive pairs
×/                Product

बहुराष्ट्रीय गणना निम्नलिखित तथ्य से आती है:

(1+2++n)!1!2!n!=(1+2)!1!2!×(1+2++n)!(1+2)!3!n!

=(1+2)!1!2!×(1+2+3)!(1+2)!3!×(1+2++n)!(1+2+3)!n!

==(1+21)(1+2+31+2)(1++n1++n-1)


1
और यही कारण है कि प्रोग्रामर को गणित सीखना चाहिए।
बेनामी

@ अज्ञात ... और गणितीय रूप से इच्छुक प्रोग्रामिंग भाषा का उपयोग करें।
23

5

MATL , 21 बाइट्स

:qV0h!4Y2=sts:pw"@:p/

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

व्याख्या

:q     % implicitly input N, and generate vector [0, 1, ..., N-1]
V      % convert to string representation of numbers. Contains spaces,
       % but no matter. Only characters '0', ..., '9' will be counted
0h     % append 0 character (not '0'), so that string is never empty
!      % convert string to column char array
4Y2    % string '0123456789' (row char array)
=      % test all pairs for equality
s      % sum each column. For N = 12 this gives [2, 4, 1, 1, ..., 1]
t      % duplicate
s      % compute sum. For N = 12 this gives 14
:p     % factorial
w      % swap. Now vector [2, 4, 1, 1, ..., 1] is on top
"      % for each number in that vector
  @:p  %   factorial
  /    %   divide
       % implicitly end loop
       % implicitly display

@ अदनान हल। और कम बाइट्स के साथ :-)
लुइस मेंडो

बहुत अच्छा लग रहा है! :)
अदनान

@ अदनान धन्यवाद! मैंने एक स्पष्टीकरण जोड़ा है
लुइस मेंडो

5

पायथन 2, 142 137 101 97 बाइट्स

(सुझाव के बारे में @ सादर धन्यवाद input)

( सी संस्करण से वृद्धिशील गणना लागू )

f=1;v=10*[0]
for i in range(input()):
 for h in str(i):k=int(h);v[k]+=1;f=f*sum(v)/v[k]
print f

वास्तविक का उपयोग कर मूल संस्करण

import math
F=math.factorial
v=10*[0]
for i in range(input()):
 for h in str(i):v[int(h)]+=1
print reduce(lambda a,x:a/F(x),v,F(sum(v)))

वास्तव में, ऊपर का एकमात्र गोल्फिंग math.factorial Fकुछ स्थानों को बुला रहा है और बाहर निकल रहा है, इसलिए संभवतया एक छोटा अजगर समाधान है।

यदि स्पष्टीकरण की आवश्यकता है, तो vप्रत्येक अंक की आवृत्ति की एक गिनती बनाए रखता है; संकेतित सीमा में प्रत्येक संख्या में प्रत्येक अंक के लिए गिनती अपडेट की जाती है।

मूल संस्करण में, हम मानक सूत्र का उपयोग कर क्रमपरिवर्तन की संख्या (Σf गणना मैं )! / Π (च मैं !)। वर्तमान संस्करण के लिए, यह गणना वृद्धि को गुणा करके और अंकों को विभाजित करते हुए की जाती है जैसा कि हम अंकों को देखते हैं। यह स्पष्ट नहीं हो सकता है कि पूर्णांक विभाजन हमेशा सटीक होगा, लेकिन अवलोकन के आधार पर यह साबित करना आसान है कि प्रत्येक विभाजन को लगातार पूर्णांकों के गुणकों का kपालन ​​करना चाहिए k, इसलिए उन गुणाओं में से एक को विभाज्य होना चाहिएk । (यह एक अंतर्ज्ञान है, एक सबूत नहीं है।)

मूल संस्करण बड़े तर्कों के लिए तेज़ है, क्योंकि यह केवल 10 बिग्नम विभाजित करता है। हालाँकि, एक छोटे से पूर्णांक द्वारा एक बिग्नम को विभाजित करना एक बिग्नम द्वारा एक बिग्नम को विभाजित करने की तुलना में तेज है, जब आपके पास हजारों बिग्नम होते हैं, तो यह थोड़ा सुस्त हो जाता है।


f = f * sum (v) / v [k] -> f * = sum (v) / v [k] एक बाइट बचाता है
Mikko Virkkilä

@ सुपरफ़्लक्स: लेकिन यह समान अर्थ नहीं है।
रिची

5

पायथन 2, 197 बाइट्स (संपादित करें: सहेजे गए 4 बाइट्स, धन्यवाद थॉमस क्वा!)

import math
l,g,f,p,r,s=[],[],math.factorial,1,range,str
for x in r(int(input())):l.append(s(x))
l="".join(l)
for y in r(10):b=s(l).count(s(y));g.append(f(b));
for c in g:p*=y
print f(int(len(l)))/p

Ungolfed:

import math

l=[] #list of the numbers from 0 to n
exchange_list=[] #numbers that can be exchanged with each other, ie      repeats

multiplied = 1 #for multiplying the digits by each other
n = int(input())

for x in range(n): #put all the numbers from 0-n into the list
    l.append(str(x))

l = "".join(l) #put all the digits in a string to remove repeats

for x in range(10): #look at all the digits and check how many are in the     list/string
    count = str(l).count(str(x))
    if count > 1: #if there is more than 1 of the digit, put the factorial of the amount of - 
        exchange_list.append(math.factorial(count)) # - appearances into the exchange list.

for x in exchange_list: #multiply all the values in the list by each other
    multiplied*=x

print math.factorial(int(len(l)))/multiplied #print the factorial of the  length of the string 
#divided by the exchanges multiplied

1
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! इस उत्तर को वीएलक्यू (बहुत कम गुणवत्ता) के रूप में चिह्नित किया गया था, मुझे संदेह है क्योंकि इसमें कोई स्पष्टीकरण या अधूरा संस्करण नहीं है, जो यहां आदर्श हैं। अपने उत्तर कार्यों को मानते हुए, और आप इसे "केवल कोड" होने से सुधारते हैं, यह काफी अच्छा लगता है!
बिल्ली

range(0,10)हो सकता है range(10)
3

4

CJam, 21 19 बाइट्स

ri,s_,A,s@fe=+:m!:/

इसका परीक्षण यहां करें।

व्याख्या

ri   e# Read input and convert to integer N.
,    e# Get a range [0 1 ... N-1].
s    e# Convert to string, flattening the range.
_,   e# Duplicate and get its length.
A,s  e# Push "012345789".
@fe= e# Pull up the other copy of the string and count the occurrences of each digit.
+    e# Prepend the string length.
:m!  e# Compute the factorial of each of them.
:/   e# Fold division over the list, dividing the factorial of the length by all the other
     e# factorials.

3

जावास्क्रिप्ट (ईएस 6), 100

n=>(f=[...[...Array(n).keys()].join``].map(c=>(k[c]=~-k[c],p*=i++),i=p=1,k=[]),k.map(v=>p/=f[~v]),p)

परीक्षा

F=n=>(f=[...[...Array(n).keys()].join``].map(c=>(k[c]=~-k[c],p*=i++),i=p=1,k=[]),k.map((v,i)=>p/=f[~v]),p)

// Less golfed
U=n=>( // STEP 1, count digits, compute factorials
      f= // will contain the value of factorials 1 to len of digits string
      [...[...Array(n).keys()].join``] // array of cancatenated digits
      .map(c=> // execute the following for each digit
           (
            k[c]=~-k[c], // put in k[c] the repeat count for digit c, negated 
            p*=i++       // evaluate factorial, will be stored in f
           ),i=p=1,k=[]),// initialisations
       // at the end of step 1 we have all factorials if f and max factorial in p
       // STEP 2, divide the result taking into account the repeated digits
      k.map(v=>p/=f[~v]), // for each digit, divide p by the right factorial (~v === -v-1)
  p // return result in p
) 

// Test
console.log=x=>O.textContent+=x+'\n'

for(j=0;j<=15;j++) console.log(j+' '+F(j))
<pre id=O></pre>


का k[c]=~-k[c]पर्यायवाची नहीं है --k[c]?
usandfriends

1
@usandfriends नहीं, जब k [c] अपरिभाषित है
edc65

ऊह, फैक्टरियों की अच्छी सरणी।
नील

... हालाँकि आपको इसकी आवश्यकता नहीं है। मेरा नवीनतम अद्यतन देखें।
नील

3

पायथ, 18 बाइट्स

/F.!M+lJ.njRTQ/LJT

इसे ऑनलाइन आज़माएँ: प्रदर्शन

/F.!M+lJ.njRTQ/LJT   implicit: Q = input number
          jRTQ       convert each number in [0, ..., Q-1] to their digits
        .n           flatten to a single list
       J             store this list in J
              /LJT   for each digit count the number of appearances in J
     +lJ             prepend the length of J
  .!M                compute the factorial for each number
/F                   fold by division

3

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

import Data.List
h n|l<-sort$show=<<[0..n-1]=foldl1 div$product.map fst.zip[1..]<$>l:group l

प्रयोग उदाहरण: h 12-> 1816214400

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

l<-sort$show=<<[0..n-1]       -- bind l to the sorted concatenated string
                              -- representations of the numbers from 0 to n-1
                              -- e.g. n=12 -> "00111123456789"

               l: group l     -- group the chars in l and put l itself in front
                              -- e.g. ["00111123456789","00","1111","2",..."9"]
            <$>               -- map over this list
    product.map fst.zip[1..]  -- the faculty the length of the sublist (see below)  
                              -- e.g. [87178291200,2,24,1,1,1,..,1]
foldl1 div                    -- fold integer division from the left into this list
                              -- e.g. 87178291200 / 2 / 24 / 1

                              -- Faculty of the length of a list:
                  zip[1..]    -- make pairs with the natural numbers
                              -- e.g. "1111" -> [(1,'1'),(2,'1'),(3,'1'),(4,'1')]
          map fst             -- drop 2nd element form the pairs
                              -- e.g. [1,2,3,4]
  product                     -- calculate product of the list

3

सी, 236 174 138 121 बाइट्स

बाइट्स की भारी कमी के लिए रिसी को बहुत श्रेय दिया जाता है।

long long d,f=1;j,s=1,n,b[10]={1};main(d){for(scanf("%d",&n);n--;)for(j=n;j;j/=10,f*=++s)d*=++b[j%10];printf("%Ld",f/d);}

Ungolfed

long long d,f=1;
j,s=1,n,b[10]={1};

main(d)
{
    scanf("%d",&n); /* get input */
    for(;n--;) /* iterate through numbers... */
        for(j=n;j;j/=10,f*=++s) /* iterate through digits, sum up and factorial */
            d*=++b[j%10]; /* count and factorial duplicates */
    printf("%Ld",f/d); /* print out result */
}

इसे यहाँ आज़माएँ ।


1
आप -lm के आसपास चक्कर न लगाकर 43 पात्रों को बचा सकते हैं। जैसे ही आप उन्हें #define L long long L d;i,j,k,m,n,s=1,b[10]={1};L f(n){return n?n*f(n-1):1;}main(d){for(scanf("%d",&n);i<n;)for(j=i++;j;j/=10)++b[j%10],++s;for(;m<10;)d*=f(b[m++]);printf("%Ld",f(s)/d);}
ढूंढते हैं

आप उन्हें उस लूप में भी गिन सकते हैं जहां आप d की गणना करते हैं: for(;m<10;)s+=b[m],d*=f(b[m++])लेकिन मुझे लगता है कि यह कुछ और बाइट्स है।
रिसी

ये तो बहुत खूब है। मैं अपने वर्तमान गोल्फ प्रयासों के साथ गठबंधन करूँगा और संपादित करूँगा।
कोल कैमरून

अच्छा: यह देखने के लिए मेरा खयाल रखें कि मूल लूप में फैक्टरियल कम्प्यूटेशन को कैसे एकीकृत किया जाए, जिसमें थोड़ी बड़ी रेंज पर काम करने का फायदा हो अगर आपके पास मनमाना-सटीक अंकगणित न हो। मुझे लगता है कि दाढ़ी बनाने के लिए एक और 20 बाइट्स हैं।
रिची

3

सी / बीसी, २३३ १२१ ११२ बाइट्स (३ बाइट पेनल्टी के लिए |bc)

  1. कोल कैमरन से प्रेरित होकर हैकी चरित्र हेरफेर को हटा दिया और तर्क मूल्य पर सिर्फ अंकगणित किया।

  2. Arg वेक्टर का उपयोग करने से स्कैन करने के लिए परिवर्तित।

    C[10]={1},n=1,k,t;main(){for(scanf("%d",&k);k--;)for(t=k;t;t/=10)printf("%d/%d*",++n,++C[t%10]);puts("1");}
    

ज़रूरत bcवास्तव में मनमानी परिशुद्धता गणना करने की है।

अधूरा और चेतावनी मुक्त:

#include <stdio.h>
int main() {
  int C[10]={1},n=1,k,t;    /* 0 is special-cased */
  for(scanf("%d",&k);k--;)  /* For each integer less than k */
    for(int t=k;t;t/=10)    /* For each digit in t */
      printf("%d/%d*",++n,++C[t%10]);  /* Incremental choice computation */
  puts("1");                /* Finish the expression */
}

इलस्ट्रेटेड (जो मुझे विश्वास है कि एल्गोरिथ्म दिखाता है):

$ for i in {0..15} 100 ; do printf %4d\  $i;./cg70892g<<<$i;done
   0 1
   1 1
   2 2/1*1
   3 2/1*3/1*1
   4 2/1*3/1*4/1*1
   5 2/1*3/1*4/1*5/1*1
   6 2/1*3/1*4/1*5/1*6/1*1
   7 2/1*3/1*4/1*5/1*6/1*7/1*1
   8 2/1*3/1*4/1*5/1*6/1*7/1*8/1*1
   9 2/1*3/1*4/1*5/1*6/1*7/1*8/1*9/1*1
  10 2/1*3/1*4/1*5/1*6/1*7/1*8/1*9/1*10/1*1
  11 2/1*3/2*4/1*5/1*6/1*7/1*8/1*9/1*10/1*11/1*12/2*1
  12 2/1*3/2*4/3*5/2*6/1*7/1*8/1*9/1*10/1*11/1*12/1*13/1*14/4*1
  13 2/1*3/1*4/2*5/3*6/4*7/2*8/1*9/1*10/1*11/1*12/1*13/1*14/1*15/2*16/5*1
  14 2/1*3/1*4/2*5/1*6/3*7/4*8/5*9/2*10/1*11/1*12/1*13/1*14/1*15/1*16/2*17/2*18/6*1
  15 2/1*3/1*4/2*5/1*6/3*7/1*8/4*9/5*10/6*11/2*12/1*13/1*14/1*15/1*16/1*17/2*18/2*19/2*20/7*1
 100 2/1*3/2*4/3*5/1*6/4*7/1*8/5*9/1*10/6*11/1*12/7*13/1*14/8*15/1*16/9*17/1*18/10*19/1*20/11*21/2*22/2*23/12*24/3*25/4*26/5*27/2*28/6*29/2*30/7*31/2*32/8*33/2*34/9*35/2*36/10*37/2*38/11*39/2*40/12*41/3*42/3*43/13*44/4*45/13*46/5*47/6*48/7*49/3*50/8*51/3*52/9*53/3*54/10*55/3*56/11*57/3*58/12*59/3*60/13*61/4*62/4*63/14*64/5*65/14*66/6*67/14*68/7*69/8*70/9*71/4*72/10*73/4*74/11*75/4*76/12*77/4*78/13*79/4*80/14*81/5*82/5*83/15*84/6*85/15*86/7*87/15*88/8*89/15*90/9*91/10*92/11*93/5*94/12*95/5*96/13*97/5*98/14*99/5*100/15*101/6*102/6*103/16*104/7*105/16*106/8*107/16*108/9*109/16*110/10*111/16*112/11*113/12*114/13*115/6*116/14*117/6*118/15*119/6*120/16*121/7*122/7*123/17*124/8*125/17*126/9*127/17*128/10*129/17*130/11*131/17*132/12*133/17*134/13*135/14*136/15*137/7*138/16*139/7*140/17*141/8*142/8*143/18*144/9*145/18*146/10*147/18*148/11*149/18*150/12*151/18*152/13*153/18*154/14*155/18*156/15*157/16*158/17*159/8*160/18*161/9*162/9*163/19*164/10*165/19*166/11*167/19*168/12*169/19*170/13*171/19*172/14*173/19*174/15*175/19*176/16*177/19*178/17*179/18*180/19*181/10*182/20*183/20*184/20*185/20*186/20*187/20*188/20*189/20*190/20*1

और, बीसी के माध्यम से पाइप के साथ (और एफ की गणना जोड़कर (1000):

$ time for i in {0..15} 100 1000; do printf "%4d " $i;./cg70892g<<<$i|bc;done
   0 1
   1 1
   2 2
   3 6
   4 24
   5 120
   6 720
   7 5040
   8 40320
   9 362880
  10 3628800
  11 119750400
  12 1816214400
  13 43589145600
  14 1111523212800
  15 30169915776000
 100 89331628085599251432057142025907698637261121628839475101631496666431\
15835656928284205265561741805657733401084399630568002336920697364324\
98970890135552420133438596044287494400000000
1000 45200893173828954313462564749564394748293201305047605660842814405721\
30092686078003307269244907986874394907789568742409099103180981532605\
76231293886961761709984429587680151617686667512237878219659252822955\
55855915137324368886659115209005785474446635212359968384367827713791\
69355041534558858979596889046036904489098979549000982849236697235269\
84664448178907805505235469406005706911668121136625035542732996808166\
71752374116504390483133390439301402722573240794966940354106575288336\
39766175522867371509169655132556575711715087379432371430586196966835\
43089966265752333684689143889508566769950374797319794056104571082582\
53644590587856607528082987941397113655371589938050447115717559753757\
79446152023767716192400610266474748572681254153493484293955143895453\
81280908664541776100187003079567924365036116757255349569574010994259\
42252682660514007543791061446917037576087844330206560326832409035999\
90672829766080114799705907407587600120545365651997858351981479835689\
62520355320273524791310387643586826781881487448984068291616884371091\
27306575532308329716263827084514072165421099632713760304738427510918\
71188533274405854336233290053390700237606793599783757546507331350892\
88552594944038125624374807070741486495868374775574664206439929587630\
93667017165594552704187212379733964347029984154761167646334095514093\
41014074159155080290000223139198934433986437329522583470244030479680\
80866686589020270883335109556978058400711868633837851169536982150682\
22082858700246313728903459417761162785473029666917398283159071647546\
25844593629926674983035063831472139097788160483618679674924756797415\
01543820568689780263752397467403353950193326283322603869951030951143\
12095550653333416019778941123095611302340896001090093514839997456409\
66516109033654275890898159131736630979339211437991724524614375616264\
98121300206207564613016310794402755159986115141240217861695468584757\
07607748055900145922743960221362021598547253896628914921068009536934\
53398462709898222067305585598129104976359039062330308062337203828230\
98091897165418693363718603034176658552809115848560316073473467386230\
73804128409097707239681863089355678037027073808304307450440838875460\
15170489461680451649825579772944318869172793737462142676823872348291\
29912605105826175323042543434860948610529385778083808434502476018689\
05150440954486767102167489188484011917026321182516566110873814183716\
30563399848922002627453188732598763510259863554716922484424965400444\
85477201353937599094224594031100637903407963255597853004241634993708\
88946719656130076918366596377038503741692563720593324564994191848547\
42253991635763101712362557282161765775758580627861922528934708371322\
38741942406807912441719473787691540334781785897367428903185049347013\
44010772740694376407991152539070804262207515449370191345071234566501\
33117923283207435702471401696679650483057129117719401161591349048379\
16542686360084412816741479754504459158308795445295721744444794851033\
08800000000

real    0m0.246s
user    0m0.213s
sys     0m0.055s

यह गणना एफ (5000) - एक 18,592 अंकों की संख्या - 10 सेकंड से कम में।

$ time ./cg70892g3<<<5000|BC_LINE_LENGTH=0 bc|wc -c
18593

real    0m9.274s
user    0m9.273s
sys     0m0.005s

3

पर्ल 6, 117 बाइट्स

say $_ <2??1!!permutations(+[(my@n=^$_ .join.comb)]).elems÷[*] ([*] 2..$_ for @n.classify(&unique).values)for lines

और अधिक पठनीय fasion में

for (lines) -> $number {
    say 1 and next if $number < 2;
    my @digits = (^$number).join.comb;
    my @duplicates = @digits.classify(&unique).values;
    my $unique_permutations = permutations(+@digits).elems ÷ [*] ([*] 2..$_ for @duplicates);
    say $unique_permutations;
}

3

पर्ल 5, 108 बाइट्स

sub f{eval join"*",@_,1}push@a,/./g for 0..<>-1;for$i(0..9){$b[$i]=grep/$i/,@a}say f(1..@a)/f map{f 1..$_}@b

मुझे 17 बाइट्स बचाने के लिए, और तथ्यात्मक विचार के लिए जेपीवाई के लिए देव-नल के लिए बहुत धन्यवाद ।


3

05AB1E , 13 12 11 बाइट्स

ÝD¨SāPr¢!P÷

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

Ý             # range [0..input]
 D            # duplicate
  ¨           # drop the last element
   S          # split into digits
    ā         # length range: [1..number of digits]
     P        # product (effectively a factorial)
      r       # reverse the stack
       ¢      # count occurences of each number in the list of digits
        !     # factorial of each count
         P    # product of those
          ÷   # divide the initial factorial by this product

3

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

import math
i,b,F="".join(map(str,range(input()))),1,math.factorial
for x in range(10):b*=F(i.count(`x`))
print F(len(i))/b

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

  1. रूपांतरित करें rangeइनपुट का एकल स्ट्रिंग में
  2. जाँच करें कि 0 से 9 तक की संख्या कितनी बार स्ट्रिंग में दिखाई देती है और प्रत्येक के लिए भाज्य प्राप्त करें फिर उन्हें एक साथ गुणा करें
  3. चरण 2 में गणना की गई संख्या द्वारा स्ट्रिंग की लंबाई के भाज्य को विभाजित करें

2

पॉवरशेल, 125 बाइट्स

(1..(($b=0..($args[0]-1)-join'').Length)-join'*'|iex)/((0..9|%{$c=[regex]::Matches($b,$_).count;1..($c,1)[!$c]})-join'*'|iex)

इनपुट लेता है $args[0], घटाता है 1, 0..उस संख्या से पूर्णांक की एक सीमा बनाता है , -joinजो एक साथ एक स्ट्रिंग में है, और इसे इस रूप में बचाता है $b। हम .Lengthउस स्ट्रिंग को लेते हैं , 1..उस लंबाई से एक और सीमा बनाते हैं , -joinउन पूर्णांकों को एक साथ जोड़ते हैं *, फिर उस पाइप को Invoke-Expression(इसी तरह)eval )। दूसरे शब्दों में, हमने इनपुट के आधार पर संख्या अनुक्रम की लंबाई के भाज्य का निर्माण किया है। वह हमारा अंश है।

हम इसे विभाजित करते हैं /...

हमारे भाजक, जो एक सीमा लेने 0..9और एक लूप के माध्यम से भेजने के द्वारा निर्मित है |%{...}। प्रत्येक पुनरावृत्ति, हम .NET के लिए धन्यवाद के भीतर $cवर्तमान अंक $_प्रकट होने की संख्या के बराबर एक सहायक चर सेट $bकरते हैं[regex]::matches कॉल के साथ मिलकर .countविशेषता। हम तब 1..तक उस मान तक एक नई सीमा बनाते हैं, जब तक कि यह गैर-शून्य न हो। हां, कई उदाहरणों में, इसके परिणामस्वरूप एक सीमा होगी1..1 , जो कि सिर्फ मूल्यांकन करता है 1। हम उन सभी को और -joinउन्हें एक साथ लेते हैं *, फिर उस पाइप को Invoke-Expressionफिर से। दूसरे शब्दों में, हमने प्रत्येक अंक की घटनाओं की संख्या के भाज्य का निर्माण किया है।


एनबी

तक इनपुट संभालता है 90मुद्दे के बिना और एक सेकंड से भी कम समय में ।

PS C:\Tools\Scripts\golfing> .\rearranging-the-sequence.ps1 90
1.14947348910454E+159

PS C:\Tools\Scripts\golfing> Measure-Command {.\rearranging-the-sequence.ps1 90} | FL TotalMilliseconds
TotalMilliseconds : 282.587

... उस परिणाम से परे Infinityआउटपुट के रूप में, पारगम्य स्ट्रिंग परिणाम की लंबाई 170!जिसमें फिट बैठता हैdouble डेटाटाइप ( 7.25741561530799E+306) , लेकिन 171!नहीं। PowerShell में एक ... quirk ... है जो स्वचालित रूप से अप-कास्ट करता है[int] करने के लिए [double]अतिप्रवाह के मामले में (बशर्ते आप स्पष्ट रूप से चर के साथ शुरू करने के लिए डाली नहीं था)। नहीं, मुझे नहीं पता कि यह क्यों नहीं जाता है[long] पूर्णांक मानों के लिए ।

अगर हमने कुछ स्पष्ट कास्टिंग और हेरफेर किया (उदाहरण के लिए, उपयोग करना) [uint64] 64-बिट पूर्णांक के लिए ), तो हम उस उच्चतर को प्राप्त कर सकते हैं, लेकिन यह कोड को काफी हद तक ब्लोट करेगा क्योंकि हमें सशर्त के साथ 170-लंबाई तक की सीमा की आवश्यकता होगी और फिर पुन: व्यवस्थित करना होगा। वहां से प्रत्येक गुणा। चूंकि चुनौती एक ऊपरी सीमा को निर्दिष्ट नहीं करती है, इसलिए मैं इसे पर्याप्त मान रहा हूं।


2

Perl6

perl6 -e 'sub p ($a) { my $x = $a.join.comb.classify(+*).values.map(*.elems).classify(+*).values.flatmap(*.list).flatmap((2..+*).list); my $y = 2..$a[*-1]; [/] $x.list * [*] $y.list }; p([1..11]).say'

इस समय अपढ़ नहीं - अब नींद की जरूरत है।


2

ग्रूवी, 156 बाइट्स

def f(n){def s=(0..n-1).join('')
0==n?1:g(s.size())/s.inject([:]){a,i->a[i]=a[i]?a[i]+1:1;a}*.value.inject(1){a,i->a*g(i)}}
BigInteger g(n){n<=1?1:n*g(n-1)}

मेरा विनम्र पहला कोड गोल्फ समाधान। आप इसे यहाँ परीक्षण कर सकते हैं।

और यहाँ एक और अधिक पठनीय संस्करण है:

def f(n) {
  def s = (0..n - 1).join('')                       // Store our concatented range, s
  0 == n ? 1 :                                      // Handle annoying case where n = 0
    fact(s.size()) / s.inject([:]) {                // Divide s.size()! by the product of the values we calculate by...
      a, i ->                                       // ...reducing into a map...
        a[i] = a[i] ? a[i] + 1 : 1                  // ...the frequency of each digit
        a                                           // Our Groovy return statement
    }*.value.inject(1) { a, i -> a * fact(i) }      // Finally, take the product of the factorial of each frequency value
}

BigInteger fact(n) { n <= 1 ? 1 : n * fact(n - 1) } // No built-in factorial function...

बिल्कुल सीधा, लेकिन मेरे लिए एक जोड़ी पर प्रकाश डाला गया:

  • एक इंजेक्शन प्रदर्शन / एक सरणी से कम करने के charsलिए Map<Character, Integer>। मानचित्र मानों के लिए डिफ़ॉल्ट मान की कमी से यह अभी भी थोड़ा जटिल था। यह संदेह संभव है, लेकिन अगर मानचित्र सभी मानों को 0 में डिफ़ॉल्ट कर देता है, तो मैं टर्नरी से बच सकता हूं जो एनपीई से बचने के लिए आवश्यक है।

  • ग्रूवी फैल ऑपरेटर (उदाहरण के लिए }*.value) हमेशा उपयोग करने में मजेदार होता है

कष्टप्रद विशेषता पर, हालांकि, रिटर्न प्रकार के साथ फैक्टोरियल फ़ंक्शन को घोषित करने की आवश्यकता थी BigInteger। मैं इस धारणा के तहत था कि ग्रूवी ने सभी संख्यात्मक तत्वों को लपेटा है BigIntegerया नहीं BigDecimal, लेकिन यह मामला नहीं हो सकता है जब यह प्रकार वापस करने के लिए आता है। मुझे और प्रयोग करना पड़ेगा। इस रिटर्न प्रकार के बिना स्पष्ट रूप से कहा गया है, हमें गलत फैक्टरियल मान बहुत जल्दी मिलते हैं।


2

जे, 33 बाइट्स

(#(%*/)&:!&x:#/.~)@([:;<@":"0)@i.

सीमा को अंकों के एक स्ट्रिंग में परिवर्तित करता है, प्रत्येक अंकों को गिनता है, और परिणाम की गणना करने के लिए बहुराष्ट्रीय गुणांक लागू करता है।

प्रयोग

   f =: (#(%*/)&:!&x:#/.~)@([:;<@":"0)@i.
   (,.f"0) i. 16
 0              1
 1              1
 2              2
 3              6
 4             24
 5            120
 6            720
 7           5040
 8          40320
 9         362880
10        3628800
11      119750400
12     1816214400
13    43589145600
14  1111523212800
15 30169915776000

2

आर, 118 बाइट्स

पार्टी के बारे में 8 महीने की देरी से, लेकिन मुझे लगा कि मैं इसे छोड़ दूंगा क्योंकि यह एक दिलचस्प चुनौती थी।

function(n,x=as.numeric(el(strsplit(paste(1:n-1,collapse=""),""))),F=factorial)`if`(n,F(sum(1|x))/prod(F(table(x))),1)

आर-फिडल पर इसे आज़माएं

व्याख्या की

  1. वेक्टर उत्पन्न करें 0 ... n-1 और इसे एक स्ट्रिंग में संक्षिप्त करें:paste(1:n-1,collapse="")
  2. स्ट्रिंग को अपने अंकों में विभाजित करें और संख्यात्मक में बदलें (स्टोर के रूप में x ):x=as.numeric(el(strsplit(...,"")))
  3. अंश की गणना करने के लिए हम बस करते हैं factorial(sum(1|x)) जो वह है#digits!
  4. हर की गणना करने के लिए हम tableएक आकस्मिक तालिका के निर्माण का उपयोग करते हैं जो आवृत्तियों को सूचीबद्ध करती है। एफ (12) के मामले में उत्पन्न तालिका है:

    0 1 2 3 4 5 6 7 8 9 
    2 4 1 1 1 1 1 1 1 1 
    
  5. इसका मतलब है कि हम factorial()गिनती पर उपयोग कर सकते हैं (जिस तरह से सदिश है) और बस उत्पाद लेते हैं:prod(factorial(table(x)))

नोट: चरण ४ और ५ को केवल उसी माध्यम से किया जाता है यदि n>0अन्यथा वापस लौटते हैं 1


1

गणितज्ञ, 65 बाइट्स

(Tr@IntegerLength[a=Range@#-1]+1)!/Times@@(Total[DigitCount@a]!)&

शायद आगे गोल्फ हो सकता है।



1

स्टैक्स , 12 बाइट्स

éÄ\↑≈g→FP○░→

भागो और इसे staxlang.xyz पर डीबग करें!

अनपैक्ड (14 बाइट्स) और स्पष्टीकरण:

r$c%|Fso:GF|F/
r                 Range [0..input)
 $                Stringify each and concat
  c               Copy atop the stack
   %|F            Factorial of length
      s           Swap original back to top
       o          Sort
        :G        Run lengths
          F       For each:
           |F       Factorial
             /      Divide running quotient by this factorial
                  Implicit print

1

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

गोल्फ डेनिस '15 बाइट जेली जवाब ...

ḶDFµW;ĠẈ!:/

एक गैर-ऋणात्मक पूर्णांक को स्वीकार करने वाला एक मोनडिक लिंक जो एक सकारात्मक पूर्णांक देता है।

इसे ऑनलाइन आज़माएं! या टेस्ट सूट देखें।

कैसे?

ḶDFµW;ĠẈ!:/ - Link: non-negative integer, N   e.g. 12
Ḷ           - lowered range            [0,1,2,3,4,5,6,7,8,9,10,11]
 D          - to decimal (vectorises)  [[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[1,0],[1,1]]
  F         - flatten                  [0,1,2,3,4,5,6,7,8,9,1,0,1,1]
   µ        - start a new monadic chain - i.e. f(that)
    W       - wrap in a list           [[0,1,2,3,4,5,6,7,8,9,1,0,1,1]]
      Ġ     - group indices by values  [[1,12],[2,11,13,14],3,4,5,6,7,8,9,10]
     ;      - concatenate              [[0,1,2,3,4,5,6,7,8,9,1,0,1,1],[1,12],[2,11,13,14],3,4,5,6,7,8,9,10]
       Ẉ    - length of each           [14,2,4,1,1,1,1,1,1,1,1]
        !   - factorial (vectorises)   [87178291200,2,24,1,1,1,1,1,1,1,1]
          / - reduce by:
         :  -   integer division       1816214400


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