> <> , 38 37 bytes
Maldito seja o caso de espaço duplo * sacode o peixe *.
<v&0
>i:84*=?v0(?;67*o&1&
\ &0o?&a/
Você pode experimentá-lo on-line (tudo o que você precisa fazer é fornecer informações através do campo próximo à parte inferior e pressionar o Give
botão). Sugestões para mais golfe são sempre bem-vindas, especialmente idéias para remover esses espaços desnecessários na frente da segunda e terceira linhas.
Se você tiver permissão para imprimir uma nova linha adicional para espaços extras, o código poderá ter 27 bytes :
>i:84*=?v0(?;67*o
^ oa<
Explicação
Nota: a ordem da explicação corresponderá à localização do ponteiro (por isso, se o código for explicado fora do que seria considerado pedido, é porque é a ordem na qual o ponteiro o executa).
Linha 1:
<v&0
< redirects flow leftward
0 pushes 0 onto the stack
& pops 0 and puts it in the register
v redirects flow downward
Linha 2:
>i:84*=?v0(?;67*o&1&
> redirects flow leftward
i: pushes input and then duplicates it
84* pushes 32 (the space character numerically)
=?v pops 32 and input and redirects flow downward if they're equal
0(?; pops input and terminates if input is less than 0*
67*o pushes 42 (asterisk) and prints it
&1& pushes register value and then puts 1 in the register
*in ><>, the command i returns -1 if no input is given
Linha 3:
NB Esta linha é inversa, portanto, leia da direita para a esquerda.
^ &0o?&a<
< redirects flow leftward
a pushes 10 (newline) onto the stack
o?& prints a newline if the register is not 0
&0 sets the register to 0
^ redirects flow upwards (back to the second line)
Basicamente, o teste do programa para garantir que a entrada (que é lida um caractere de cada vez) não seja um espaço e, em seguida, imprima um asterisco. Ele termina se não houver entrada (o valor de entrada é -1). Para garantir que não imprima novas linhas adicionais, ele usa o valor do registro, que define como 0 ou 1. Por causa da forma como eu o configuro, ele não se importa com os valores estranhos colocados na pilha (por exemplo, o valor do registro quando definido 1
após a impressão de um asterisco); eles permanecem na pilha quando o programa termina, mas não fazem nada.
Eu sei que pode ser um pouco confuso desde que eu usei 84*
e 67*
não " "
e "*"
respectivamente, mas isso foi porque eu não sentia vontade de colocar strings no programa por qualquer motivo.