> <> , 38 37 byte
Maledici la custodia del doppio spazio * scuote il pesce *.
<v&0
>i:84*=?v0(?;67*o&1&
\ &0o?&a/
Puoi provarlo online (tutto ciò che devi fare è dare input attraverso il campo in basso e quindi Give
premere il pulsante). I suggerimenti per l'ulteriore golf sono sempre ben accetti, in particolare idee per rimuovere quegli spazi dispendiosi di fronte alla seconda e terza linea.
Se ti fosse permesso di stampare una nuova riga aggiuntiva per spazi extra, il codice potrebbe essere di ben 27 byte :
>i:84*=?v0(?;67*o
^ oa<
Spiegazione
Nota: l'ordine della spiegazione corrisponderà alla posizione del puntatore (quindi se il codice viene spiegato in base a ciò che si considererebbe l'ordine, è perché è l'ordine in cui il puntatore lo esegue).
Linea 1:
<v&0
< redirects flow leftward
0 pushes 0 onto the stack
& pops 0 and puts it in the register
v redirects flow downward
Linea 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
Linea 3:
NB Questa riga va al contrario, quindi leggi da destra a sinistra.
^ &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)
Fondamentalmente, il test del programma per assicurarsi che l'input (che viene letto un carattere alla volta) non sia uno spazio e quindi stampa un asterisco. Termina se non è presente alcun input (il valore di input è -1). Per assicurarsi che non stampi nuove righe, utilizza il valore del registro, che imposta su 0 o 1. A causa del modo in cui l'ho impostato, non importa dei valori estranei inseriti nello stack (ad es. il valore del registro quando lo imposta 1
dopo aver stampato un asterisco); rimangono nello stack quando il programma termina ma non fanno nulla.
So che potrebbe essere un po 'confuso da quando l'ho usato 84*
e 67*
invece di " "
e "*"
, rispettivamente, ma era perché non avevo voglia di mettere le stringhe nel programma per qualsiasi motivo.