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' Enter
ictus, <C-?>
corrisponde Control + ?
, e <Esc>
di Escape
ovviamente. Ognuno di questi conta per 1 byte (vedi meta ). Le interruzioni di riga nella soluzione sono leggibili. <CR>
Rappresenta solo Enter
tratti 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
, 1
e 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
, 1
e 3
.
È importante da usare 0
, 1
e 3
per 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
,1
e3
(tutte le cifre) devono essere sostituiti con
- se
n = 1
, quindi 1
dovrebbe essere sostituito con
, le altre cifre con*
- se
n = 2
, quindi 0
, 1
e3
(tutte le cifre) devono essere sostituiti con*
- se
n = 3
, quindi 3
dovrebbe essere sostituito con
, le altre cifre con*
- se
n = 4
, quindi 0
, 1
e 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 = 2
ad esempio). E "tutte le altre cifre" può anche rappresentare "nessuna cifra", se tutte le cifre sono già state sostituite dalla prima sostituzione ( n = 0
ad 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>a
viene sostituito dal contenuto del registro a
quando 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