Imprimir número triângulo

25

Dado um número N, imprima um triângulo retângulo NxN, em que cada linha ié preenchida com números até i.

Exemplo

n = 0

(sem saída)

n = 4

1
1 2
1 2 3
1 2 3 4

n = 10

1
1 2
1 2 3
.
.
.
1 2 3 4 5 6 7 8 9 10

(não é necessário alinhamento)

n = N

1
1 2
1 2 3
.
.
.
1 2 3 4 .... N

Não há espaço à direita no final de cada linha.

O menor número de bytes vence e as brechas padrão não são permitidas.

Tan WS
fonte
A saída pode ser uma lista aninhada de números?
seequ
Qual deve ser o comportamento para n = 0 e para n> 9?
Freekvd
@ Sieg Claro, desde que a saída esteja correta.
Tan WS
@freekvd para 0 não há saída, para n> 9 não é necessária formatação especial
Tan WS
Ah, droga, você quebrou minha submissão. Corrigindo o mais rápido possível
Veja

Respostas:

17

Joe , 5 3 bytes (+2 ou +3 para -tsinalizador)

Bem, aparentemente eu não utilizei todo o potencial de Joe. Isso foi possível quando publiquei isso pela primeira vez.

\AR

Aqui, Rfornece o intervalo de 0 a n, exclusivo. Em seguida, \Atoma prefixos sucessivos ( Aé a função de identidade). Exemplos:

Com -tsinalizador (nota: agora é a saída padrão, mesmo sem o sinalizador):

   (\AR)5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR2
0
0 1
   \AR1
0
   \AR0

Sem ele:

   \AR5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   (\AR)5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   \AR2
[[0], [0, 1]]
   \AR1
[[0]]
   \AR0
[]

As regras mudaram um pouco. Meu código antigo não se comportou corretamente com N = 0. Além disso, agora a saída pode ser apenas uma lista aninhada e -tpode ser descartada.

1R1+R

Agora, Rnfornece um intervalo de 0 a n, exclusivo. Se for 0, ele retorna uma lista vazia. 1+adiciona 1 a cada elemento desse intervalo. 1Rmapeia os valores para intervalos de 1 a x. Liats vazios, quando mapeados, retornam listas vazias.

Exemplo de saída:

   1R1+R0
[]
   1R1+R5
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]

Atualização: Acabei de perceber algo. A função é mapeada automaticamente para classificar 0 elementos. O exemplo a seguir é executado com -tsinalizador.

   1R1+R3 5 8
1
1 2
1 2 3

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8

Antigo: 5 bytes (com a -tbandeira)

1R1R

Essa é uma função anônima que recebe um número, cria uma lista de 1 a N ( 1Rn) e mapeia esses valores para o intervalo anterior, fornecendo um intervalo de 1 a x para cada item do intervalo de 1 a N.

O -tsinalizador fornece a saída como uma tabela semelhante a J.

   1R1R5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Nota: o idioma é muito novo e não está completo, mas a versão mais recente foi lançada antes deste desafio.

seequ
fonte
4
Então J não foi suficiente para ter uma vantagem em desafios baseados em array? : D
Otimizador
4
@Optimizer A otimização é importante.
seequ
4
De repente, minha resposta mais votada é a que passei menos tempo. A injustiça.
seequ
1
Eu acho que Joe não é a sua média Joe ...
Justin
10

Python 3, 48 45 bytes

f=lambda n:n and[f(n-1),print(*range(1,n+1))]

Viva para efeitos colaterais.

Sp3000
fonte
2
Nada aninhado. Agora isso é distorcido.
seequ
Esse é um truque bacana: colocar a função antes printde executar os printem ordem inversa.
xnor
8

APL, 5

⍪⍳¨⍳⎕

cria um vetor 1..n e para cada elemento outro vetor.

Então ⍪ cria uma coluna com todos os vetores. Isso evita o problema de espaços em branco à direita.

Experimente em tryapl.org


Solução mais antiga:

{⎕←⍳⍵}¨⍳⎕

Cria um vetor 1..n

{⎕ ← ⍳⍵} é uma função que gera para cada elemento (¨) um vetor 1..n em uma linha separada

Infelizmente, este não pode ser experimentado em tryapl.org, porque ⎕ ← não funciona lá.

Moris Zucca
fonte
Não deve haver espaços à direita em nenhuma linha.
randomra 12/03/2015
ah obrigado, eu perdi essa. Corrigirá em breve
Moris Zucca
Eu sabia APL seria uma solução
Conor O'Brien
Oh Deus, quais são os meus olhos vendo
Codefun64
6

J, 27 bytes

