Novamente inspirado por uma tarefa da Programação 101, aqui está outro desafio.
Entrada:
- Um número inteiro positivo
n >= 3
. (tem que ser impar)
Saída:
n
linhas de asteriscos, em que a primeira linha possuin
asteriscos e cada nova linha possui dois asteriscos a menos que a linha anterior. Até atingir 1 asterisco. A partir daí, toda nova linha possui dois asteriscos a mais que a linha anterior, até voltar aon
asterisco. Espaços ou algo parecido com espaços devem ser usados para alinhar os asteriscos, para que realmente pareça uma ampulheta.
Regras gerais:
- Novas linhas à direita são permitidas, mas não precisam ser usadas.
- recuo é uma obrigação.
- Isso é código-golfe, então a resposta mais curta em bytes vence.
- Como o curso é ministrado em C ++, estou ansioso para ver soluções em C ++.
Caso de teste (n = 5):
*****
***
*
***
*****
Respostas:
Carvão , 6 bytes
Simplesmente morto. Desenhe um G poli de
*
, com o comprimento lateral retirado de uma entrada N úmero, onde os lados ir para baixo e para a direita, horizontalmente para a esquerda, e para cima-e-direita:Em seguida, preencha automaticamente o contorno e preencha-o.
Experimente online!
fonte
Python 2, 57 bytes
Um programa completo. Vai linha por linha, imprimindo o número certo de asteriscos centralizados.
Uma função recursiva era mais longa (67 bytes):
ou
fonte
max
por umabs
, mas tudo o que tenho é oabs(n-1)+1
que é pior porque a adição requer parênteses'*'*-~abs(n-1)
, mas depois tem o mesmo comprimento que'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
61 bytes, mas ainda é mais longo. Mesmo com uma nova linha líder,def f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
ainda há 58 bytes ...center
. Nunca soube que existia até agora.V , 12 bytes
Experimente online!
Gosto de desafios como esse, porque mostro as vantagens da natureza 2D do V. Explicação. Primeiro, precisamos criar uma sequência de n asteriscos. Então, fazemos isso:
Como uma observação lateral, isso é diretamente equivalente ao
@ai*<esc>
no vim, e o registro@a
é pré-inicializado para "arg1". Isso torna a entrada numérica muito mais conveniente.Então, passamos o personagem à direita com
h
. Aqui está a parte divertida:Agora tecnicamente, esta última parte é
Como o comando indent é realmente
>>
. V pressupõe convenientemente que comandos incompletos se aplicam à linha atual e também preenche implicitamente o segundoò
caractere para loop.fonte
Metatemplates C ++, 186 bytes
Com a fórmula explícita da minha resposta C, os Metatemplates estão competindo!
Ungolfed:
uso:
não concorrente
Apenas por diversão:
Uso:
fonte
PowerShell v2 +, 54 bytes
Leva entrada
$n
(garantia de ser um número inteiro ímpar), constrói dois intervalos com$n..1
e2..$n
e encadeia-los juntos, em seguida, utilizaWhere-Object
a seleccionar apenas os ímpares com|?{$_%2}
. Aqueles são alimentados em um loop. A cada iteração, construímos o número apropriado de espaços, concatenados com o número apropriado de asteriscos. Essas seqüências são deixadas no pipeline e a saída via implícitaWrite-Output
insere novas linhas entre elas na conclusão do programa.Exemplos
fonte
Python, 78 bytes
Portanto, apenas com recuo:
Uso:
fonte
C,
114109 bytesungolfed:
Solução recursiva anterior:
fonte
JavaScript (ES6), 66 bytes
A idéia aqui é gerar cada ampulheta a partir da anterior: adicione um espaço no início de cada linha e inclua
n
asteriscos antes e depois .fonte
05AB1E ,
21201917 bytesEconomizou 2 bytes graças a carusocomputing
Experimente online!
Explicação
fonte
Ir"*"×.pRû
- Cheguei tão longe, cara pálida quando percebi o quão longe eu estava, vi que você tinha respondido, indo tentar aprender a iteração neste idioma agora usando este exemplo. Obrigado!;ƒ'*¹N·-×Nð×ì})û»
use o novo comando palindromize. -2 bytes.ÅÉ
e.c
provavelmente ainda não estavam disponíveis no momento em que você postou isso. :)MATL , 12 bytes
Experimente online!
Explicação
Isso faz uso da função de faixa simétrica adicionada recentemente .
fonte
PHP, 95 bytes
Em vez de armazenar as linhas em uma matriz e depois produzir tudo, o loop for desce até 1 e depois volta ao número original.
fonte
C ++ 11, 93 bytes
Ligeiramente não destruído:
Uso:
fonte
'\n'
com10
:)MATL , 20 bytes
Experimente online!
fonte
R, 77 bytes
Cria uma matriz de caracteres, que é impressa via
cat
,fill=n
garantindo que as linhas estejam alinhadas corretamente. Observe que os elementos são armazenados em uma matriz primeiro (ou seja, os dois primeiros elementos sãoM[1,1]
eM[2,1]
, nãoM[1,2]
).fonte
Java 7,
170 165164 bytesAgradecemos ao @Hypino por salvar 5 bytes.
Agradecemos a Kevin por economizar 1 byte.
fonte
s=
dos=s+"\n"
e mais 2 bytes mudandoreturn(n=--n-1)
parareturn(n=n-2)
um total de 4 bytes.String s="",c="",t="";
aString s,c,t=s=c="";
( -2 bytes ) ereturn(n=n-2)>=0?s+"\n"+c+c(n,++x)+
parareturn n-1>0?s+"\n"+c+c(n-2,++x)+
( -2 bytes novamente)n=n-2
->n-1>0
porque n deve ser usado em outro argumento de uma função.n
paran-2
nessa parte.return(n=n-2)>=0 ... n
ser alterado parareturn n-1>0 ... n-2
ainda é mais curto. PS: Você me agradeceu por salvar bytes, mas não alterou seu código em sua edição. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
sem at
( teste ideone - 133 bytes )PHP - 95 bytes
Salve um byte usando uma nova linha real em vez de uma
"\r"
fonte
Pitão, 22 bytes
Um programa que recebe a entrada de um número inteiro em STDIN e imprime o resultado.
Experimente online
Como funciona
fonte
C,
195191 bytesDeveria jogar golfe um pouco menor
Podemos testá-lo aqui em ideone
fonte
C, 79 bytes
Ele divide a variável de contagem regressiva
k
em índices de linha e coluna. Se o índice da coluna for 0 (último caractere em uma linha), ele emitirá um caractere de nova linha (10). Em seguida, ajusta os índices de linha e coluna para ficarem em torno do asterisco central. Então,abs(x) < abs(y)
é uma condição curta para gerar um espaço.fonte
Ruby,
5554 bytesfonte
?**n
trabalho; você não precisa do espaço lá.Java 7, 156 bytes
Relativamente simples. Mantém o controle de linhas com
n
, estrelas comj
, espaços coms
e direção comd
. Eu realmente só queria uma resposta Java não recursiva no quadro, mas não faz mal que também seja um pouco mais curto :)Com quebras de linha:
fonte
APL, 19 bytes
Teste:
Explicação:
fonte
1+
e usar um APL que possui⎕IO←0
.Haskell, 84 bytes
fonte
putStr
e você pode se livrar dofromEnum
como este .C (gcc) ,
8074 bytesObrigado roofcat por 6 bytes
Experimente online!
fonte
PowerShell ,
5450 bytesExperimente online!
fonte
PHP ,
10488 bytesExperimente online!
Isso não supera as pontuações mais baixas do PHP nesse desafio, mas é muito louco para eu jogar fora.Ok, então eu joguei agora que é a pontuação mais baixa (não por muito tempo) para o PHP nesse desafio, mas isso não muda o fato de que ainda é uma loucura.
fonte
Groovy, 66 bytes
Experimente: https://groovyconsole.appspot.com/script/5145735624392704
Explicado:
((n..1)+(2..n))
- Palindromize reverso para n[n,..,1,..,n]
.each{if(it%2>0){...}
- Iterar através de elementos ímpares.println(("*"*it).center(n))
- Centralize n estrelas e imprima cada uma na nova linha.fonte
.each
O código do bloco pode ser{it%2&&println(("*"*it).center(n))}
.PHP, 191 bytes
Corra como
php -f golf_hourglass.php 15
A idéia por trás disso é criar a metade superior (a parte antes do single
*
) e depois repetir a parte superior duas vezes, mas a segunda vez na ordem inversa.fonte
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
isso é melhor\n
por uma nova linha real para salvar um byte.Pyke,
2219 bytesExperimente aqui!
fonte
C, 117 bytes
Ungolfed
fonte