Gere o triângulo de Pascal


35

O triângulo de Pascal é gerado começando com 1 na primeira linha. Nas linhas subseqüentes, o número é determinado pela soma dos dois números diretamente acima, à esquerda e à direita.

Para demonstrar, aqui estão as 5 primeiras linhas do triângulo de Pascal:

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

O desafio

Dada a entrada n (desde que seja mais conveniente no idioma escolhido), gere as primeiras n linhas do triângulo de Pascal. Você pode assumir que n é um número inteiro inclusive entre 1 e 25. Deve haver uma quebra de linha entre cada linha e um espaço entre cada número, mas, além disso, você pode formatá-lo como quiser.

Isso é código-golfe , então a solução mais curta vence.

Exemplo de E / S

> 1
1
> 9
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

NB Em certo sentido isso é uma versão simplificada da distribuição das bolas
Peter Taylor

@ Peter Olson: Qual é a sua opinião sobre a interpretação de ratchet freak de "você pode formatá-lo como quiser"? Se eu seguisse sua interpretação, poderia barbear 18 caracteres.
Steven Rumbalski

@StevenRumbalski Ele está bem. Há uma nova linha entre cada linha e há um espaço entre cada número, portanto, ele atende aos critérios.
Peter Olson

@ Peter Olson: Obrigado pelo esclarecimento. E a suposição de Tomas T de que n já está definido?
Steven Rumbalski 21/10

4
@ Gaffi Provavelmente não, aceitar uma resposta me faz sentir que estou terminando o concurso e desencorajando respostas novas e possivelmente melhores.
8118 Peter Olson

Respostas:


30

J , 12 caracteres

":@(!{:)\@i.

   i.5
