VI, 108 byte
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>
<CR>è l' Enterictus, <C-?>corrisponde Control + ?, e <Esc>di Escapeovviamente. Ognuno di questi conta per 1 byte (vedi meta ). Le interruzioni di riga nella soluzione sono leggibili. <CR>Rappresenta solo Entertratti reali .
Ingresso
Il file di input deve contenere solo 1 carattere, che rappresenta n.
Lanciare
VI dovrebbe essere avviato come:
vi -u NONE input
spiegazioni
Ci sono 3 parti nella soluzione. Descriverò prima la seconda parte (seconda riga), poiché è la più semplice da spiegare.
Disegnare il sole
Il comando per disegnare il sole è:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Il sole deve essere disegnato con ,* , 0, 1e 3, in questo modo:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Una simmetria avrebbe contribuito a ridurre la dimensione dei byte di questa parte, ma non è così importante. Non spiegherò la linea completa, ma lo schema***** viene utilizzato per generare facilmente l'ultima riga e il pattern **1110333**è stato preso come riferimento per generare le altre 3 righe contenenti 0, 1e 3.
È importante da usare 0 , 1e 3per le parti del sole che possono essere riempiti (vedi il prossimo spiegazioni). Disegnare questo sole richiede 55 byte e probabilmente può essere giocato a golf con alcuni trucchi.
Riempiendo il sole secondo n
Per riempire correttamente il sole, le istruzioni da seguire sono:
- se
n = 0, quindi 0,1e3 (tutte le cifre) devono essere sostituiti con
- se
n = 1, quindi 1dovrebbe essere sostituito con , le altre cifre con*
- se
n = 2, quindi 0, 1e3 (tutte le cifre) devono essere sostituiti con*
- se
n = 3, quindi 3dovrebbe essere sostituito con , le altre cifre con*
- se
n = 4, quindi 0, 1e 3(tutte le cifre) devono essere sostituiti con (comen = 0 )
Da ciò, possiamo dedurre che le sostituzioni richieste sono:
- sostituire alcune cifre con
( prima sostituzione )
- sostituire tutte le altre cifre con
*( seconda sostituzione )
Nota che "alcune cifre" può significare "nessuna cifra" ( n = 2ad esempio). E "tutte le altre cifre" può anche rappresentare "nessuna cifra", se tutte le cifre sono già state sostituite dalla prima sostituzione ( n = 0ad esempio).
La seconda sostituzione può essere facilmente scritta in 11 byte :
:%s/\d/*/g<CR>
La prima sostituzione dipende n, quindi prima dobbiamo calcolare quali cifre verranno sostituite. Se i caratteri sostituiti sono memorizzati nel registro a, il comando di sostituzione è scritto anche in 11 byte :
:%s/<C-r>a/ /g<CR>
<C-r>aviene sostituito dal contenuto del registro aquando viene digitato il comando.
Per calcolare il valore di a, seguendo le precedenti istruzioni, l'algoritmo è (in pseudo-codice):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"stringa viene utilizzata perché quando n = 2, nessuna cifra viene sostituita da spazi. Qualsiasi stringa che non sia il sole potrebbe essere usata qui, purché la prima sostituzione non faccia nulla.
Questo potrebbe essere scritto in 31 byte :
D # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
:let@a= # define register "a content
@"%2 # if (n % 2 != 0)
? # then
@" # n
: # else
@"%4 # if (n % 4 != 0)
? # then
"X" # "X"
: # else
"\\d" # "\\d"
<CR> # calculate "a
Soluzione
Metti tutte queste parti nell'ordine giusto e avrai la soluzione:
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR> # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR> # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR> # replace the remaining digits with stars