J não é bom com saída numérica sem matriz. Esta função cria uma sequência de caracteres formatada corretamente a partir dos números.

   ;@(<@,&LF@":@:>:@:i.@>:@i.)

   (;@(<@,&LF@":@:>:@:i.@>:@i.)) 4
1
1 2
1 2 3
1 2 3 4

Experimente online aqui.

randomra
fonte
Você também pode usar ]\@i.para obter;@(<@,&LF@":@:>:@:]\@i.)
seequ
6

PHP, 53 bytes

Edit 2: Ismael Miguel sugeriu a leitura da entrada em vez de definir uma função, então a pontuação agora é de 53 bytes para o PHP:

for($a=1;@$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));

E mais uma vez, pode ser aprimorado se o PHP estiver configurado para ignorar erros (52 bytes):

for($a=1;$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));

Edit: Austin sugeriu uma versão de 60 bytes nos comentários:

function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}

O que pode ser melhorado se não exibirmos erros de PHP (59 bytes):

function f($n){for($a=1;$i++<$n;$a.=" ".($i+print"$a\n"));}

$aarmazena a próxima linha que será impressa e cada vez que ela é impressa, um espaço e o próximo número ( printsempre retorna 1) são concatenados.


Funções recursivas (65 bytes):

function f($n){$n>1&&f($n-1);echo implode(' ',range(1,$n))."\n";}
function f($n){$n>1&&f($n-1);for(;@$i++<$n;)echo$i,' ';echo"\n";}   // Using @ to hide notices.

Função recursiva mais curta, com o relatório de erros desativado (64 bytes):

function f($n){$n>1&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Função recursiva ainda mais curta, com o relatório de erros desativado e uma linha vazia antes da saída real (62 bytes):

function f($n){$n&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Apenas por diversão, funções não recursivas:

function f($n){for($i=0;$i<$n;print implode(' ',range(1,++$i))."\n");}    // 70 bytes
function f($n){for(;@$i<$n;print implode(' ',range(1,@++$i))."\n");}      // 68 bytes, hiding notices.
function f($n){for(;$i<$n;print implode(' ',range(1,++$i))."\n");}        // 66 bytes, error reporting disabled.
Benoit Esnard
fonte
2
45 bytes:for($a=1;@$i<$n;$a.=" ".(@++$i+print"$a\n"));
Austin
@ Austin: Eu li em um comentário que o código deve ser um programa completo de leitura de entrada ou uma função. Very nice truque, ela pode ser melhorada por um bit / byte: for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));(44 bytes)
Benoit Esnard
Ah ok, então suponho que você faria function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}, que é de 60 bytes.
Austin
De fato. Você concorda se eu editar minha resposta para adicionar sua solução?
Benoit Esnard
1
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));-> tentar isso (código completo, usando o parâmetro url ncom o número)
Ismael Miguel
5

CJam, 13 12 bytes

ri{),:)S*N}/

Como funciona :

ri{       }/     "Run the block input number of times with iteration index from 0 to N-1";
   )             "Increment the iteration index (making it 1 to N)";
    ,            "Get an array of 0 to iteration index";
     :)          "Increment each of the above array members by 1";
       S*        "Join all above array numbers with space";
         N       "Add a new line. After all iterations, things are automatically printed";

Experimente online aqui

Optimizer
fonte
4

Pitão, 9 bytes

VQjdr1hhN

Realmente pensei que isso pode ser feito mais curto, mas não parece.

Experimente online .

            Q = input()
VQ          For N in [0, 1, ..., Q-1]:
    r1hhN       create list [1, ..., N+1+1-1]
  jd            print joined with spaces
Jakube
fonte
1
Uma alternativa 9: VQaYhNjdY. Se apenas aretornasse a lista, algo como VQjdaYhNseria 8.
Sp3000 12/12/2015
2
ausado brevemente para retornar a lista anexada.
Optimizer
Eu não estou familiarizado com Pyth, então você poderia explicar por quê N+1+1-1?
seequ
1
@Sieg ré a função Python-range, portanto -1 ( r1Ncria a lista [1, 2, ..., N-1]). Mas na n-ésima iteração do loop, quero a lista e [1, 2, ..., N+1], portanto, preciso adicionar 2a N. r1hhNtraduz diretamente para range(1, N+1+1). Outra possibilidade seria r1+N2( range(1, N+2)).
Jakube 12/03
Ou até mhdhN, mas essa é uma abordagem completamente diferente.
Jakube 12/03
4

JavaScript (ES6) 49 52

Uma tarefa tão simples, gostaria de saber se isso pode ser reduzido em JS (atualização: sim, usando recursão)

