다음과 같은 입력을받는 프로그램을 작성하십시오.
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)