수학적 조합


11

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

n,k

그런 다음 계산합니다.

n과 k의 조합.  (C (n, k))

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


수치 예 :

입력:

5,2

내부 계산 :

(5!) / (3! x2!)

인쇄 출력 :

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


기능 또는 전체 프로그램? 귀하의 설명은 올바른 결과를 반환하는 함수를 말하지만 예제는 그것을 인쇄하는 전체 프로그램입니다.
— Ventero

@Ventero 당신이 옳은 것은 프로그램을 의미합니다. 미안합니다.
— backus

3
기본 수학 개념은 J, APL, Maple, Mathematica 및 기타 많은 것들이 내장되어 있기 때문에 골프 질문이 아닙니다. 또한 입력 및 출력 형식에 대해 좀 더 구체적으로 설명하고 예제 결과를 제공합니다. 5가 2를 선택하는지 또는 2가 5를 선택하는지 의미하십시오.
— Jesse Millikan

@Jesse 주요 스크립팅 언어 만 허용하는 다른 웹 사이트에서이 문제를 해결했습니다. 앞으로이 지침을 기억할 것입니다. 도전 요구 사항을보다 명확하게하기 위해 질문을 편집했습니다. 충분히 명확하지 않은지 알려주십시오.
— backus

나는 새로운, 그래서 우리는 거의 같은 보트에 있습니다. 그러나 결과를 요약하지 마십시오. 그들은 구식이 될 것입니다. 투표하고 (해당되는 경우) 답변을 수락하십시오. (또한 이유없이 J와 GolfScript의 답변을 무시하면 사람들이 불행하게 될 것입니다.)
— Jesse Millikan

답변:


11

APL, 3 바이트

⎕!⎕

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

{Quad}!{Quad}

3
n,k입력 을 완전히 준수하려면 을 수행해야 !/⌽⎕합니다.
— marinus


10

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 * * |
|     *      *    \
*/    //       *  */

7

GolfScript, 17 자

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

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

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


6

골프 스크립트 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


6

루비 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) 더 적은 루핑, 더 많은 평가.

4

파이썬 (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)

당신은 당신의 스크립트에 대한 모범적 인 예를 제공 할 수 있습니까?
— backus

*양식의 입력을 구문 분석 하는 데 사용할 수 있습니까 4545 78?
— Quixotic

불행히도 아닙니다. 그러나 그것은 *문제 가 아닙니다 . 4545 78유효한 파이썬 표현식이 아니므 input()로를 발생 SyntaxError시킵니다. 이 트릭은 전적으로 요구하는 문제에 달려 있습니다 x,y. x y튜플 을 읽고 반환 하는 함수가 있다면 그 *와 함께 사용할 수 있습니다 .


3

윈도우 PowerShell, 57

$a,$b=iex $input
$p=1
for($a-=$b;$a-ge1){$p*=1+$b/$a--}$p

3

J, 33 36

(":!~/".;._1}:toJ',',1!:1(3))1!:2(4)

35 개의 문자가 입력, 파싱 및 출력됩니다. 다른 문자 인 !n은 k를 선택합니다.

나는 현재 이것을 테스트 할 Windows가 없지만 거기에서 작동해야한다고 생각합니다.



2

펄 6 (55)

my ($a,$b)=lines;$_=1;for 1..$a-$b {$_+=$_*$b/$^a};.say

2

RPL (22)

(내장 COMB 기능을 사용하지 않음)

→ n k 'n!/(k!*(n-k)!)'

2

Q ( 50 45)

 f:{(prd 1.+til x)%((prd 1.+til y)*prd 1.+til x-y)}

여분의 대괄호를 제거하고 prd 대신 1 * /를 사용하여 위의 문자를 약간 줄일 수 있습니다.

f:{(1*/1.+til x)%(1*/1.+til y)*1*/1.+til x-y}

2

매스 매 티카 12

간단하고 내장 된 기능.

n~Binomial~k


1

PHP (71 79 )

<?$a=fgetcsv(STDIN);$x=1;while($a[1]-$i)$x=$x*($a[0]-++$i+1)/$i;echo$x;

<?php $a=fgetcsv(STDIN);$x=1;while(++$i<=$a[1])$x=$x*($a[0]-$i+1)/$i;echo $x?>


1

파이썬 (54)

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

위의 Python과 본질적으로 동일하지만

and 1

함수 정의에서. 그러나 이로 인해 k = 0 인 경우 함수 대신 1 대신 True를 반환하지만, 1 * True = 1이므로 인쇄하기 전에 1을 곱하여 2 바이트를 추가하여 해결할 수 있습니다.


1

J, 11 자

!~/".1!:1[1

키보드에서 입력을받습니다.

    !~/".1!:1[1
5,2
10

0

하스켈 (80)

f(_,0)=1
f(n,k)=n/k*f(n-1,k-1)
main=getLine>>=putStr.show.f.read.(++")").('(':)

그러나 format x y대신 format 형식의 입력 이 허용되는 경우 x,y74 자입니다.

f[_,0]=1
f[n,k]=n/k*f[n-1,k-1]
main=interact$show.f.map read.take 2.words


0

파이썬 (52)

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

사용하여 다른 두에서 개선 print+의 결과를 변환 f에서 boolean하는 int경우 k==0.

여전히 39로 축소하는 방법을 모릅니다. 람다를 사용하고 있는지 궁금합니다.


0

(OP는 입력 및 출력 방법 / 형식을 느슨하게 지정 했으므로 다음이 허용됩니다.)

세이지 노트 ( 39 41 40)

현재 셀에서

f=lambda n,k:k<1or f(n-1,k-1)*n/k;+f(*_)

여기서 양식의 입력 n,k은 이전 셀에서 입력 및 평가됩니다. "명령 줄 입력"을 지정하여 _(명령 줄 인수와 유사) 시뮬레이션 합니다.

세이지 노트 ( 42 44 43)

또는 "소스 내 입력"( x=및 줄 바꿈 문자 만 스코어에 추가)을 사용하여

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

이 두 가지 접근 방식은 분명히 다른 사람들의 초기 답변에서 나온 것입니다.



0

자바 스크립트, 27 바이트

먼저 내 자신의 35 바이트 솔루션 :

f=(n,k)=>n-k&&k?f(--n,k)+f(n,k-1):1

또는 대안으로

f=(n,k,i=k)=>i?f(n-1,k-1,i-1)*n/k:1

첫 번째 (n,k) = (n-1,k) + (n-1,k-1)규칙 은 간단한 규칙으로 재귀 적으로 작동 합니다. 두 번째는 그것을 사용합니다 (n,k) = (n-1,k-1) * n/k.

편집하다

방금 Arnould의 해결책을이 사본에서 발견했습니다.

f=(n,k)=>k?n*f(n-1,k-1)/k:1

무려 8 바이트 (27 바이트)가 적습니다.


0

TI-BASIC, 16 자 (8 바이트)

Ans(1) nCr Ans(2

입력은의 길이가 2 in 인 목록입니다 Ans.
출력은 여기에 정의 된 공식의 결과입니다 .

위의 솔루션으로 충분하지 않으면 다음 35 자 (24 바이트) 솔루션도 작동합니다.

Ans(2)!⁻¹(Ans(1)-Ans(2))!⁻¹Ans(1)!

참고 : TI-BASIC은 토큰 화 된 언어입니다. 문자 수는 바이트 수와 같지 않습니다 .

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