Dado um número N
, como posso imprimir uma árvore de Natal de altura N
usando o menor número de caracteres de código? N
é assumido restrito a um valor mínimo de 3
e um valor máximo de 30
(limites e verificação de erros não são necessários). N
é fornecido como o único argumento de linha de comando para seu programa ou script.
Todos os idiomas são apreciados, se você vir um idioma já implementado e poderá reduzi-lo, edite-o se possível - comente de outra forma e espere que alguém limpe a bagunça. Inclua novas linhas e Espaços em branco para maior clareza, mas não as inclua na contagem de caracteres.
Uma árvore de Natal é gerada como tal, com seu "tronco" consistindo apenas de um "*" centralizado
N = 3:
*
***
*****
*
N = 4:
*
***
*****
*******
*
N = 5:
*
***
*****
*******
*********
*
N define a altura dos galhos, sem incluir o tronco de uma linha.
Feliz Natal PPCG!
c=:[:((\:i.@#),}.)"1[:$&'*'"0[:>:0,~i.
Brainfuck, 240 caracteres
Ainda não está pronto. Funciona, mas apenas com números de um dígito.EDIT: Feito! Funciona para intérpretes usando 0 como EOF. Veja
NOTE
s na fonte comentada para aqueles com -1.EDITAR novamente: devo observar que, como o Brainfuck não possui um método padrão para ler argumentos de linha de comando, usei stdin (entrada padrão). ASCII, é claro.
EDITE uma terceira vez: Oh, querida, parece que eu retirei
.
os caracteres (de saída) ao condensar o código. Fixo...Aqui está o gerenciamento básico de memória do loop principal. Tenho certeza de que pode ser altamente otimizado para reduzir a contagem de caracteres em 30 ou mais.
Versão condensada:
E a versão bonita:
fonte
Perl, 50 caracteres
(1 espaços relevantes)
perl: versão de uma linha:
e agora com mais espaço em branco:
Explicação expandida para usuários não-Perl.
fonte
Idioma: Python (através do shell), Contagem de caracteres: 64 (2 espaços significativos)
fonte
x86 asm de 16 bits, 50 bytes
Ainda não há uma versão de montagem? :)
(Nota: N está limitado a 1 - 9 nesta versão)
Baixe aqui
fonte
Idioma: Script em lote do Windows ( chocante! )
fonte
setlocal enabledelayedexpansion
comandoRuby, 64 bytes
Feliz Natal a todos!
Edit: Melhorias adicionadas como sugerido por Joshua Swink
fonte
n=$*[0].to_i;puts [*1..n,1].map{|i|" "*(n-i)+"*"*(2*i-1)}
traz-lo para 58.Idioma: C #, Contagem de caracteres: 120
Apenas o código, sem formatação (120 caracteres):
Versão com 109 caracteres (apenas o código):
Resultado da altura = 10:
fonte
Idioma: dc (através do shell) Contagem de caracteres: 83
Uma versão dc um pouco mais curta:
EDIT: mudou a constante 10 para $ 1
fonte
python, truque "-c" ... @ 61 caracteres (e uma linha)
fonte
Aqui está uma versão Haskell razoavelmente eficiente em termos de espaço, com 107 caracteres:
executando:
Feliz Natal, todos :)
fonte
Idioma: dc (através do shell), Contagem de caracteres: 119 (1 espaço significativo)
Apenas pela obscuridade :)
fonte
Melhor C ++, cerca de 210 caracteres:
Minimizado para 179:
fonte
Idioma: python, sem truques, 78 caracteres
fonte
Groovy 62B
_
fonte
Melhorando a resposta de ΤΖΩΤΖΙΟΥ. Não posso comentar, então aqui está um novo post. 72 caracteres.
Usando o truque "python -c", 61 caracteres.
Aprendi a função central e que "python -c" pode aceitar mais de um código de linha. Obrigado ΤΖΩΤΖΙΟΥ.
fonte
C # usando Linq:
170 charcters.
fonte
AWK, 86 caracteres em uma linha.
fonte
Idioma: Java, Número de caracteres: 219
Para referência, consegui depilar a solução Java anterior, usando recursão, até 231 caracteres, do mínimo anterior de 269. Embora um pouco mais, eu gosto dessa solução porque
T
é realmente orientada a objetos. Você pode criar uma pequena floresta deT
instâncias de tamanho aleatório . Aqui está a evolução mais recente dessa abordagem:fonte
class T{public static void main(String[]v){long n=new Long(v[0]),r=1,s;String o="";for(;r<=n;r++){for(s=n-r;s-->0;)o+=' ';for(;++s<2*r;)o+='*';o+="\n";}while(n-->1)o+=' ';System.out.println(o+"*");}}
(199 caracteres / bytes)Idioma: PowerShell, Número de caracteres: 41 (incluindo 1 espaço)
fonte
21 caracteres com APL dyalog.
⍳ fornece um vetor de números inteiros começando com 1.
1, ⍨ adiciona um ao final do vetor. Este será o pé da árvore.
'*' \ ¨⍨ fornece um vetor de * -strings com comprimentos dados pelo vetor anterior.
↑ transforma o vetor em uma matriz e adiciona espaços à direita.
m ← armazena a matriz em m.
0 1 ↓ descarta zero linhas e a primeira coluna.
⌽ inverte a matriz.
m, ⍨ concatena com m no lado direito.
fonte
m,⍨⌽0 1↓m←
->(⌽,0 1↓⊢)
Idioma: C, Char charter: 133
Melhoria da versão C.
Funciona e até leva a altura da árvore como argumento. Precisa de um compilador que tolere código no estilo K&R.
Eu me sinto tão sujo agora .. Esse código é feio.
fonte
R (62 bytes)
Ainda não vi a solução R. Corrija-me se eu perdi.
Resultado:
fonte
Idioma: C, Número de caracteres: 176 (2 espaços relevantes)
fonte
Versão do shell, 134 caracteres:
fonte
Idioma: Python, Contagem significativa de caracteres: 90
É feio, mas funciona:
...
fonte
Como esta é uma CW: não gosto que o código de golfe seja sempre organizado em termos de "número de caracteres" ou algo assim. Eles não poderiam ser organizados em termos de número de instruções para o compilador / intérprete (ou algum critério semelhante)? Aqui está a solução Ruby novamente , e é basicamente a mesma, mas agora também para consumo humano:
fonte
Carvão , 9 bytes (não competitivo)
Experimente online!
Verbose
Experimente online!
fonte
Gelatina , 12 bytes
Experimente online!
fonte
PHP, 111 caracteres
(O último caractere deve ser uma nova linha.)
Versão legível:
fonte