Triángulo de Clark

10

Ok, he estado en una patada triangular recientemente, así que aquí hay otra.

El Triángulo de Clark es un triángulo donde la entrada más a la izquierda de cada fila es 1 y las entradas más a la derecha están formadas por múltiplos de 6 que aumentan a medida que aumenta el número de fila. Aquí hay una visualización

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

Al igual que el Triángulo de Pascal, todas las demás entradas son la suma de los números en su esquina superior derecha y superior izquierda.

Aquí están las primeras filas rellenadas

          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

Tarea

Dado un número de fila (comenzando desde la parte superior) y un número de columna (comenzando desde el primer elemento distinto de cero en esa fila), se genera el valor en esa celda particular. Ambas entradas pueden estar indexadas en 1 o 0 (puede mezclar y combinar si lo desea). Fuera de los límites del triángulo no está definido y puede hacer lo que desee cuando se le pregunte por estos valores.

Este es el , el objetivo es minimizar el número de bytes en su solución.

OEIS A046902

Ad Hoc Garf Hunter
fuente
1
¿Podemos construir una solución con cero en la primera fila? como en la secuencia OEIS
Jörg Hülsermann
1
@ JörgHülsermann Dado que eso está fuera del alcance del triángulo definido aquí, puede hacer lo que quiera.
Ad Hoc Garf Hunter

Respuestas:

7

MATL , 15 bytes

[lBB]i:"TTY+]i)

La primera entrada es una fila basada en 0; el segundo es una columna basada en 1.

Pruébalo en línea!

Explicación

[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
Luis Mendo
fuente
6

Pascal , 132 bytes

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;

Pruébalo en línea!

1 indexado.

Uriel
fuente
El triángulo de Pascal!
Henry
5

CJam , 22 18 bytes

-4 bytes gracias a Martin Ender

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

La entrada es (0-based row) (0-based column)

Pruébalo en línea!

Explicación

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.
Gato de negocios
fuente
Una técnica diferente para obtener sumas por pares es desplazar una copia hacia la izquierda y usarla .+. Normalmente eso tiene el problema de que retiene el elemento final sin sumarlo (lo que cuesta eliminar bytes), pero en este caso eso realmente guarda bytes porque no es necesario agregar un 6en cada iteración. Usted puede ahorrar aún más bytes porque el cambio izquierda es libre si solo precedidos 0de una copia:X6_]ri{0X$+.+}*ri=
Martin Ender
_0\+en lugar de 0X$+es el mismo número de bytes si lo prefiere.
Martin Ender
@MartinEnder Oh, ya veo, obtienes un 6 extra al final de cada fila que está fuera de límites, así que no importa. Inteligente, gracias.
Business Cat
4

C #, 157 bytes

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

Pruébalo en línea

LiefdeWen
fuente
3

Python 2 , 67 bytes

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

Pruébalo en línea!

Enfoque de fuerza bruta, calcule la afila th y luego imprima el bnúmero th, ambas entradas están basadas en 0

varilla
fuente
3

Python 3 , 64 60 52 bytes

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

Pruébalo en línea!

Solución recursiva con indexación 1. Salidas "True" en lugar de 1 por el bien del golf.


Gracias a:

  • @totallyhuman para guardar 4 bytes!
  • @ Rod para guardar 8 bytes!
Chase Vogeli
fuente
2
60 bytes
totalmente humano
2
52 bytes reemplazando el if / else con operadores booleanos y con una salida más flexible
Rod
@ Rod, esta es una solución brillante. Todavía estoy tratando de entender por qué funciona. Todavía soy bastante nuevo aquí (esta es solo mi segunda respuesta en el sitio), así que no estoy seguro sobre el protocolo: ¿debería incluir su revisión en mi respuesta a pesar de que cambió de Python 3 a 2?
Chase Vogeli
3
@icosahedron la versión de python es irrelevante en ese caso, por lo que no tiene que preocuparse. en general, cambiar entre versiones de Python para explotar características se considera correcto.
Uriel
@Uriel gracias por la aclaración.
Chase Vogeli
2

Haskell , 41 bytes

n#1=1
n#m|m>n=6*n
n#m=(n-1)#(m-1)+(n-1)#m

Pruébalo en línea!

Llame usando n # mwhere nes el número de fila y mel número de columna, ambos indexados en 1.

Julian Wolf
fuente
1

Mathematica, 32 bytes

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

entrada

[fila, columna]
[1 indexado, 0 indexado]

J42161217
fuente
1

JavaScript (ES6), 38 bytes

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

Se bloquea para columnas negativas y devuelve múltiplos de seis para filas negativas o columnas demasiado grandes.

Neil
fuente
1

C # (.NET Core) , 44 bytes

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

Toma la columna y luego la fila, ambas indexadas en 1. Puede tomar a continuación la columna fila mediante el canje de las entradas: (r,c). Volverá row * 6para coordenadas fuera de los límites a la derecha (es decir column > row + 1), y 1para coordenadas fuera de los límites a la izquierda (es decir column < 1).

Kamil Drakari
fuente
1

PHP , 64 bytes

función recursiva

filas 1-indexación columnas 0-indexación

La salida para fila = 0 y columna = 0 es 0 como en la secuencia OEIS

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

Pruébalo en línea!

PHP , 126 bytes

filas 1-indexación columnas 0-indexación

La salida para fila = 0 y columna = 0 es 0 como en la secuencia 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]];

Pruébalo en línea!

Jörg Hülsermann
fuente
0

R , 77 bytes

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

Requiere la zoobiblioteca; lee desde stdin (las entradas separadas por dos líneas nuevas) y devuelve el valor, con selecciones NAfuera de límites.

Pruébalo en línea!

Giuseppe
fuente
0

Jalea , 13 bytes

,"’U0¦c/x6,1S

Un enlace monádico que toma una lista de [row, entry](indexación 0 para entradas, indexación 1 para filas), que devuelve el valor.

Pruébalo en línea!

¿Cómo?

,"’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)
Jonathan Allan
fuente