Consente di creare un triangolo


15

Molte persone hanno familiarità con il triangolo di Pascal.

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

Il triangolo di Pascal è un automa in cui il valore di una cella è la somma delle celle in alto a sinistra e in alto a destra. Ora definiremo un triangolo simile. Invece di prendere solo le celle in alto a sinistra e in alto a destra, prenderemo tutte le celle lungo due linee infinite che si estendono in alto a sinistra e in alto a destra. Proprio come il triangolo di Pascal, iniziamo con un singolo 1imbottito all'infinito di zeri e costruiamo verso il basso da lì.

Ad esempio per calcolare la cella indicata con un x

   1
  1 1
 2 2 2
4 5 5 4
   x

Sommeremmo le seguenti celle

   .
  . .
 2 . 2
. 5 5 .
   x

Rendere la nostra nuova cellula 14.

Compito

Dato un numero di riga ( n ), e la distanza da sinistra ( r ) calcolare e uscita r th non nulla entrata da sinistra sul n ° fila. (l'equivalente sul triangolo di Pascal è nCr ). Si può presumere che r sia minore di n .

Questo è , l'obiettivo è ridurre al minimo il numero di byte nella soluzione.

Casi test

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

Ecco le prime due file a forma di triangolo:

                  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


I nostri invii possono invece utilizzare l'indicizzazione basata su 1?
Kritixi Lithos,

9
@KritixiLithos Certo. Mi renderà triste però.
Post Rock Garf Hunter,

Risposte:


8

Gelatina , 18 17 byte

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

Utilizza l'indicizzazione basata su 0.

Provalo online!

Come funziona

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 byte

1 byte grazie a 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)))

Provalo online!


1
È possibile riorganizzare per ottenere questo: n>=r>=0ande salvare un byte
Kritixi Lithos

@EinkornEnchanter se nè 0, quindi dà 1; altrimenti, dà 0. È simile n and ... or 1, ma più corto.
Leaky Nun,

Vedo, allora un bel abuso di comportamenti infranti, +1.
Post Rock Garf Hunter,


@Arnauld Questo non lo rende vero;)
Posta Rock Garf Hunter il

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

In azione!

Due byte grazie ad Arnauld.


È possibile salvare 2 byte utilizzando while(n&&r<n)e while(o*r).
Arnauld,

1
Questa risposta è perfettamente valida. Quindi, chiunque abbia annullato il voto dovrebbe sicuramente fornire una spiegazione ... O può essere uno di questi strani voti automatici dalla Community?
Arnauld,

2

PHP , 94 byte

modo ricorsivo indicizzato 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;}

Provalo online!

PHP , 125 byte

0-indicizzato

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

Provalo online!

PHP> = 7.1, 159 byte

0 indicizzato per righe oltre 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 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;

Provalo online!

Usa la T(n, r) = T(n-1, r-1) + T(n-1, r)ricorsione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.