Recursiva 49

f=n=>alert((r=w=>n-i++?w+'\n'+r(w+' '+i):w)(i=1))

Iteraive 52

f=n=>{for(o=r=i=1;i++<n;o+='\n'+r)r+=' '+i;alert(o)}
edc65
fonte
Onde posso testar isso? I cant parecem encontrar qualquer playgrounds ES6 que aceita isso
Kristoffer Sall-Storgaard
@ KristofferSall-Storgaard O Firefox suporta o ES6 como padrão. Então, Firefox Console.
Optimizer
4

Java, 85 84 bytes

Isso é surpreendentemente curto em Java.

void a(int a){String b="";for(int c=0;c++<a;System.out.println(b+=(c>1?" ":"")+c));}

Recuado:

void a(int a){
    String b="";
    for(int c=0;
        c++<a;
        System.out.println(
                b+=(c>1?" ":"")+c
        ));
}

1 byte graças ao Bigtoes / Geobits

O número um
fonte
Você pode salvar um movendo o b+=...para println(b+=...).
Geobits 12/03/2015
3

Prolog - 119

h(N):-setof(X,(between(1,N,K),setof(Y,between(1,K,Y),X)),[L]),k(L),nl,fail.
k([A|B]):-write(A),(B=[];write(" "),k(B)).
Furioso
fonte
3

Python 2 - 62 54 65 bytes

def f(n):
 for x in range(n):print' '.join(map(str,range(1,x+2)))
pepp
fonte
O número ndeve ser fornecido como entrada para o programa, não inicializado em uma variável.
`` Zgarb
Obrigado pela dica. Não tinha certeza disso.
pepp
2
Desculpe, eu deveria ter sido mais claro. O que eu quis dizer é que você deve realmente definir Nfazendo N=input()ou algo semelhante, para que seu programa possa ser executado como tal. Aqui está uma discussão meta sobre o tópico.
`` Zgarb
Então isso seria certo, certo?
pepp
Parece ser bom agora!
Zgarb 12/03/2015
3

J, 9 caracteres

Como um verbo tácito, monádico.

[:":\1+i.
  • i. y- os números de 0a y - 1.
  • 1 + i. y- os números de 1a y.
  • ": y- o vetor yrepresentado como uma string.
  • ":\ y- cada prefixo de yrepresentado como uma string.
  • ":\ 1 + i. y- cada prefixo dos números de 1para yrepresentado como uma matriz de caracteres.
FUZxxl
fonte
Agora isso é bastante inteligente. +1
veja
Isso é mais J-esque, mas não viola a regra de não haver espaços à direita em cada linha?
milhas
@miles De fato, sim! Qualquer outra coisa seria muito complicada.
FUZxxl
3

> <> (Peixe) , 40 37 + 3 = 40 bytes

&1>:&:&)?;1\
(?v:n" "o1+>}:{:@
ao\~1+

Mais uma vez,> <> decentemente se sai bem em outro exercício de impressão numérica. Corra com o -vsinalizador para entrada, por exemplo

py -3 fish.py -v 4

Explicação

&               Put n in register
1               Push 1 (call this "i")

[outer loop]

:&:&)?          If i > n...
;                 Halt
1                 Else push 1 (call this "j")

[inner loop]

}:{:@(?         If j > i...
~1+ao             Pop j, print newline, increment i and go to start of outer loop
:n" "o1+          Else print j, print a space, increment j and go to start of inner loop
Sp3000
fonte
3

C (sem loops, sim!) - 72 bytes

b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}

Isso cria uma função r(n)que pode ser usada desta maneira:

main(){ r(5); }

Veja em ação aqui em tutorialspoint.com

Requer alguns truques facilmente explicados. Eu acho que pode ser muito melhorado.

A. Breust
fonte
1
Na verdade, são 75 bytes, não 74. No entanto, você pode reduzi-lo para 72 bytes, substituindo '' por 32 e '\ n' por 10:b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}
FatalSleep
1
Muito bom truque, obrigado!
A. Breust
Obrigado! Eu fiz o meu melhor para você na categoria C, mas não pude reduzir nada! Então, decidi encurtar o seu.
FatalSleep
b(n,c){n&&b(n-1,32)^printf("%d%c",n,c);}r(n){n&&r(n-1)^b(n,10);} Wandbox de
o79y 22/01
2

Python 2-72

