三角形を作ろう


15

ほとんどの人はパスカルの三角形に精通しています。

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

パスカルの三角形は、セルの値が左上と右上のセルの合計であるオートマトンです。次に、同様の三角形を定義します。セルを左上と右上に移動する代わりに、左上と右上に伸びる2つの無限の線に沿ってすべてのセルを移動します。パスカルの三角形のように1、ゼロで無限にパディングされた単一のものから始めて、そこから下に向かってビルドします。

たとえば、で示されるセルを計算するには x

   1
  1 1
 2 2 2
4 5 5 4
   x

次のセルを合計します

   .
  . .
 2 . 2
. 5 5 .
   x

新しいセルを作成します14

仕事

行番号(n)と左からの距離(r)を指定して、n番目の行の左からr番目の非ゼロエントリを計算して出力します。(パスカルの三角形に相当するものはnCrです)。rnより小さいと仮定できます。

これはであり、目標はソリューションのバイト数を最小限にすることです。

テストケース

0,0 -> 1
1,0 -> 1
2,0 -> 2
4,2 -> 14
6,3 -> 106

三角形形式の最初の数行は次のとおりです。

                  1
                1   1
              2   2   2
            4   5   5   4
          8  12  14  12   8
       16  28  37  37  28  16
     32  64  94  106 94  64  32
   64  144 232 289 289 232 144 64
 128 320 560 760 838 760 560 320 128


提出物は代わりに1ベースのインデックス作成を使用できますか?
クリティキシリソス

9
@KritixiLithos確かに。しかし、それは私を悲しませます。
ポストロックガーフハンター

回答:


8

ゼリー18 17バイト

SṚ0;+Sṭ
1WWÇ⁸¡ṪṙḢ

0ベースのインデックスを使用します。

オンラインでお試しください!

使い方

1WWÇ⁸¡ṪṙḢ  Main link. Arguments: n, r

1          Set the return value to 1.
 W         Wrap; yield [1].
  W        Wrap; yield [[1]].
           This is the triangle with one row.
   Ç⁸¡     Call the helper link n times.
           Each iteration adds one row to the triangle.
      Ṫ    Tail; take the last array, i.e., the row n of the triangle.
       ṙ   Rotate row n r units to the left.
        Ḣ  Head; take the first element, i.e., entry r of row n.


SṚ0;+Sṭ    Helper link. Argument: T (triangle)

S          Take the column-wise sums, i.e., sum the ascending diagonals of the 
           centered triangle, left to right.
 Ṛ         Reverse the array of sums. The result is equal to the sums of the 
           descending diagonals of the centered triangle, also left to right.
  0;       Prepend a 0. This is required because the first element of the next row 
           doesn't have a descending diagonal.
     S     Take the column-wise sum of T.
    +      Add the ascending to the descending diagonals.

5

Python 3、72バイト

Kritixi Lithosのおかげで1バイト。

f=lambda n,r:n>=r>=0and(0**n or sum(f(i,r)+f(i,r+i-n)for i in range(n)))

オンラインでお試しください!


1
これを取得するために並べ替えることができます。n>=r>=0andそして、バイトを保存します
Kritixi Lithos

@EinkornEnchanter nが0の場合、1が得られます。それ以外の場合は、0にn and ... or 1なります。これはに似ていますが、短くなります。
リーキー修道女

私は、壊れた振る舞いの良い虐待、+ 1を参照してください。
ポストロックガーフハンター


@Arnauldそれは真実になりません;)
ポストロックガーフハンター

3

ES6、80の 78バイト

p=(n,r,c=0)=>n?(o=>{while(n&&r<n)c+=p(--n,r);while(o*r)c+=p(--o,--r)})(n)||c:1

アクションで!

Arnauldのおかげで2バイト。


while(n&&r<n)とを使用して2バイトを節約できますwhile(o*r)
アーノールド

1
この答えは完全に有効です。だから、誰がそれをダウン票したにせよ、間違いなく説明を提供すべきです...または、それはコミュニティからのこれらの奇妙な自動ダウン票の一つでしょうか?
アーナルド

2

PHP、94バイト

再帰的方法0インデックス付き

function f($r,$c){for($s=$r|$c?$r<0?0:!$t=1:1;$t&&$r;)$s+=f($r-=1,$c)+f($r,$c-++$i);return$s;}

オンラインでお試しください!

PHP、125バイト

0インデックス付き

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;$v+=$l)$x[$c]+=$t[+$r][$c]=$l=($v=&$y[$r-$c])+$x[$c]?:1;echo$t[$r-1][$argv[2]];

オンラインでお試しください!

PHP> = 7.1、159バイト

50を超える行の0インデックス

for([,$m,$n]=$argv;$r<=$m;$r++)for($z++,$c=0;$c<$z;$v=bcadd($v,$l),$x[$c]=bcadd($x[$c],$l),$c++)$t[+$r][$c]=$l=bcadd(($v=&$y[$r-$c]),$x[$c])?:1;echo$t[$m][$n];

1

Python 3、61バイト

f=lambda n,r:sum(f(k,r)+f(k,r+k-n)for k in range(n))or~n<-r<1

これは、デフォルト許可されている基本ケース(0、0)に対してTrueを返します

オンラインでお試しください!


~n<-r<1かなり賢いです、私はゴルフをしようとして良い10分を費やしましたn>=r>=0
ポストロックガーフハンター

1
実際には短くありませんが、スペースを節約します。:)
デニス

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