Triangle de Clark


10

Ok, j'ai été sur un coup de pied triangle récemment, alors voici un autre.

Le triangle de Clark est un triangle où l'entrée la plus à gauche de chaque ligne est 1 et les entrées les plus à droite sont composées de multiples de 6 qui augmentent à mesure que le nombre de lignes augmente. Voici une visualisation

     1 6
    1 . 12
   1 . . 18
  1 . . . 24
 1 . . . . 30
1 . . . . . 36

Tout comme le triangle de Pascal, toutes les autres entrées sont la somme des nombres en haut à droite et en haut à gauche.

Voici les premières lignes remplies

          1   6
        1   7  12
      1   8  19  18
    1   9  27  37  24
  1  10  36  64  61  30
1  11  46  100 125 91  36

Tâche

Étant donné un numéro de ligne (à partir du haut) et un numéro de colonne (à partir du premier élément différent de zéro sur cette ligne), affichez la valeur à cette cellule particulière. Les deux entrées peuvent être indexées 1 ou 0 (vous pouvez mélanger et assortir si vous le souhaitez). En dehors des limites du triangle n'est pas défini et vous pouvez faire ce que vous voulez lorsque vous êtes interrogé pour ces valeurs.

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

OEIS A046902


1
Pouvons-nous construire une solution avec zéro dans la première rangée? comme dans la séquence OEIS
Jörg Hülsermann

1
@ JörgHülsermann Comme cela est hors limites pour le triangle défini ici, vous pouvez faire ce que vous voulez.
Ad Hoc Garf Hunter

Réponses:


7

MATL , 15 octets

[lBB]i:"TTY+]i)

La première entrée est une ligne basée sur 0; la deuxième est une colonne basée sur 1.

Essayez-le en ligne!

Explication

[lBB]   % Push [1 6 6]
i       % Input: row number (0-based)
:"      % Repeat that many times
  TT    %   Push [1 1]
  Y+    %   Convolution, increasing size. This computes the sum of overlapping
        %   pairs, including the endpoints. So for example [1 6 6] becomes
        %   [1 7 12 6], which will later become [1 8 19 18 6], ...
]       % End
i       % Input: column number (1-based)
)       % Use as index. Implicit display

6

Pascal , 132 octets

function f(n,k:integer):integer;begin if k=1 then f:=1 else if k>n then f:=6*n else if k<0 then f:=0 else f:=f(n-1,k-1)+f(n-1,k)end;

Essayez-le en ligne!

1 indexé.


Le triangle de Pascal!
Henry

5

CJam , 22 18 octets

-4 octets grâce à Martin Ender

X6_]ri{0X$+.+}*ri=

L'entrée est (0-based row) (0-based column)

Essayez-le en ligne!

Explication

X6_]  e# Push the list [1 6 6]. This is the first row, but each row will have an extra 6 at
      e# the end, which is out of bounds.
ri    e# Push the first input as an integer.
{     e# The following block calculates the next row given a row on top of the stack:
 0X$+ e#  Copy the top list on the stack and prepend 0.
 .+   e#  Element-wise addition with the list before prepending 0. This adds each element of
      e#  with the one to its left, except the initial 1 gets added to 0 and the final number
      e#  gets added to the out-of-bounds 6. The out-of-bounds 6 is unchanged since one list
      e#  is longer.
}*    e# Run this block (row index) times.
ri=   e# Get the (column index)th item of the final list.

Une technique différente pour obtenir des sommes par paire est de déplacer une copie vers la gauche et de l'utiliser .+. Normalement, cela a le problème de conserver l'élément de fin sans le sommer (ce qui coûte des octets à supprimer), mais dans ce cas, cela économise réellement des octets, car vous n'avez pas besoin d'ajouter un 6à chaque itération. Vous pouvez économiser encore plus d'octets, car le décalage vers la gauche est gratuit si vous ajoutez uniquement 0un à une copie:X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+au lieu de 0X$+c'est le même nombre d'octets si vous préférez.
Martin Ender

@MartinEnder Oh je vois, vous obtenez un 6 supplémentaire à la fin de chaque ligne qui est hors limites donc cela n'a pas d'importance. Intelligent, merci.
Business Cat

4

C #, 157 octets

