시퀀스 재정렬


23

소개

다음 순서 (음수가 아닌 정수)를 살펴 보겠습니다.

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

예를 들어 처음 숫자를 봅시다 . 이들은입니다 0, 1, 2. 이 순서에 사용 된 숫자는 6 가지 방법 으로 주문할 수 있습니다 .

012   120
021   201
102   210

F (3) = 6 이라고합시다 . 또 다른 예는 F (12) 입니다. 여기에는 숫자가 포함됩니다.

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

또는 연결된 버전 :

01234567891011

이를 재정렬하는 방법을 찾으려면 먼저이 문자열의 길이를 살펴 봐야합니다. 이 문자열의 길이는 14입니다. 우리는 14 를 계산합니다 ! . 그러나 예를 들어 최종 문자열을 방해하지 않고 장소를 교환 할 수 있습니다. 2 개의 0이 있으므로 2가 있습니다! 순서를 방해하지 않고 0 을 바꾸는 방법 . 4 개도 있으므로 4 개가 있습니다 ! 그것들을 전환하는 방법. 총계를이 두 숫자로 나눕니다.

이것은 14입니다! / (4! × 2!) = 1816214400 문자열 정렬 방법 01234567891011. 따라서 F (12) = 1816214400 이라고 결론을 내릴 수 있습니다 .

작업

N이 주어지면 F (N)을 출력하십시오 . 소개가 필요없는 사람들을 위해. F (N)을 계산하기 위해 먼저 첫 번째 N 개의 음이 아닌 정수를 연결하고 (예 : N = 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

@Geobits 첫 번째 10숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9입니다. 다른 10 자리 숫자이므로 결과는 10!입니다.
Adnan

아 맞아 나는 0사건이 내 카운트를 버리고 있다고 생각한다 (멍청한 빈 줄).
Geobits

1
더 이상 걱정할 필요가 없습니다. 의견을 게시했을 때 허점 제안은 +4에 있었습니다 . 지금은 +9 입니다.
Dennis

1
이 퍼즐에 대한 흥미로운 수학 질문이 있습니다 : N에 상대적인 F (N)의 가치는 무엇입니까? F (N) / F (N-1) <N 인 N의 값은 여러 개 있지만 일반적으로 약간 더 큽니다. 나는 확신이있어 F(N)되지 않습니다 O(N!)그것은 log F(N)이다 O(log N!)하지만 사람들은 그냥 직감입니다
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로 볼
루이스 Mendo

3
그들은 항상 어떻게 든 몰래 빠져
Dennis

10

ES6, 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 비트로 제한됩니다.)

편집 : @ edc65 덕분에 3 바이트를 더 절약했습니다.


숫자 연결을 줄이는 방법을 찾지 못했습니다. 그러나 나머지는 더 짧을 수 있습니다
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++/(...)합니까? 그것은 내가 본 것 중 가장 성가신 골프입니다!
Neil

2
나는 거기에 정규 표현식이 있다고 생각했기 때문에 잠시 멈춰야했습니다.
Mama Fun Roll

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

다항식 계산은 다음 사실에서 비롯됩니다.

(a1+a2++an)!a1!a2!an!=(a1+a2)!a1!a2!×(a1+a2++an)!(a1+a2)!a3!an!

=(a1+a2)!a1!a2!×(a1+a2+a3)!(a1+a2)!a3!×(a1+a2++an)!(a1+a2+a3)!an!

==(a1+a2a1)(a1+a2+a3a1+a2)(a1++ana1++an1)


1
그리고 이것이 프로그래머가 수학을 배워야하는 이유입니다.
익명 :

@Anonymous… 수학적으로 기울어 진 프로그래밍 언어를 사용하십시오.
Adám

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

@Adnan는 해결했다. 그리고 더 적은 바이트 :-)
Luis Mendo 02:19에

아주 좋아 보인다! :)
Adnan

@Adnan 감사합니다! 나는 설명을 추가했다
Luis Mendo

5

파이썬 (2), 142 (137) 101 97 바이트

(에 대한 제안에 대해 @adnan에게 감사드립니다 input)

( C 버전 에서 증분 계산 적용 )

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 i )! / π (f i !)을 사용하여 순열 수를 계산합니다 . 현재 버전의 경우이 계산은 숫자를 볼 때 곱셈과 나눗셈을 나누어 점진적으로 수행됩니다. 정수 나누기가 항상 정확하다는 것은 분명하지 않지만, 각 나눗셈 은 연속 정수의 곱셈을 k따라야 한다는 관찰에 기초하여 쉽게 증명할 수 k있으므로 그 곱 중 하나는로 나눌 수 있어야합니다 k. (증거가 아닌 직관입니다.)

원래 버전은 10 개의 큰 나누기 만 수행하므로 큰 인수에 대해 더 빠릅니다. 큰 숫자를 작은 정수로 나누는 것이 큰 숫자를 큰 숫자로 나누는 것보다 빠르지 만 수천 개의 큰 숫자 나누기가 있으면 조금 느려집니다.


f = f * sum (v) / v [k]-> f * = sum (v) / v [k]는 바이트를 절약합니다.
Mikko Virkkilä

@superflux : 같은 의미가 아닙니다.
rici

5

