수학적 조합 예 : 입력: 5,2 내부 계산 : 인쇄

다음과 같은 입력을받는 프로그램을 작성하십시오.

n,k

그런 다음 계산합니다.

그런 다음 결과를 인쇄합니다.


수치 예 :

입력:

5,2

내부 계산 :

인쇄 출력 :

10

나는 65 자의 파이썬 솔루션을 능가하는 답변을보고 싶지만 모든 언어를 환영합니다.

내 해결책은 다음과 같습니다.

n,k=input();f=lambda x:+(x<2)or x*f(x-1);print f(n)/(f(k)*f(n-k))

편집하다:

이 질문은 codegolf 웹 사이트 수학 조합 퍼즐 에서 온 것임을 인정합니다 . 나는 내 대답이 그다지 진보하지 못할 것처럼 보일지 모르지만이 퍼즐의 지도자는 거의 절반의 문자로 그것을 해결했습니다.

언어 별 현재 가장 낮은 문자 수는 다음과 같습니다.

펄 : 35

루비 : 36

파이썬 : 39

PHP : 62



답변

APL, 3 바이트

⎕!⎕

또는 ASCII 렌더링에서 브라우저가 위를 렌더링하지 않는 사람들을 위해 :

{Quad}!{Quad}

답변

R (11 자)

choose(n,r)

답변

C 96

I / O 사용시 (약 34 자 소요) 읽을 수 있도록 몇 가지 줄 바꿈을 추가했습니다.

main(a,b,c,d){scanf("%d,%d",&a,&b);
d=a-b;for(c=1;a>b;){c*=a--;}for(;d;)
{c/=d--;}printf("%d",c);}

실례하겠습니다 만, ASCII n을 선택하여 k 로켓을 선택하십시오.

    d;main(a
   ,         b
  ,           c
 )  int        a
 ;   {scanf    (
 (   "%d %d"   )
 ,   &a,  &b   )
 ;   d    =a   -
 b   +     b   -
 b   *     1   ;
 a             -
 a  ;for    (  c
 =  1;a>   b   ;
 )  {c=   c    *
 (  (a-- )     )
 ;  }for(      b
 =  b + 1      ;
 d  ;    )     {
 c  =     c    /
 (  d--    )   ;
  }           {
  }           {
   }         (
  printf("%d",c)
 )      ;       }
/*     *  *   * *\
 * * X   * 8 * * |
|     *      *    \
*/    //       *  */

답변

GolfScript, 17 자

이 솔루션은 k = 0 또는 k = 1과 같은 경우를 올바르게 처리합니다.

~>.,,]{1\{)*}/}//

계승과 같은 부분은 이전 답변을 기반으로합니다 .


답변

골프 스크립트 21

~~)>.,,]{{)}%{*}*}%~/

특히 짧지 않지만 GolfScript에는 실제 팩토리얼 기능이 없지만 이것이 내가 수행 한 가장 악의적 인 데이터 조작이어야합니다. 이것은 스택 추적을 요구합니다.

“5,2”입력에서 스택의 데이터.
~Eval 명령은 숫자를 배열로 바꾸는 연산자입니다.
2
~이진이 아니다.
-3
)증가.
[0 1 2 3 4] -2
>마지막 2 개의 요소를 얻기 위해 매개 변수로 -2 배열의 끝을 가져옵니다.
[3 4]
.요소가 중복되었습니다.
[3 4] [3 4]
,배열 길이.
[3 4] 2
,숫자를 배열로 바꿉니다.
[3 4] [0 1]
]배열을 만듭니다.
[[3 4] [0 1]]
{{)}%{*}*}코드 블록.
[[3 4] [0 1]] {{)} % {*} *}
%배열의 각 요소에 대해 블록을 한 번 실행합니다. 다음 부분은 첫 번째 루프 만 보여줍니다.
[3 4]
{)}%각 배열 요소를 증가시킵니다.
[4 5]
{*}곱하기 명령을 포함하는 블록.
[4 5] {*}
*블록 명령을 사용하여 배열을 “접습니다”.이 경우 모든 요소의 곱을 만듭니다.
20
큰 루프가 끝나면 결과와 함께 배열을 반환합니다.
[20 2]
~배열을 해체하십시오.
20 2
/사단.
10


답변

루비 1.9, 52 46 (42) 자

eval"A,B="+gets;i=0;p eval"(A-B+i+=1)/i*"*B+?1

stderr이 무시되는 경우 :

eval"A,B=I="+gets;p eval"I/(A-I-=1)*"*B+?1

Ruby 1.8, 43 자, stderr에 대한 추가 출력 없음 :

eval"a,b=i="+gets;p eval"i/(a-i-=1)*"*b+"1"

편집 :

  • (52-> 48) 입력을 구문 분석하는 더 짧은 방법을 찾았습니다.
  • (48-> 46) 더 적은 루핑, 더 많은 평가.

답변

파이썬 (56)

f=lambda n,k:k<1and 1or f(n-1,k-1)*n/k;print f(*input())

이진 계수를 계산하기위한 단축 코드 및 단축 법에 대한 설명이 있습니다. (참고 : 39 문자 버전으로 내려 가기 위해 아직 이해하지 못한 통찰력이 있습니다.이 접근법이 당신에게 도달 할 것이라고 생각하지 않습니다.)

# Since choose(n,k) =
#
#     n!/((n-k)!k!)
#
#          [n(n-1)...(n-k+1)][(n-k)...(1)]
#        = -------------------------------
#            [(n-k)...(1)][k(k-1)...(1)]
#
# We can cancel the terms:
#
#     [(n-k)...(1)]
#
# as they appear both on top and bottom, leaving:
#
#    n (n-1)     (n-k+1)
#    - ----- ... -------
#    k (k-1)       (1)
#
# which we might write as:
#
#      choose(n,k) = 1,                      if k = 0
#                  = (n/k)*choose(n-1, k-1), otherwise
#
def choose(n,k):
    if k < 1:
        return 1
    else:
        return choose(n-1, k-1) * n/k

# input() evaluates the string it reads from stdin, so "5,2" becomes
# (5,2) with no further action required on our part.
#
# In the golfed version, we make use of the `*` unpacking operator,
# to unpack the tuple returned by input() directly into the arguments
# of f(), without the need for intermediate variables n, k at all.
#
n, k = input()

# This line is left as an exercise to the reader.
print choose(n, k)