Vamos fazer um triângulo


15

A maioria das pessoas conhece o triângulo de Pascal.

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

O triângulo de Pascal é um autômato em que o valor de uma célula é a soma das células no canto superior esquerdo e no canto superior direito. Agora vamos definir um triângulo semelhante. Em vez de apenas levar as células para o canto superior esquerdo e o canto superior direito, levaremos todas as células ao longo de duas linhas infinitas que se estendem para o canto superior esquerdo e o canto superior direito. Assim como o triângulo de Pascal, começamos com um único 1preenchido infinitamente por zeros e construímos para baixo a partir daí.

Por exemplo, para calcular a célula indicada com um x

   1
  1 1
 2 2 2
4 5 5 4
   x

Nós somaríamos as seguintes células

   .
  . .
 2 . 2
. 5 5 .
   x

Fazendo nosso novo celular 14.

Tarefa

Dado um número da linha ( n ), e a distância a partir da (esquerda r ) Calcular e emitir o r po diferente de zero de entrada a partir da esquerda na n -ésima linha. (o equivalente no triângulo de Pascal é nCr ). Você pode assumir que r é menor que n .

Isto é , o objetivo é minimizar o número de bytes em sua solução.

Casos de teste

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

Aqui estão as primeiras duas linhas em forma de triângulo:

                  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


Nossos envios podem usar a indexação baseada em 1?
Kritixi Lithos

9
@KritixiLithos Sure. Isso vai me deixar triste.
Post Rock Garf Hunter

Respostas:


8

Geléia , 18 17 bytes

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

Usa indexação baseada em 0.

Experimente online!

Como funciona

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 graças 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)))

Experimente online!


1
Você pode reorganizar para obter isso: n>=r>=0ande salvar um byte
Kritixi Lithos

@EinkornEnchanter se nfor 0, fornece 1; caso contrário, dá 0. É como n and ... or 1, mas mais curto.
Leaky Nun

Entendo, bom abuso de comportamento quebrado, +1.
Post Rock Garf Hunter

O @EinkornEnchanter 0^0está 1 na maioria das linguagens de programação .
Arnauld

@Arnauld Isso não significa que seja verdade;)
post rock Garf Hunter

3

ES6, 80 bytes 78

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

Em ação!

Dois bytes graças a Arnauld.


Você pode salvar 2 bytes usando while(n&&r<n)e while(o*r).
Arnauld

1
Esta resposta é perfeitamente válida. Então, quem quer que tenha votado negativamente deve definitivamente fornecer uma explicação ... Ou pode ser um desses votos negativos estranhos da Comunidade?
Arnauld

2

PHP , 94 bytes

maneira recursiva indexada em 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;}

Experimente online!

PHP , 125 bytes

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

Experimente online!

PHP> = 7.1, 159 bytes

0 indexado para linhas com mais de 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;

Experimente online!

Usa a T(n, r) = T(n-1, r-1) + T(n-1, r)recursão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.