数学的な組み合わせ


11

次のような入力を受け取るプログラムを作成します。

n,k

次に計算します:

nとkの組み合わせ。 (C(n、k))

そして、結果を印刷します。


数値の例:

入力:

5,2

内部計算:

(5!)/(3!x2!)

印刷出力:

10

私は65文字のPythonソリューションに勝る答えを探していますが、すべての言語は明らかに歓迎されています。

私のソリューションは次のとおりです。

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

編集:

この質問はcodegolfのWebサイトの数学的な組み合わせパズルからのものであることを認めます。私の答えはあまり進歩していないように見えるかもしれませんが、このパズルのリーダーはほぼ半分のキャラクターでそれを解決しました。

言語ごとの現在の最低文字数は次のとおりです。

Perl:35

ルビー:36

Python:39

PHP:62


機能または完全なプログラム?説明には正しい結果を返す関数が記載されていますが、例はそれを印刷する完全なプログラムです。
ヴェンテロ

@Venteroまさにその通り、プログラムを意味します。ごめんなさい
バッカス

3
一般的に、基本的な数学の概念は、J、APL、Maple、Mathematicaなど多くのものが組み込まれているため、素晴らしいゴルフの質問ではありません。ここで5を選択するか2を選択するかを教えてください。
ジェシーミリカン

@Jesse主要なスクリプト言語のみを許可する別のWebサイトからこのチャレンジを受けました。将来このガイドラインを思い出すでしょう。質問を編集して、チャレンジ要件をより明確にし、十分に明確かどうかを教えてください。
バックス

私は新しいので、私たちはほぼ同じ船に乗っています。ただし、結果を要約しないでください。彼らはただ時代遅れになります。投票し、(適切であれば)答えを受け入れてください。(また、JとGolfScriptの回答を理由なく無視すると、人々を不幸にします。)
ジェシーミリカン

回答:


11

APL、3バイト

⎕!⎕

または、ブラウザが上記をASCIIレンダリングでレンダリングしない場合:

{Quad}!{Quad}

3
n,k入力に完全に準拠するには、を実行する必要があります!/⌽⎕
マリナス


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


6

GolfScript 21

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

特に短くはありませんが、GolfScriptには実際の階乗関数がありませんが、これは私がこれまでに行った中で最も邪悪なデータ操作である必要があります。これはスタックトレースを必要とします。

「5,2」入力からのスタック上のデータ。
~Evalコマンドは、数値を配列に変換する演算子であることに注意してください。
[0 1 2 3 4] 2
~バイナリではありません。
[0 1 2 3 4] -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]] {{)}%{*} *}
%配列の各要素に対してブロックを1回実行します。次のパートでは、最初のループのみを示します。
[3 4]
{)}%各配列要素をインクリメントします。
[4 5]
{*}乗算コマンドを含むブロック。
[4 5] {*}
*blockコマンドを使用して配列を「折りたたみ」ます。つまり、この場合、すべての要素の積を作成します。
20
大きなループが終了すると、結果を含む配列を返します。
[20 2]
~配列を解体します。
20 2
/部門。
10


6

Ruby 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)

あなたの台本の無制限の例を提供してもらえますか?
バッカス

*フォームの入力の解析に使用できます4545 78か?
キクソチック

残念ながら、いいえ。しかし、それ*は問題ではありません。4545 78は有効なPython式ではないinput()ため、を発生させSyntaxErrorます。このトリックはを求める問題に完全に依存しx,yます。x yタプルを読み取って返す関数があれば、それで*問題なく使用できます。



3

J、33 36

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

35文字が入力、解析、および出力されます。もう一方の文字、!nはkを選択します。

現在のところ、これをテストするためのWindowsはありませんが、そこで動作するはずです。



2

Perl 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}



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と同じですが、4バイトを削って削ります

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,y、74文字です。

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+結果を変換するfbooleanint場合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)

または、「in-source input」(x=スコアに追加するのは改行文字のみ)を使用します。たとえば、

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

これらのアプローチは両方とも、明らかに他の人による以前の回答から派生したものです。



0

Javascript、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)ルールで再帰的に動作します。2つ目はそれを使用し(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のリストですAns
出力は、ここで定義さた式の結果です

上記のソリューションでは不十分な場合、次の35文字(24バイト)のソリューションも機能します。

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

注: TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.