>>> def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
... 
>>> p(5)
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
Kasramvd
fonte
Para obter respostas neste site, você deve escrever um programa ou função completa. E você deve imprimir o resultado em stdout ou retorná-los de uma função. N deve ser lido da entrada ou tomado como parâmetro de função, não predefinido como variável.
jimmy23013
@ user23013 OK, corrigido!
Kasramvd 12/03/2015
A definição da função precisa ser incluída na contagem de bytes, por isso não acho que seja 61. Provavelmente, é do seu interesse chamar a função de algo curto, como p. Em outra nota, você pode remover dois espaços - um entre printe '\n'e o outro entre )))e for.
Sp3000 12/03/2015
@ Sp3000 OK, obrigado pela atenção! (resolvido !;)
Kasramvd
72:def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
12/03/15
2

Perl, 28

Lê o parâmetro de stdin.

@x=1..$_,print"@x
"for 1..<>

Na linha de comando:

perl -E'$,=$";say 1..$_ for 1..<>'

mas agora não sei como contar isso (provavelmente entre 25 e 29).

nutki
fonte
1

Python

import string
N,s=int(input()),list(string.digits)
for i in range(1,N+1):
    print(' '.join(s[1:i+1]))
bacchusbeale
fonte
1
Isso não falha se N> = 10?
seequ
@ Sieg Sim, você está certo. Eu apenas aprendendo Python, estava procurando uma maneira de converter lista de int para lista de strings.
22615 bacchusbeale
63 bytes: for i in range(int(input())):print(' '.join("123456789"[:i+1]))- Observe que as strings são tratadas como listas.
seequ
1

Golfscript 14

,{2+,1>' '*n}/

Espera que o número de entrada esteja presente na pilha.

Exemplo online: link

Cristian Lupascu
fonte
1

Clipe , 16

Jm[ijkw,1iwS},1n

Explicação

J                   .- join with newlines                           -.
 m[i        },1n    .- map numbers from 1 to numeric value of input -.
    jkw   wS        .- join with spaces                             -.
       ,1i          .- numbers from 1 to index                      -.
Ypnypn
fonte
1

Vai, 93 81 78 93 90 bytes

func r(n int)(s string){s=string(n+48);if n!=1{s=r(n-1)+" "+s};println(s);return}

Corrente sem golfe

func r(n int) (s string) {
    // Convert n to a string, we do not have to initialize s since
    // we hijacked the return value.
    // Numbers in the ascii table starts at 48
    s = string(n | 48)
    // Unless we are on our last iteration, we need previous iterations,
    // a space and our current iteration
    if n != 1 {
        // Collect the result of previous iteration for output
        s = r(n-1) + " " + s
    }
    println(s)
    // We can use a naked return since we specified the
    // name of our return value in the function signature
    return
}

Se precisarmos lidar com N> 9, podemos usar o seguinte em 78 bytes, no entanto, é necessário importar o fmtpacote.

func r(n int)(s string){s=Sprint(n);if n!=1{s=r(n-1)+" "+s};Println(s);return}

Se incluirmos a declaração de importação, agora estou de volta à minha inicial 93 92 90 bytes

import."fmt";func r(n int)(s string){s=Sprint(n);if n>1{s=r(n-1)+" "+s};Println(s);return}

Teste on-line aqui: http://play.golang.org/p/BWLQ9R6ilw

A versão com fmtestá aqui: http://play.golang.org/p/hQEkLvpiqt

Kristoffer Sall-Storgaard
fonte
Eu não sei como me sinto sobre o elenco de cordas, mas qualquer tentativa de transformá-lo em um array de bytes apenas torna mais
Kristoffer Sall-Storgaard
O principal problema que vejo é que ele não funciona para n> 9. Você pode salvar um byte, alterando !=para >, no entanto.
Geobits 12/03/2015
@Bigtoes, consertado agora, eu não sei se devo contar a importafirmação embora
Kristoffer Sall-Storgaard 12/15
Eu sei que eles são contados para os idiomas com os quais eu estou mais familiarizado, então provavelmente sim. É uma
merda
1

ZX / Sinclair BASIC - 39 bytes

O ZX Basic usa 1 byte por palavra-chave (todas as palavras em maiúsculas), portanto, ajuda a manter um pouco o tamanho do byte ...

1 INPUT n:FOR i=1 TO n:FOR j=1 TO i:PRINT j;" ";:NEXT j:PRINT:NEXT i

Usando n = 8

insira a descrição da imagem aqui

Brian
fonte
1
Agradável. Mas ZX usos básicos 6 bytes mais escondidos para cada literal numérico (um truque comum era VAL("1")(6 bytes como VAL é 1) insted de 1(7 bytes))
edc65
1

R, 28

