Mari kita membuat segitiga

15

Kebanyakan orang akrab dengan segitiga Pascal.

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

Segitiga Pascal adalah otomat di mana nilai sel adalah jumlah sel ke kiri atas dan kanan atas. Sekarang kita akan mendefinisikan segitiga serupa. Alih-alih hanya mengambil sel ke kiri atas dan kanan atas kita akan mengambil semua sel sepanjang dua garis tak terbatas memanjang ke kiri atas dan kanan atas. Sama seperti segitiga Pascal, kita mulai dengan satu 1bantalan tanpa batas dengan nol dan membangun ke bawah dari sana.

Misalnya menghitung sel yang dilambangkan dengan x

   1
  1 1
 2 2 2
4 5 5 4
   x

Kami akan menjumlahkan sel-sel berikut

   .
  . .
 2 . 2
. 5 5 .
   x

Membuat sel baru kami 14.

Tugas

Mengingat nomor baris ( n ), dan jarak dari kiri ( r ) menghitung dan output r th non zero-entri dari kiri pada n th berturut-turut. (ekuivalen pada segitiga Pascal adalah nCr ). Anda dapat berasumsi bahwa r kurang dari n .

Ini adalah , tujuannya adalah untuk meminimalkan jumlah byte dalam solusi Anda.

Uji kasus

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

Inilah baris pasangan pertama dalam bentuk segitiga:

                  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
Posting Rock Garf Hunter
sumber
5
OEIS A035002
Leaky Nun
Bisakah kiriman kami menggunakan pengindeksan berbasis 1 saja?
Kritixi Lithos
9
@KritixiLithos Tentu. Itu akan membuatku sedih.
Post Rock Garf Hunter

Jawaban:

8

Jelly , 18 17 byte

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

Menggunakan pengindeksan berbasis 0.

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
5

Python 3 , 72 byte

1 byte berkat Kritixi Lithos.

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

Cobalah online!

Biarawati Bocor
sumber
1
Anda dapat mengatur ulang untuk mendapatkan ini: n>=r>=0anddan menyimpan byte
Kritixi Lithos
@EinkornEnchanter jika n0, maka memberi 1; jika tidak, ia memberi 0. Itu seperti n and ... or 1, tetapi lebih pendek.
Leaky Nun
Begitu, penyalahgunaan penyalahgunaan perilaku yang rusak, +1.
Posting Rock Garf Hunter
@EinkornEnchanter 0^0ada 1 di sebagian besar bahasa pemrograman .
Arnauld
@Arnauld Itu tidak benar;)
Post Rock Garf Hunter
3

ES6, 80 78 byte

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

Beraksi!

Dua byte, terima kasih kepada Arnauld.

2ndAttmt
sumber
Anda dapat menyimpan 2 byte dengan menggunakan while(n&&r<n)dan while(o*r).
Arnauld
1
Jawaban ini sangat valid. Jadi, siapa pun yang downvoted pasti harus memberikan penjelasan ... Atau mungkinkah ini salah satu downvotes otomatis aneh dari Komunitas?
Arnauld
2

PHP , 94 byte

cara rekursif 0-diindeks

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

Cobalah online!

PHP , 125 byte

Diindeks 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]];

Cobalah online!

PHP> = 7.1, 159 byte

Diindeks 0 untuk baris lebih dari 50

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];
Jörg Hülsermann
sumber
1

Python 3 , 61 byte

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

Ini mengembalikan True untuk kasus dasar (0, 0) , yang diizinkan secara default .

Cobalah online!

Dennis
sumber
~n<-r<1cukup pintar, saya menghabiskan 10 menit yang baik untuk mencoba golf n>=r>=0.
Posting Rock Garf Hunter
1
Sebenarnya tidak lebih pendek, tetapi menghemat ruang. :)
Dennis
0

Pascal , 145 byte

function f(n,k:integer):integer;var i,r:integer;begin r:=1-Ord((k<0)or(k>n));if n>0 then r:=0;for i:=1 to n do r:=r+f(n-i,k-i)+f(n-i,k);f:=r;end;

Cobalah online!

Gunakan T(n, r) = T(n-1, r-1) + T(n-1, r)rekursi.

Uriel
sumber