Machen wir ein Dreieck


15

Die meisten Leute kennen Pascals Dreieck.

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

Pascals Dreieck ist ein Automat, bei dem der Wert einer Zelle die Summe der Zellen links oben und rechts oben ist. Jetzt definieren wir ein ähnliches Dreieck. Anstatt nur die Zellen nach links oben und rechts oben zu nehmen, nehmen wir alle Zellen entlang zweier unendlicher Linien, die sich nach links oben und rechts oben erstrecken. Genau wie Pascals Dreieck beginnen wir mit einer einzelnen 1Zahl, die unendlich mit Nullen aufgefüllt ist, und bauen von dort abwärts.

Zum Beispiel, um die mit einem gekennzeichnete Zelle zu berechnen x

   1
  1 1
 2 2 2
4 5 5 4
   x

Wir würden die folgenden Zellen summieren

   .
  . .
 2 . 2
. 5 5 .
   x

Machen Sie unsere neue Zelle 14.

Aufgabe

Wenn eine Zeilennummer ( n ) und ein Abstand von links ( r ) gegeben sind, wird der r- te Eintrag ungleich Null von links in der n- ten Zeile berechnet und ausgegeben . (das Äquivalent zu Pascals Dreieck ist nCr ). Sie können annehmen, dass r kleiner als n ist .

Dies ist . Ziel ist es, die Anzahl der Bytes in Ihrer Lösung zu minimieren.

Testfälle

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

Hier sind die ersten paar Zeilen in Dreiecksform:

                  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


Können unsere Beiträge stattdessen eine 1-basierte Indizierung verwenden?
Kritixi Lithos

9
@KritixiLithos Sicher. Es wird mich allerdings traurig machen.
Weizen-Assistent

Antworten:


8

Jelly , 18 17 Bytes

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

Verwendet eine 0-basierte Indizierung.

Probieren Sie es online!

Wie es funktioniert

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 Bytes

1 Byte dank 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)))

Probieren Sie es online!


1
Sie können neu anordnen, um dies zu erhalten: n>=r>=0andund ein Byte speichern
Kritixi Lithos

@EinkornEnchanter Wenn n0 ist, dann gibt es 1; Ansonsten gibt es 0. Es ist wie n and ... or 1, aber kürzer.
Undichte Nonne

Ich verstehe, netter Missbrauch von gebrochenem Verhalten dann +1.
Weizen-Assistent

@EinkornEnchanter 0^0ist 1 in den meisten Programmiersprachen verfügbar .
Arnauld

@ Arnauld Das macht es nicht wahr;)
Weizen-Assistent

3

ES6, 80 78 Bytes

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

In Aktion!

Zwei Bytes dank Arnauld.


Mit while(n&&r<n)und können Sie 2 Bytes sparen while(o*r).
Arnauld

1
Diese Antwort ist vollkommen gültig. Also, wer es runtergestimmt hat, sollte auf jeden Fall eine Erklärung liefern ... Oder kann es eines dieser seltsamen automatischen Abstimmungen von Community sein?
Arnauld

2

PHP , 94 Bytes

rekursiver Weg 0-indiziert

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

Probieren Sie es online!

PHP , 125 Bytes

0-indiziert

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

Probieren Sie es online!

PHP> = 7.1, 159 Bytes

0-indiziert für Zeilen über 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];


0

Pascal , 145 Bytes

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;

Probieren Sie es online!

Verwendet die T(n, r) = T(n-1, r-1) + T(n-1, r)Rekursion.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.