Üçgen yapalım


15

Çoğu insan Pascal üçgenine aşinadır.

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

Pascal üçgeni, bir hücrenin değerinin sol üst ve sağ üstteki hücrelerin toplamı olduğu bir otomattır. Şimdi benzer bir üçgen tanımlayacağız. Hücreleri sadece sol üst ve sağ üste götürmek yerine, tüm hücreleri sol üst ve sağ üste uzanan iki sonsuz çizgi boyunca ele alacağız. Tıpkı Pascal'ın üçgeni gibi 1, sıfırlarla sonsuz bir yastıklı tek bir nokta ile başlayıp oradan aşağı doğru inşa ediyoruz .

Örneğin, bir ile gösterilen hücreyi hesaplamak için x

   1
  1 1
 2 2 2
4 5 5 4
   x

Aşağıdaki hücreleri toplayacağız

   .
  . .
 2 . 2
. 5 5 .
   x

Yeni hücremizi yapıyoruz 14.

Görev

Bir satır numarasını (Verilen n sol (den) ve mesafe r ) hesaplamak ve çıkış r soldan sıfır olmayan giriş inci N inci satır. (Pascal üçgenindeki eşdeğer nCr'dir ). Sen varsayabiliriz r azdır n .

Bu , amaç çözümünüzdeki bayt sayısını en aza indirmektir.

Test senaryoları

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

İşte üçgen formdaki ilk çift sıra:

                  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


Gönderilerimiz bunun yerine 1 tabanlı dizine ekleme özelliğini kullanabilir mi?
Kritixi Lithos

9
@KritixiLithos Elbette. Yine de beni üzecek.
Post Rock Garf Hunter

Yanıtlar:


8

Jöle , 18 17 bayt

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

0 tabanlı indeksleme kullanır.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

Kritixi Lithos sayesinde 1 bayt.

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

Çevrimiçi deneyin!


1
Bunu almak için yeniden düzenleyebilirsiniz: n>=r>=0andve bir bayt kaydedin
Kritixi Lithos

@EinkornEnchanter n0 ise , 1 verir; aksi halde 0 verir. O gibidir n and ... or 1, ama daha kısadır.
Leaky Nun

Görüyorum ki, kırılmış davranışların güzel bir şekilde kötüye kullanılması +1.
Rock Garf Hunter Post

@EinkornEnchanter 0^0olan 1 en programlama dillerinde .
Arnauld

@Arnauld Bu doğru değil;)
Post Rock Garf Hunter

3

ES6, 80 78 bayt

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

Eylem!

Arnauld sayesinde iki bayt.


Sen kullanarak 2 bayt kaydedebilir while(n&&r<n)ve while(o*r).
Arnauld

1
Bu cevap tamamen geçerlidir. Peki, kim düşürdüyse kesinlikle bir açıklama yapmalı ... Yoksa bu Topluluğun bu garip otomatik aşağılıklarından biri olabilir mi?
Arnauld

2

PHP , 94 bayt

özyinelemeli yol 0 dizinli

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

Çevrimiçi deneyin!

PHP , 125 bayt

0 endeksli

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

Çevrimiçi deneyin!

PHP> = 7,1, 159 bayt

50'nin üzerindeki satırlar için 0 dizinli

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


0

Pascal , 145 bayt

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;

Çevrimiçi deneyin!

T(n, r) = T(n-1, r-1) + T(n-1, r)Özyinelemeyi kullanır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.