파이썬 2, 197 바이트 (편집 : Thomas Kwa 덕분에 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

언 골프 드 :

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
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 이 답변은 VLQ (매우 낮은 품질)로 표시되었습니다. 표준이나 설명이없는 버전이 없기 때문에 의심됩니다. 귀하의 답변이 효과가 있다고 가정하고 "코드 전용"으로 개선하면 상당히 좋습니다!
고양이

range(0,10)일 수 있습니다 range(10).
lirtosiast

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

자바 스크립트 (ES6), 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 no, k [c]가 정의되지 않은 경우 --k [c]가 NaN
edc65

아, 계승의 멋진 배열.
Neil

... 필요하지는 않지만. 최신 업데이트를 참조하십시오.
Neil

3

Pyth, 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

C, 236 174 138 121 바이트

바이트를 크게 줄이면 rici에 많은 기여를합니다.

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);}

언 골프

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);}
rici

d를 계산하는 루프에서 계산할 수도 있습니다. for(;m<10;)s+=b[m],d*=f(b[m++])하지만 몇 바이트 더 있다고 생각합니다.
rici

훌륭합니다. 나는 현재의 골프 활동과 결합하여 편집 할 것입니다.
Cole Cameron

좋은 점 : 인자 계산을 원래 루프에 통합하는 방법을 보려면 광산을 살펴보십시오. 임의의 정밀 산술이없는 경우 약간 더 큰 범위에서 작업 할 수 있다는 이점이 있습니다. 나는 그것이 면도해야 할 또 다른 20 바이트라고 생각합니다.
rici

3

C / BC, 233 (121) 112 바이트 (3 바이트 패널티 가정 |bc)

  1. 콜 카메론 (Cole Cameron)에서 영감을 얻어 해키 (Hacky) 문자 조작을 제거하고 인수 값을 산술했습니다.

  2. arg 벡터 사용에서 scanf로 변경되었습니다.

    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

그리고 파이프를 bc를 통해 (그리고 F (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

이것은 F (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 바이트를 절약 해 준 dev-null 과 팩토리얼 아이디어를위한 japhy 에 감사드립니다 .


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

PowerShell, 125 바이트

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

input $args[0]을 빼고 1, 0..그 숫자 에서 정수 범위를 만들고 , -join그 문자열을 문자열로 모아서로 저장합니다 $b. 우리 .Length는 그 문자열을 가져 와서 1..그 길이 에서 다른 범위를 만들고 -join그 정수를와 함께 *파이프 한 다음Invoke-Expression (와 유사하게 eval) . 즉, 입력을 기반으로 숫자 시퀀스 길이의 계승을 구성했습니다. 그것은 우리의 분자입니다.

우리는 그것을 나누어 / ...

우리의 분모는 범위를 취하고 0..9for-loop를 통해 전송 하여 구성됩니다 |%{...}. 각 반복마다 속성 과 결합 된 .NET 호출로 인해 $c현재 숫자 $_가 나타나는 횟수와 같은 도우미 변수를 설정했습니다 . 그런 다음 0이 아닌 한 해당 값까지 새로운 범위를 구성합니다. 예, 많은 경우에 이로 인해 range가 발생 하여 just로 평가됩니다 . 우리는 이것들과 그것들 을 모두 가지고 와서 다시 파이프로 연결 합니다. 다시 말해, 우리는 각 숫자의 발생 횟수에 대한 계승의 곱을 구성했습니다.$b[regex]::matches.count1..1..11-join*Invoke-Expression


NB

90문제없이 입력을 1 초 미만으로 처리합니다.

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에는 오버플 [int][double]가 발생하는 경우 자동으로 업 캐스트됩니다 (시작하기 위해 변수를 명시 적으로 캐스팅하지 않은 경우). 아니요, 왜 가지 않는지 모르겠습니다.[long] 정수 값으로 .

명시 적 캐스팅 및 조작 (예 : [uint64]부호없는 64 비트 정수에 대해 사용 )을 수행하면 더 높은 값을 얻을 수 있지만 조건부에서 최대 170 길이의 범위를 설정 한 다음 다시 캐스팅해야하므로 코드가 크게 팽창합니다 거기에서 각각의 곱셈. 도전 과제가 상위 범위를 지정하지 않기 때문에 이것이 적절하다고 가정합니다.


2

펄 6

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(A)에 Map<Character, Integer>. 맵 값에 대한 기본값이 없기 때문에 여전히 약간 복잡했습니다. 이것은 의심의 여지가 있지만 맵이 모든 값을 0으로 기본 설정하면 NPE를 피하는 데 필요한 삼항을 피할 수 있습니다.

  • Groovy 스프레드 연산자 (예 :) }*.value는 항상 재미 있습니다

그러나 성가신 기능에서는 반환 유형으로 계승 함수를 선언해야했습니다 BigInteger. Groovy가 모든 숫자를 BigInteger또는 안에 넣었다는 인상을 BigDecimal받았지만 반환 유형에 대해서는 그렇지 않을 수도 있습니다. 나는 더 많은 실험을해야 할 것이다. 이 반환 유형을 명시 적으로 지정하지 않으면 잘못된 계승 값을 매우 빠르게 얻을 수 있습니다.


2

J, 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

R, 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)

R 바이올린에서 사용해보십시오

설명

  1. 벡터를 생성 0 ... n-1하고 문자열로 축소 :paste(1:n-1,collapse="")
  2. 문자열을 숫자로 나누고 numeric (store as x) 으로 변환하십시오 .x=as.numeric(el(strsplit(...,"")))
  3. 분자를 계산하기 위해 우리 factorial(sum(1|x))는 단순히#digits!
  4. 분모를 계산하기 table위해 빈도를 나열하는 우발 사태 테이블을 구성하는 데 사용 합니다. F (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)))

참고 : 4 단계와 5 단계는 n>0그렇지 않은 경우에만 전달됩니다 1.


1

Mathematica, 65 바이트

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

아마도 더 골프를 칠 수있을 것입니다.




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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.