Permet de faire un triangle

15

La plupart des gens connaissent le triangle de Pascal.

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

Le triangle de Pascal est un automate où la valeur d'une cellule est la somme des cellules en haut à gauche et en haut à droite. Maintenant, nous allons définir un triangle similaire. Au lieu de simplement prendre les cellules en haut à gauche et en haut à droite, nous allons prendre toutes les cellules le long de deux lignes infinies s'étendant en haut à gauche et en haut à droite. Tout comme le triangle de Pascal, nous commençons par un simple 1rembourré à l'infini par des zéros et nous construisons vers le bas à partir de là.

Par exemple, pour calculer la cellule indiquée par un x

   1
  1 1
 2 2 2
4 5 5 4
   x

Nous résumerions les cellules suivantes

   .
  . .
 2 . 2
. 5 5 .
   x

Faire notre nouvelle cellule 14.

Tâche

Étant donné un numéro de ligne ( n ) et une distance à gauche ( r ), calculez et sortez la r e entrée non nulle à partir de la gauche sur la n e ligne. (l'équivalent sur le triangle de Pascal est nCr ). Vous pouvez supposer que r est inférieur à n .

Il s'agit de , l'objectif est de minimiser le nombre d'octets dans votre solution.

Cas de test

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

Voici les deux premières lignes sous forme de triangle:

                  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
Post Rock Garf Hunter
la source
5
OEIS A035002
Leaky Nun
Nos soumissions peuvent-elles utiliser l'indexation basée sur 1 à la place?
Kritixi Lithos
9
@KritixiLithos Sure. Cela me rendra triste cependant.
Post Rock Garf Hunter

Réponses:

8

Gelée , 18 17 octets

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

Utilise l'indexation basée sur 0.

Essayez-le en ligne!

Comment ça fonctionne

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
la source
5

Python 3 , 72 octets

1 octet grâce à 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)))

Essayez-le en ligne!

Leaky Nun
la source
1
Vous pouvez réorganiser pour obtenir ceci: n>=r>=0andet enregistrer un octet
Kritixi Lithos
@EinkornEnchanter si nvaut 0, alors il donne 1; sinon, il donne 0. C'est comme n and ... or 1, mais plus court.
Leaky Nun
Je vois, alors bon abus de comportement brisé, +1.
Post Rock Garf Hunter
@EinkornEnchanter 0^0est 1 dans la plupart des langages de programmation .
Arnauld
@Arnauld Cela ne le rend pas vrai;)
Post Rock Garf Hunter
3

ES6, 80 78 octets

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

En action!

Deux octets grâce à Arnauld.

2ndAttmt
la source
Vous pouvez enregistrer 2 octets en utilisant while(n&&r<n)et while(o*r).
Arnauld
1
Cette réponse est parfaitement valable. Donc, celui qui a voté en bas devrait certainement fournir une explication ... Ou peut-il s'agir de l'un de ces étranges votes automatiques de la communauté?
Arnauld
2

PHP , 94 octets

manière récursive indexée 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;}

Essayez-le en ligne!

PHP , 125 octets

0 indexé

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

Essayez-le en ligne!

PHP> = 7.1, 159 octets

0 indexé pour les lignes de plus 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];
Jörg Hülsermann
la source
1

Python 3 , 61 octets

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

Cela renvoie True pour le cas de base (0, 0) , ce qui est autorisé par défaut .

Essayez-le en ligne!

Dennis
la source
~n<-r<1est assez intelligent, j'ai passé 10 bonnes minutes à essayer le golf n>=r>=0.
Post Rock Garf Hunter
1
Pas vraiment plus court, mais cela économise de l'espace. :)
Dennis
0

Pascal , 145 octets

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;

Essayez-le en ligne!

Utilise la T(n, r) = T(n-1, r-1) + T(n-1, r)récursivité.

Uriel
la source