for(i in 1:scan())print(1:i)
freekvd
fonte
A saída está incorreta para um valor de entrada igual a 0. Além disso, não está claro se o líder [1]em cada linha está violando as especificações.
Alex A.
@AlexA. se você olhar atentamente para a pergunta, verá meu comentário perguntando qual deve ser o comportamento para n = 0. Mas obrigado por me apontar na direção certa!
Freekvd 13/03/2015
Eu vi o comentário. O fato é que isso não imprime nada para 0, ele imprime 1; 1 0. (Pretend ;é uma quebra de linha.)
Alex A.
Você também pode querer considerar o uso cat(1:i,"\n"). Mesmo que seja um pouco mais longo que print(1:i)isso, não inclui um líder [1]em cada linha.
Alex A.
1

TI-Basic, 28 bytes

Input N
For(I,1,N
randIntNoRep(1,N->L1
SortA(L1
Disp L1
End
Timtech
fonte
1
Isso não sai como o formato indica; em vez disso, a matriz é exibida, colchetes e tudo, na tela inicial.
lirtosiast
1

C, 89 caracteres

// 90 characters
f(int n){int a=1,b;for(;n--;++a){for(b=0;b<a;++b)printf("%c%d",(!!b)*' ',b+1);puts("");}}

Para eliminar a confusão sobre puts("");. Isso simplesmente imprime um caractere de nova linha (como visto aqui ):

Observe que não apenas difere das entradas, pois usa stdout como destino, mas também adiciona um caractere de nova linha no final automaticamente (o que não é válido).

Fiquei um pouco mais curto com o algoritmo java do @TheBestOne:

// 89 characters
f(int a){char b[999]="",*p=b+1;int c=0;for(;a--&&(sprintf(b,"%s %d",b,++c)&&puts(p)););}
Felix Bytow
fonte
puts("");faz nada. Você pode usar em char b[999]=""vez de char b[999]={0}salvar 1 caractere.
mch 12/03
2
puts("");imprime um caractere de nova linha.
Felix Bytow
1

Perl: 34 caracteres

print"@$_\n"for map[1..$_],1..$_;

Este código obtém o número de entrada fornecido através da variável especial $_.

Felix Bytow
fonte
1
A maioria dos colchetes é redundante aqui: print"@$_\n"for map[1..$_],1..$_também funciona.
nutki
Eu ajustei o código.
Felix Bytow
1

C # - 94 bytes

Escrita como uma função anônima que retorna uma string, que não parece ser desaprovada pela especificação.

n=>String.Join("\n\n",Enumerable.Range(1,n).Select(l=>String.Join(" ",Enumerable.Range(1,l))))

Aqui está uma versão não destruída (os comentários são lidos em ordem BDCA):

n =>
    String.Join("\n\n",                    //...then join it together with newlines.
        Enumerable.Range(1, n).Select(l => //For each l from 1 to n, ...
                String.Join(" ",              //...and join it with spaces, ...
                    Enumerable.Range(1, l)    //...get the range from 1 to l, ...
LegionMammal978
fonte
1

Bash + coreutils, 26 bytes

seq $1|sed "x;G;s/\n/ /;h"
  • seq simplesmente gera os números de 1 a n
  • sed salva a saída inteira de uma determinada linha no espaço de espera e depois anexa a próxima linha a ela.
Trauma Digital
fonte
1

Haskell, 62 57 bytes

e=enumFromTo 1
f=putStr.unlines.map(unwords.map show.e).e

Estilo sem pontos. Exemplo de uso:

Prelude> f 5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
nimi
fonte
Fazendo e=enumFromTo 1economiza 7 bytes.
`` Zgarb
@ Zgarb: Obrigado, mas se eu trocar enumFromTo 1, também tenho que dar um nome à função principal, por isso são 5 bytes. Sem o nome, seria uma letconstrução:let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi
1

Mathematica, 32

Print@Row[Range@i," "]~Do~{i,#}&
alefalpha
fonte
1
Que tal TableForm[Range/@Range@#]&?
Martin Ender
1
Menor:Grid[Range/@Range@#]&
alephalpha
E até parece melhor. :) (Eu continuo esquecendo-se Grid.)
Martin Ender
Mas não tenho certeza se não há espaço à direita no final de cada linha.
precisa saber é o seguinte
Oh, bom argumento. :(
Martin Ender
1

Scala, 73 65 62 bytes

(n:Int)=>print(1 to n map(1 to _ mkString " ") mkString "\n")

Ungolfed

def printNumberTriangle(n: Int): Unit = {
  def rowString(m: Int): String = 1.to(m).mkString(" ")
  print(1.to(n).map(rowString).mkString("\n"))
}
Dave Swartz
fonte