using System.Linq;(b,c)=>{var f=new[]{1,6};for(;c>0;c--){int s=f.Length;f=new int[s+1].Select((e,i)=>i<1?1:i==s?f[s-1]+6:f[i-1]+f[i]).ToArray();}return f[b];

Essayez-le en ligne


3

Python 2 , 67 octets

a,b=input()
x=[1,6]
exec"x=map(sum,zip([0]+x,x+[6]));"*a
print x[b]

Essayez-le en ligne!

Approche par force brute, calculez la ae ligne, puis imprimez le be nombre, les deux entrées sont basées sur 0


3

Python 3 , 64 60 52 octets

f=lambda r,c:c<2or c>r and r*6or f(r-1,c-1)+f(r-1,c)

Essayez-le en ligne!

Solution récursive utilisant 1-indexation. Sorties "True" au lieu de 1 pour le golf.


Grâce à:

  • @totallyhuman pour économiser 4 octets!
  • @Rod pour économiser 8 octets!


2
52 octets remplaçant le if / else par des opérateurs booléens et avec une sortie plus flexible
Rod

@Rod, c'est une solution brillante. J'essaie toujours de comprendre pourquoi cela fonctionne. Je suis encore assez nouveau ici (ce n'est que ma deuxième réponse sur le site), donc je ne suis pas sûr du protocole: dois-je inclure votre révision dans ma réponse même si vous êtes passé de Python 3 à 2?
Chase Vogeli

3
@icosahedron la version python n'est pas pertinente dans ce cas, donc vous n'avez pas à vous en préoccuper. généralement, le basculement entre les versions de python pour exploiter les fonctionnalités est considéré comme OK.
Uriel

@Uriel merci pour la clarification.
Chase Vogeli


1

Mathematica, 32 octets

b=Binomial;b[#,#2-1]6+b[#-1,#2]&

contribution

[ligne, colonne]
[1 indexé, 0 indexé]


1

JavaScript (ES6), 38 octets

f=(r,c)=>c?r>c?f(--r,c)+f(r,--c):r*6:1

Se bloque pour les colonnes négatives et renvoie des multiples de six pour les lignes négatives ou les colonnes trop volumineuses.


1

C # (.NET Core) , 44 octets

f=(c,r)=>c<=1?1:c>r?6*r:f(c-1,r-1)+f(c,r-1);

Prend la colonne puis la ligne, toutes deux indexées sur 1. Peut prendre la ligne puis la colonne en échangeant les entrées: (r,c). Reviendra row * 6pour les coordonnées en dehors des limites sur la droite (ie column > row + 1), et 1pour les coordonnées en dehors des limites sur la gauche (ie column < 1).


1

PHP , 64 octets

fonction récursive

lignes 1 indexation colonnes 0 indexation

La sortie pour la ligne = 0 et la colonne = 0 est 0 comme dans la séquence OEIS

function f($r,$c){return$c-$r?$c?f($r-=1,$c-1)+f($r,$c):1:$r*6;}

Essayez-le en ligne!

PHP , 126 octets

lignes 1 indexation colonnes 0 indexation

La sortie pour la ligne = 0 et la colonne = 0 est 0 comme dans la séquence OEIS

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;)$t[+$r][$c]=$c<$r?$c?$t[$r-1][$c-1]+$t[$r-1][$c]:1:$r*6;echo$t[$r-1][$argv[2]];

Essayez-le en ligne!


0

R , 77 octets

Reduce(function(x,y)zoo::rollsum(c(0,x,6),2),double(scan()-1),c(1,6))[scan()]

Nécessite la zoobibliothèque; lit à partir de stdin (les entrées séparées par deux retours à la ligne) et renvoie la valeur, avec NApour les sélections hors limites.

Essayez-le en ligne!


0

Gelée , 13 octets

,"’U0¦c/x6,1S

Un lien monadique prenant une liste de [row, entry](0-indexation pour les entrées, 1-indexation pour les lignes), retournant la valeur.

Essayez-le en ligne!

Comment?

,"’U0¦c/x6,1S - Link: list of numbers, [row, entry]
  ’           - decrement     -> [row-1, entry-1]
 "            - zip with:
,             -   pair        -> [[row, row-1], [entry, entry-1]]
     ¦        - sparse application of:
   U          -   upend
    0         - for indexes: 0 -> [[row, row-1], [entry-1, entry]]
       /      - reduce by:
      c       -   choose       -> [(row choose entry-1), (row-1 choose entry)]
         6,1  - 6 paired with 1 = [6,1]
        x     - times        i.e. [a, a, a, a, a, a, a, b]
            S - sum            -> 6*(row choose entry-1) + (row-1 choose entry)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.