Triângulo de Clark


10

Ok, eu estive um pouco de pontapé em triângulo recentemente, então aqui está outro.

O triângulo de Clark é um triângulo em que a entrada mais à esquerda de cada linha é 1 e as entradas mais à direita são compostas de múltiplos de 6, que aumentam à medida que o número da linha aumenta. Aqui está uma visualização

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

Assim como o Triângulo de Pascal, todas as outras entradas são a soma dos números no canto superior direito e no canto superior esquerdo.

Aqui estão as primeiras linhas preenchidas

          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

Tarefa

Dado um número de linha (a partir do topo) e um número de coluna (a partir do primeiro item diferente de zero nessa linha) gera o valor nessa célula específica. Ambas as entradas podem ser indexadas 1 ou 0 (você pode misturar e combinar, se desejar). Fora dos limites do triângulo é indefinido e você pode fazer o que quiser ao consultar esses valores.

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

OEIS A046902


11
Podemos criar uma solução com zero na primeira linha? como na sequência OEIS
Jörg Hülsermann

11
@ JörgHülsermann Como isso está fora dos limites do triângulo definido aqui, você pode fazer o que quiser.
Ad Hoc Garf Hunter

Respostas:


7

MATL , 15 bytes

[lBB]i:"TTY+]i)

A primeira entrada é a linha baseada em 0; o segundo é a coluna baseada em 1.

Experimente online!

Explicação

[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


5

CJam , 22 18 bytes

-4 bytes graças a Martin Ender

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

Entrada é (0-based row) (0-based column)

Experimente online!

Explicação

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.

Uma técnica diferente para obter somas aos pares é mudar uma cópia para a esquerda e usá-la .+. Normalmente, o problema é que ele retém o elemento à direita sem somar (o que custa bytes para remover), mas nesse caso, ele realmente salva bytes, porque você não precisa adicionar um 6a cada iteração. Você pode salvar ainda mais bytes, porque o deslocamento para a esquerda é livre se você anexar apenas 0uma cópia a:X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+em vez de 0X$+é a mesma contagem de bytes, se você preferir.
Martin Ender

@MartinEnder Oh, eu vejo, você recebe 6 extras no final de cada linha que estão fora dos limites, então isso não importa. Inteligente, obrigado.
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];

Experimente online


3

Python 2 , 67 bytes

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

Experimente online!

Abordagem de força bruta, calcule a alinha th e imprima o bnúmero th, ambas as entradas são baseadas em 0


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)

Experimente online!

Solução recursiva usando 1 indexação. Saídas "True" em vez de 1 para o golfe.


Graças a:

  • @totallyhuman por salvar 4 bytes!
  • @ Rod para economizar 8 bytes!


2
52 bytes substituindo a se / com mais operadores booleanos e com uma mais flexível de saída
Haste

@ Rod, esta é uma solução brilhante. Ainda estou tentando entender por que isso funciona. Ainda sou bastante novo aqui (esta é apenas a minha segunda resposta no site), por isso não tenho certeza do protocolo: devo incluir sua revisão na minha resposta mesmo que você tenha mudado do Python 3 para o 2?
Chase Vogeli

3
@icosahedron, a versão python é irrelevante nesse caso, então você não precisa se preocupar. geralmente, alternar entre versões python para explorar recursos é considerado bom.
Uriel

@ Uriel obrigado pelo esclarecimento.
Chase Vogeli


1

Mathematica, 32 bytes

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

entrada

[linha, coluna]
[indexado 1, indexado 0]


1

JavaScript (ES6), 38 bytes

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

Falha em colunas negativas e retorna múltiplos de seis para linhas negativas ou colunas excessivas.


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

Leva a coluna e a linha, ambas indexadas a 1. Pode tomar linha seguida coluna trocando as entradas: (r,c). Retornará row * 6para coordenadas fora dos limites à direita (ie column > row + 1) e 1para coordenadas fora dos limites à esquerda (ie column < 1).


1

PHP , 64 bytes

função recursiva

linhas 1-indexação colunas 0-indexação

A saída para a linha = 0 e a coluna = 0 é 0, como na sequência OEIS

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

Experimente online!

PHP , 126 bytes

linhas 1-indexação colunas 0-indexação

A saída para a linha = 0 e a coluna = 0 é 0, como na sequência 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]];

Experimente online!


0

R , 77 bytes

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

Requer a zoobiblioteca; lê stdin (as entradas separadas por duas novas linhas) e retorna o valor, com NAseleções fora dos limites.

Experimente online!


0

Gelatina , 13 bytes

,"’U0¦c/x6,1S

Um link monádico que obtém uma lista de [row, entry](indexação 0 para entradas, indexação 1 para linhas), retornando o valor.

Experimente online!

Como?

,"’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)
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.