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
Weizen-Assistent
quelle
5
OEIS A035002
Undichte Nonne
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.
Dennis
quelle
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!

Undichte Nonne
quelle
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.

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

Python 3 , 61 Bytes

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

Dies gibt True für den Basisfall (0, 0) zurück , der standardmäßig zulässig ist .

Probieren Sie es online!

Dennis
quelle
~n<-r<1ist ziemlich schlau, ich habe gute 10 Minuten damit verbracht, Golf zu spielen n>=r>=0.
Weizen-Assistent
1
Eigentlich nicht kürzer, aber platzsparend. :)
Dennis
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.

Uriel
quelle