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
code-golf
math
combinatorics
Peter Olson
fonte
fonte
Respostas:
J , 12 caracteres
fonte
i.5
retorna 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.!
significa fatorial;!
combinações de contagem diádica . A final@
em":@(!{:)\@i.
está ali apenas para fazer deste um verbo stand-alone.Python, 56 bytes
Uso da amostra:
Produz:
fonte
exec
evitar umfor
loop.Python,
9491887063 caracteresfonte
Mathematica: 36 (41?)
O Mathematica tem a
Binomial
função, mas isso tira a diversão disso. Eu proponho:A linha acima renderizará uma matriz irregular, como:
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:n = 6
:fonte
C, 522
Uma resposta C auto-demonstrativa. Não poderia ser mais claro! Pontos de bônus por encontrar o personagem extra.
fonte
Golfscript (21 caracteres)
Como uma explicação foi solicitada:
fonte
Haskell,
9492Saída:
Uma versão de 71 caracteres que não imprime um espaço entre cada número:
Saída:
fonte
mapM
vez demapM_
.Scala,
81787270 caracteres81 caracteres: primeira tentativa, copiado descaradamente da versão Python :)
Execute-o como um script ou diretamente no REPL.
Corte para 70 caracteres com algo surpreendentemente legível e idiomático:
Ou
7270 caracteres com um método totalmente diferente:fonte
Ruby:
514946 caracteres(Código de 45 caracteres + opção de linha de comando de 1 caractere)
Graças a:
Exemplo de execução:
Experimente online!
fonte
p.map!{|i|(v=n)+n=i}
.map
. Obrigado.JavaScript (
90858381)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
while
parafor
e combinando demonstraçõesEditar 2 : mover a
s=
declaração para dentrofor
e salvar 2 caracteresEditar 3 : combine o
s=1,j=1
inicializadors=j=1
e economize 2 caracteresfonte
s*(i-j)/j
, nãos*((i-j)/j)
.(i-j)
antes de dividirj
, 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 aproximadamenten>11
, e verá valores decimais na saída, ou seja,1 11 55 165 330 461.99999999999994 461.99999999999994...
R, 39 caracteres
R parece ser a ferramenta certa para esta tarefa :-)
fonte
n
é dada? Corrigi o código. Isso agora está bom?n
deve 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.em Q (25 caracteres / 20 com versão mais curta)
Mais curta
Uso da amostra:
fonte
t:{(x-1){0+':x,0}\1}
awk - 73 caracteres
implementação bastante direta:
amostra de execução:
fonte
Perl,
52, 49 caracteresEditar: usando em
say
vez deprint
fonte
Perl,
4754 caracteresÉ 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:
n tem que ser inserido no script, ou seria um caractere a mais.
fonte
Barril , 40 bytes
Explicado
fonte
Perl, 77 caracteres
Exemplo de entrada
Saída de exemplo
fonte
C,
132127 caracteresfonte
Pascal:
216192 caracteres(Não é um concorrente real, apenas uma presença honorífica.)
Exemplo de execução:
fonte
MATL , 10 bytes
Idioma criado após este desafio
Experimente online!
fonte
D
134128 caracteressaída para 9 é
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
l
a barba de alguns caracteresfonte
Scala, 131 caracteres
Pega a entrada da linha de comando.
Saída para n = 10:
fonte
0
s :-)?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!
fonte
Por que não há resposta aceita para esta pergunta?
VBA - 249 caracteres
fonte
postscript - 59 caracteres (63 se você contar
-dn=
para obter o número de linhas)correr com
para obter
fonte
Mathematica 35 caracteres
Aqui está a maneira monótona e preguiçosa de cortar o triângulo de Pascal:
fonte
APL,
1915 caracteresUm pouco tarde para a festa, talvez?
Não bate a entrada J, no entanto.
Isso pressupõe que a origem do índice (
⎕IO
) esteja definida como0
. Infelizmente, com uma origem de índice de1
, precisamos de2518 caracteres:Existem dois
⍨
s no código para expressar minha frustração.Demo:
Explicações
Versão curta:
⍳⍵
(com uma origem de índice de 0) produz uma matriz dos números de 0 a⍵-1
inclusivo, onde⍵
é o argumento correto para a função.⍳⍵+1
gera todos os números de 0 a⍵
{⍵!⍨⍳⍵+1}
gera⍵
escolhak
para cada elementok
em⍳⍵+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.⍪
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:
1-⍨
é colocado antes de um⍳
para replicar uma origem de índice 0.0,⍳⍵
com uma origem de índice de 1 replica⍳⍵+1
com uma origem de índice de 0.fonte
Maple, 46
Uso:
fonte
VBA,
16214210280 bytesEconomizou 22 bytes graças a Taylor Scott.
Esta é uma pergunta antiga agora, mas vi uma solução mais curta para o VBA.
Isso deve ser executado na janela imediata. A entrada está na célula
A1
da planilha ativa. A saída está na planilha ativa, iniciandoB2
e usando, no entanto, muitas células são necessárias com base na entrada. ACOLUMN()>ROW()
verificação mantém o canto superior direito do triângulo em branco. AROW()=2
verificaçã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
B2
para 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ãon=25
assim:fonte
Function p(r)
paraSub p(r)
uma vez que não têm valor de saída da função, removendo o espaço dedebug.? c(n,k);
e convertendo o multilinhaif-then-else
declaraçã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 para130
a minha contagemFor n=0 To...
pode ser condensado paraFor n=0To...
levar minha versão do código paraSub 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 Function
com uma contagem de bytes de139
For n=0To[A1-1]:For k=0To n:?c(n,k);:Next:?:Next
Ajudante Função:Function c(n,k)
If k Then c=c(n-1,k-1)*n/k Else c=1
End Function
)B2
vez deA1
é aceitável.05AB1E , 14 bytes
Experimente online!
fonte