0 1 2 3 4
   {: i.5
4
   (i.5)! {: i.5
1 4 6 4 1
   (! {:) i.5
1 4 6 4 1
   (! {:) \ i.5
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
   ": @ (! {:) \ i.5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
   (": @ (! {:) \ @ i.)` `'
+ ---------------------------------- +
| + - + ------------------------------ + |
|| @ | + ------------------------- + - + ||
|| || + - + --------------------- + | i. |||
|| ||| \ | + ------------------- + || |||
|| ||| || + - + --------------- + ||| |||
|| ||| ||| @ | + - + ---------- + |||| |||
|| ||| ||| || ": | + - + ------ + ||||| |||
|| ||| ||| || || 2 | + - + - + |||||| |||
|| ||| ||| || || ||! | {: ||||||| |||
|| ||| ||| || || | + - + - + |||||| |||
|| ||| ||| || | + - + ------ + ||||| |||
|| ||| ||| | + - + ---------- + |||| |||
|| ||| || + - + --------------- + ||| |||
|| ||| | + ------------------- + || |||
|| || + - + --------------------- + | |||
|| | + ------------------------- + - + ||
| + - + ------------------------------ + |
+ ---------------------------------- +

1
J vence o GolfScript? Interessante. Gostaria de ver uma explicação para esse código, se você tiver tempo.
Mr.Wizard

4
Já está dividido, mas aqui está uma linha por linha, se você quiser um inglês adicional. A linha 1 i.5retorna os cinco primeiros naturais. A linha 2 adiciona {:"Tail" (último retorno). A linha 3 os combina com !"Fora de" (número de combinações). A linha 4 (!{:)i.5é a mesma. fatorando o gancho para fora. O mesmo (!:)acontece com uma operação que transforma os primeiros n naturais na enésima linha do triângulo de Pascal. A linha 5 aplica-o a todos os prefixos (barra invertida) de 0..4, mas J preenche os pontos não utilizados com 0, para que a operação seja combinada ( @) com a operação de formatação de string ":. J muito legal, votado.
JB

@JB não é! significa fatorial aqui? Também podemos nos livrar do @ à direita.
defhlt

@ArtemIce Monadic !significa fatorial; !combinações de contagem diádica . A final @em ":@(!{:)\@i.está ali apenas para fazer deste um verbo stand-alone.
ephemient 15/08/12

18

Python, 56 bytes

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

Uso da amostra:

echo 9 | python filename.py

Produz:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

1
+1 Maneira inteligente de usar execevitar um forloop.
Steven Rumbalski 23/11

15

Python, 94 91 88 70 63 caracteres

x=[1]
for i in input()*x:
 print x
 x=map(sum,zip([0]+x,x+[0]))

14

Mathematica: 36 (41?)


O Mathematica tem a Binomialfunção, mas isso tira a diversão disso. Eu proponho:

NestList[{0,##}+{##,0}&@@#&,{1},n-1]

A linha acima renderizará uma matriz irregular, como:

{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1},
 {1, 5, 10, 10, 5, 1}, {1, 6, 15, 20, 15, 6, 1}}

Como este é um formato básico no Mathematica, pensei que seria aceitável, mas, ao ler as regras novamente, acho que pode não ser. A adição Grid@produzirá uma saída inequivocamente aceitável, com um total de 41 caracteres:

Grid@NestList[{0,##}+{##,0}&@@#&,{1},n-1]

n = 6:

1                       
1   1                   
1   2   1               
1   3   3   1           
1   4   6   4   1       
1   5   10  10  5   1   
1   6   15  20  15  6   1

14

C, 522

Uma resposta C auto-demonstrativa. Não poderia ser mais claro! Pontos de bônus por encontrar o personagem extra.

#define returns return 0
#define fr for
#define twentyonechexpressis0 0
                                                                                i
                                                                               , x
                                                                              [ 52 ]
                                                                            [ 52] ,j, y
                                                                       ; main (c){fr (;i< c
                                                                    ; i++){ x[i][i]=x[ i][0]= 1
                                                         ; }for(i =2;i<c;i++){for (j=1;j<i;j++){x [i][j] =
                                    1 +x[i][j ]+x[i-1][j-1]+x[i-1] [j]+1-1+1-1+1-1+1-1+1-1+111-11- twentyonechexpressis0 -100-1; }
} ;for(i=0 ;i<c;i++){for(j=0;j<=i;j++){ printf("%3d%c",x[i][j],(1+1+1+1)*(1+1+1+1+1+1+1+1)) ;}putchar(1+1+(1<<1+1)+1+1+1+1+1+111111-111111-1);} /*thiscomment_takes28chars*/ returns; }

4
Não posso deixar de sentir que isso não leva ao ponto do código de golfe. (Também não posso deixar de salientar que o caractere extra está na posição \ binom {5} {4}).
Peter Taylor

2
Foi divertido escrever. Geralmente é para isso que eu venho para o codegolf.
walpen

1
Inteligente :) Tenha um voto positivo. Talvez não seja um candidato vencedor, mas um candidato criativo!
Accatyyc

11

Golfscript (21 caracteres)

~]({0\{.@+\}/;1].p}*;

Como uma explicação foi solicitada:

# Stack contains 'n'
~](
# Stack: [] n
{
    # prev_row is [\binom{i,0} ... \binom{i,i}]
    # We loop to generate almost all of the next row as
    #     [(\binom{i,-1} + \binom{i,0}) ... (\binom{i,i-1} + \binom{i,i})]
    # \binom{i,-1} is, of course, 0
    # Stack: prev_row
    0\
    # Stack: 0 prev_row
    {
        # Stack: ... \binom{i,j-1} \binom{i,j}
        .@+\
        # Stack: ... (\binom{i,j-1} + \binom{i,j}) \binom{i,j}
    }/
    # Stack: \binom{i+1,0} ... \binom{i+1,i} \binom{i,i}
    # unless it's the first time round, when we still have 0
    # so we need to pop and then push a 1 for \binom{i+1,i+1}
    ;1]
    # next_row
    .p
}*
# final_row
;


Você poderia fornecer algum pseudo-código ou explicação? Eu meio que entendo o que está acontecendo, mas não estou entendendo inteiramente a parte da troca.
Rob

Obrigado pela explicação detalhada e pela excelente resposta (+1), mas estou ainda mais confuso agora. A lógica (processo) não está correta.
10243 Rob

@MikeDtrick, houve um pequeno erro na explicação. Há também um ponto sutil que precisava ser explicado, mas que eu perdi porque faz tanto tempo desde que escrevi o código.
Peter Taylor

Ok, está começando a fazer sentido. Minha pergunta final é: o processo de impressão e execução funciona de cima para baixo ou de baixo para cima (1, 1 1, 1 2 1: de cima para baixo, 1 2 1, 1 1, 1: de baixo para cima)?
11483 Rob

7

Haskell, 94 92

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_(putStrLn.unwords.map show).(`take`f)

Saída:

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

Uma versão de 71 caracteres que não imprime um espaço entre cada número:

f=[1]:[zipWith(+)(0:x)x++[1]|x<-f]
main=readLn>>=mapM_ print.(`take`f)

Saída:

[1]
[1,1]
[1,2,1]
[1,3,3,1]

Você pode salvar um personagem usando em mapMvez de mapM_.
dfeuer 25/02

7

Scala, 81 78 72 70 caracteres

81 caracteres: primeira tentativa, copiado descaradamente da versão Python :)

var x=Seq(1)
for(i<-1 to args(0).toInt){println(x)
x=(0+:x,x:+0).zipped.map(_+_)}

Execute-o como um script ou diretamente no REPL.

Corte para 70 caracteres com algo surpreendentemente legível e idiomático:

Seq.iterate(Seq(1),readInt)(a=>(0+:a,a:+0).zipped.map(_+_))map println

Ou 72 70 caracteres com um método totalmente diferente:

0 to(readInt-1)map(i=>println(0 to i map(1 to i combinations(_)size)))

+ 1 para cópia descarada!
Steven Rumbalski 25/10

A última versão deve ser usada com cuidado para grandes valores de readInt, como 50.;)
usuário desconhecido

@userunknown presumivelmente É por isso que a questão especifica um limite máximo de 25 ...
Luigi Plinge

Não era uma crítica, apenas um aviso para os curiosos.
usuário desconhecido

6

Ruby: 51 49 46 caracteres

(Código de 45 caracteres + opção de linha de comando de 1 caractere)

p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}

Graças a:

  • jsvnm por sugerir uma alternativa para a troca de valor (2 caracteres)
  • GB para identificar uma variável não utilizada após melhorias anteriores (4 caracteres)

Exemplo de execução:

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 1
[1]

bash-4.4$ ruby -ne 'p=[];$_.to_i.times{n=0;p p.map!{|i|n+n=i}<<1}' <<< 9
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]

Experimente online!


1
você pode salvar 2 caracteres comp.map!{|i|(v=n)+n=i}
jsvnm

Ótimo, @jsvnm! Cara, quanto tempo eu combinei para encurtar essa parte. Obrigado.
manatwork

1
Talvez um pouco tarde, mas: por que usar a variável v?
GB

Boa captura, @GB! Isso foi deixado para trás na 1ª revisão , onde ... onde ... dó. Onde também era meio inútil. Eu acho que vem de uma tentativa anterior quando usado .map. Obrigado.
manatwork

5

JavaScript ( 90 85 83 81)

for(n=prompt(o=i='');i++<n;o+='\n')for(s=j=1;j<=i;s=s*(i-j)/j++)o+=s+' ';alert(o)

Demonstração: http://jsfiddle.net/tcRCS/3/

NOTA : Na prática, não funciona bem por cerca de n> 30, porque os números excedem o tipo de dados inteiro interno e se tornam números de ponto flutuante.


Editar 1 : 5 caracteres removido através da conversão whilepara fore combinando demonstrações

Editar 2 : mover a s=declaração para dentro fore salvar 2 caracteres

Editar 3 : combine o s=1,j=1inicializador s=j=1e economize 2 caracteres


Agradável! Você pode salvar mais um caractere, alterando "s = s * ..." para "s * = ..."
Derek Kurth 25/10

@DerekKurth: Eu pensava que quando eu estava fazendo otimizações pela primeira vez, mas isso atrapalharia a lógica, porque precisa ser s*(i-j)/j, não s*((i-j)/j).
Mellamokb 25/10/11

Hmm, tentei como s * = ... no jsfiddle e parecia funcionar. Talvez eu tenha feito algo errado, no entanto.
Drek Kurth

1
@DerekKurth: Tecnicamente é o mesmo, mas a idéia é que, se você multiplicar (i-j)antes de dividir j, não haverá necessidade de aritmética de ponto flutuante, porque os resultados sempre devem ser um número inteiro. Se você fizer((i-j)/j) primeiro, isso resultará em valores decimais, que podem ser uma fonte de erro e, no mínimo, exigirão código extra para arredondamento / truncamento. Você não começa a ver isso até chegar a aproximadamente n>11, e verá valores decimais na saída, ou seja,1 11 55 165 330 461.99999999999994 461.99999999999994...
mellamokb 25/10/11

Ah, isso faz sentido!
Drek Kurth

5

R, 39 caracteres

R parece ser a ferramenta certa para esta tarefa :-)

x=1;for(i in 1:n)x=c(print(x),0)+c(0,x)

3
Está faltando um dos requisitos: "Dada uma entrada n (desde que seja mais conveniente no idioma escolhido)"
Steven Rumbalski

@ Steven, "Dada uma entrada n" ... então posso assumir que né dada? Corrigi o código. Isso agora está bom?
Tomas

Pediram a Peter Olson que esclareça.
Steven Rumbalski

@StevenRumbalski Não acho que seja válido, a menos que seja necessário. Eu não sei R, então talvez o compilador faça com que variáveis ​​indefinidas solicitem uma entrada, por isso pode estar ok, mas se é como a maioria das outras linguagens nesse sentido, acho que não.
Peter Olson

1
Basicamente, ele ndeve ser fornecido a partir de uma fonte externa em tempo de execução e o aparelho para capturá-lo está incluído no seu programa. Normalmente, isso significa argumento de linha de comando, stdin ou arquivo. Por arquivo quase nunca é usado porque é invariavelmente maior que as outras duas opções.
Steven Rumbalski 24/10

5

em Q (25 caracteres / 20 com versão mais curta)

t:{(x-1) (p:{0+':x,0})\1}

Mais curta

t:{(x-1){0+':x,0}\1}

Uso da amostra:

q)t 4
1
1 1
1 2 1
1 3 3 1

Ou, alternativamente, 20 caracterest:{(x-1){0+':x,0}\1}
skeevey

Bom, mais curto que a solução GolfScript agora.
sinedcm

4

awk - 73 caracteres

implementação bastante direta:

{for(i=0;i<$1;++i)for(j=i;j>=0;)printf"%d%c",Y[j]+=i?Y[j-1]:1,j--?32:10}

amostra de execução:

% awk -f pascal.awk <<<10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

4

Perl, 52 , 49 caracteres

Editar: usando em sayvez deprint

map{@_=(1,map$_[$_-1]+$_[$_],1..@_);say"@_"}1..<>

4

Perl, 47 54 caracteres

$p=1;map{print"@{[split//,$p]}\n";$p*=11}1..<>

É preciso um número da linha de comando, mas não executa nenhuma verificação de erro.

Só percebi que só funciona até n = 4. Era algum código antigo que eu tinha no meu hd.

Isso funciona, porém:

map{@a=(1,map$a[$_-1]+=$a[$_],1..@a);print"@a\n"}a..n

n tem que ser inserido no script, ou seria um caractere a mais.



3

Perl, 77 caracteres

$o[0]=1;for(1..<>){$"=" ";for(1..$_){$n[$_]=$o[$_]+$o[$_-1]}@o=@n;print"@o
"}

Exemplo de entrada

5

Saída de exemplo

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

3

C, 132 127 caracteres

c[25][25],n,i,j;main(){for(scanf("%d",&n);i<n;i++)for(j=0;j<=i;j++)printf("%d%c",c[i][j]=j?c[i-1][j-1]+c[i-1][j]:1,i-j?32:10);}

3

Pascal: 216 192 caracteres

(Não é um concorrente real, apenas uma presença honorífica.)

var p:array[0..1,0..25]of LongInt;i,j,n,u:Word;begin
Read(n);u:=0;for i:=1to n do begin
p[1,1]:=1;for j:=1to i do begin
p[u,j]:=p[1-u,j-1]+p[1-u,j];Write(p[u,j],' ')end;u:=1-u;Writeln
end
end.

Exemplo de execução:

bash-4.2$ fpc pascal.pas 
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?

bash-4.2$ ./pascal <<< 1
1 

bash-4.2$ ./pascal <<< 9
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 

3

MATL , 10 bytes

Idioma criado após este desafio

1iq:"tTTY+

Experimente online!

1       % Push a 1. This will be the first row
iq:     % Take input n. Generate range [1,2,...,n-1]
"       % For each (that is, repeat n-1 times)
  t     %   Duplicate latest row
  TT    %   Push [1 1]
  Y+    %   Convolve latest row with [1 1] to produce next row
        % Implicitly end for each
        % Implicitly display stack contents

desastre não-competitivo, mas sagrado, nenhum dos envios anteriores (até J) conseguiu reduzi-lo a quanto Matl fez !!!
Abr001am

Tenho certeza Jelly ou 05AB1E seria mais curto embora :-)
Luis Mendo

2

D 134 128 caracteres

import std.stdio;void main(){int n,m;int[]l,k=[0,1];readf("%d",&n);foreach(i;0..n){writeln(l=k~0);k=[];foreach(e;l)k~=m+(m=e);}}

saída para 9 é

>9
[0, 1, 0]
[0, 1, 1, 0]
[0, 1, 2, 1, 0]
[0, 1, 3, 3, 1, 0]
[0, 1, 4, 6, 4, 1, 0]
[0, 1, 5, 10, 10, 5, 1, 0]
[0, 1, 6, 15, 20, 15, 6, 1, 0]
[0, 1, 7, 21, 35, 35, 21, 7, 1, 0]
[0, 1, 8, 28, 56, 70, 56, 28, 8, 1, 0]

aproveitando ao máximo "você pode formatá-lo como quiser"; existe um espaço entre cada número e uma quebra de linha

editar reposicionou a tarefa para fazer la barba de alguns caracteres


2

Scala, 131 caracteres

object P extends App{var x=List(1)
while(x.size<=args(0).toInt){println(x.mkString(" "))
x=(0+:x:+0).sliding(2).map(_.sum).toList}}

Pega a entrada da linha de comando.

Saída para n = 10:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

O que há com todos esses 0s :-)?
mellamokb

@mellamokb Pouco de reorganizar os fez ir embora e encurtou o código. :-)
Gareth

2

F♯ - 203 caracteres

Minha primeira tentativa de uma partida de golfe com código e a primeira tentativa de programação funcional. Provavelmente existe uma maneira óbvia de encurtar isso que ainda não descobri. Ele é compatível com o compilador F2010 do VS2010 (que tem o efeito de executar #light por padrão, diferente das versões anteriores) e também funciona no interpretador F♯. Aceita entrada via stdin. Gostaria que houvesse uma maneira melhor para a entrada / saída embora! Muitos personagens!

open System
let rec C r m =if r=0||m<=0||m>=r then 1 else C(r-1)m+C(r-1)(m-1)
for j = 0 to Convert.ToInt32(Console.ReadLine ()) do (
 [0..j]|>List.map(C j)|>List.iter(fun k->printf "%i " k)
 printf "\n")

2

Por que não há resposta aceita para esta pergunta?

VBA - 249 caracteres

Sub t(n)
ReDim a(1 To n,1 To n*2)
a(1,n)=1:y=vbCr:z=" ":d=z & 1 & z & y:For b=2 To n:For c=1 To n*2:x=a(b-1,c)
If c>1 Then a(b,c)=a(b-1,c-1)+x
If c<n*2 Then a(b,c)=a(b-1,c+1)+x
d=IIf(a(b,c)<>0,d & z & a(b,c) & z,d):Next:d=d & y:Next:MsgBox d
End Sub

2

postscript - 59 caracteres (63 se você contar -dn=para obter o número de linhas)

[1]n{dup ==[0 3 2 roll{dup 3 2 roll add exch}forall]}repeat

correr com

gs -q -dn=10 -dBATCH pascal.ps 

para obter

[1]
[1 1]
[1 2 1]
[1 3 3 1]
[1 4 6 4 1]
[1 5 10 10 5 1]
[1 6 15 20 15 6 1]
[1 7 21 35 35 21 7 1]
[1 8 28 56 70 56 28 8 1]
[1 9 36 84 126 126 84 36 9 1]

2

Mathematica 35 caracteres

Aqui está a maneira monótona e preguiçosa de cortar o triângulo de Pascal:

Table[n~Binomial~k,{n,0,5},{k,0,n}]

(* out *)
{{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 6, 4, 1}, {1, 5, 10, 10,5, 1}}

2

APL, 19 15 caracteres

Um pouco tarde para a festa, talvez?

{⍪{⍵!⍨⍳⍵+1}¨⍳⍵}

Não bate a entrada J, no entanto.

Isso pressupõe que a origem do índice ( ⎕IO) esteja definida como 0. Infelizmente, com uma origem de índice de 1, precisamos de 25 18 caracteres:

{⍪{⍵!⍨0,⍳⍵}¨1-⍨⍳⍵}

Existem dois s no código para expressar minha frustração.

Demo:

      {⍪{⍵!⍨⍳⍵+1}¨⍳⍵}5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

Explicações

Versão curta:

  • ⍳⍵(com uma origem de índice de 0) produz uma matriz dos números de 0 a ⍵-1inclusivo, onde é o argumento correto para a função.
  • ⍳⍵+1 gera todos os números de 0 a
  • {⍵!⍨⍳⍵+1}gera escolha kpara cada elemento kem ⍳⍵+1. O operador (comutação) alterna os argumentos para uma função, de modo que o argumento da direita se torne a esquerda e vice-versa.
  • {⍵!⍨⍳⍵+1}¨⍳⍵passa cada elemento ⍳⍵usando o ¨operador (each). O resultado é uma matriz unidimensional que contém o primeiro linhas do triângulo de Pascal.
  • A forma de um argumento pega um vetor unidimensional e o torna uma coluna em vez de uma linha. Cada linha do triângulo é colocada em sua própria linha.

Resposta longa:

  • Praticamente o mesmo que a outra versão, exceto que 1-⍨é colocado antes de um para replicar uma origem de índice 0.
  • 0,⍳⍵com uma origem de índice de 1 replica ⍳⍵+1com uma origem de índice de 0.

2

Maple, 46

seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1)

Uso:

> f:=n->seq(print(seq(binomial(i,k),k=0..i)),i=0..n-1);
> f(3)
    1
   1 1
  1 2 1

2

VBA, 162 142 102 80 bytes

Economizou 22 bytes graças a Taylor Scott.

Esta é uma pergunta antiga agora, mas vi uma solução mais curta para o VBA.

[B2].Resize([A1],[A1])="=IF(COLUMN()>ROW(),"""",IF(ROW()=2,1,IFERROR(A1+B1,1)))"

Isso deve ser executado na janela imediata. A entrada está na célula A1da planilha ativa. A saída está na planilha ativa, iniciando B2e usando, no entanto, muitas células são necessárias com base na entrada. A COLUMN()>ROW()verificação mantém o canto superior direito do triângulo em branco. A ROW()=2verificação faz o primeiro valor1 para iniciar o triângulo. Eu poderia ter mudado a saída para baixo e descartado esse teste, mas ele introduz muita saída estranha antes do triângulo real e não senti que estava no espírito do desafio.

Originalmente, publiquei um método muito mais complicado que calculava todos os valores com base em sua linha e coluna. Todo esse método, porém, é usar fórmulas na célula. Começo em B2para que eu possa fazer referência à linha acima dela sem #REF!erros. Em seguida, ele copia e cola a mesma fórmula ao longo de um bloco de culas n de largura e n altura. A entrada e a saída para são n=25assim:

Saída


Resposta muito legal, mas você pode jogar isso bastante. Convertendo Function p(r)para Sub p(r)uma vez que não têm valor de saída da função, removendo o espaço de debug.? c(n,k);e convertendo o multilinha if-then-elsedeclaração a uma única linha ( If k Then c=c(n-1,k-1)*n/k Else c=1) traz o byte de contagem regressiva para 130a minha contagem
Taylor Scott

@TaylorScott Thanks! Sou bastante novo no golfe e apenas um pouco menos novo na programação em geral. Contei 142 por causa das quebras de linha. Pelo que pude encontrar , é suposto contar.
Engenheiro Toast

Ah, você está certo, eu esqueci de contar minhas novas linhas e, ao que parece, pelo menos um outro truque de golfe For n=0 To...pode ser condensado para For n=0To...levar minha versão do código para Sub p(r):For n=0To r-1:For k=0To n:Debug.?c(n,k);:Next:Debug.?:Next:End Sub Function c(n,k):If k Then c=1 Else c=c(n-1,k-1)*n/k[char (10)] End Functioncom uma contagem de bytes de139
Taylor Scott

Um segundo olhar para isto sugere que se você dividi-la em uma função de janela de imediato com uma função auxiliar, você pode obtê-lo para baixo para 112 Bytes (Janela Immediate Function: For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:NextAjudante Função: Function c(n,k) If k Then c=c(n-1,k-1)*n/k Else c=1 End Function)
Taylor Scott

1
@TaylorScott Que tal deixá-los inteiramente? Com uma mudança na fórmula, funciona muito bem. Eu acho que a saída começando em B2vez de A1é aceitável.
Engineer Toast

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.