수학적 조합


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.