VI, 108 bytes
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>é o Enteracidente vascular cerebral, <C-?>corresponde a Control + ?, e <Esc>para Escape, obviamente. Cada um deles conta com 1 byte (consulte meta ). A quebra de linha na solução é para facilitar a leitura. <CR>Representa apenas Entertraços reais .
Entrada
O arquivo de entrada deve conter apenas 1 caractere, representando n.
Lançamento
VI deve ser iniciado como:
vi -u NONE input
Explicações
Existem 3 partes na solução. Descreverei a 2ª parte primeiro (2ª linha), pois é a mais fácil de explicar.
Desenhando o sol
O comando para desenhar o sol é:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
O sol deve ser desenhado com , *, 0, 1e 3, como este:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Uma simetria teria ajudado a reduzir o tamanho dos bytes desta parte, mas não é tão importante. Não explicarei a linha completa, mas o padrão *****é usado para gerar facilmente a última linha, e o padrão **1110333**foi tomado como referência para gerar as outras 3 linhas que contêm 0, 1e 3.
É importante usar 0, 1e 3para peças de sol que podem ser preenchidos (veja a próxima explicações). Desenhar este sol leva 55 bytes e provavelmente pode ser jogado com alguns truques.
Enchendo o sol de acordo com n
Para preencher corretamente o sol, as instruções a seguir são:
- se
n = 0, então 0, 1e 3(todos os dígitos) devem ser substituídos por
- se
n = 1, então 1, for substituído por , os outros dígitos com*
- se
n = 2, então 0, 1e 3(todos os dígitos) devem ser substituídos por*
- se
n = 3, então 3, for substituído por , os outros dígitos com*
- se
n = 4, então 0, 1e 3(todos os dígitos) devem ser substituídos por (como n = 0)
A partir disso, podemos inferir que as substituições necessárias são:
- substituir alguns dígitos por
( primeira substituição )
- substitua todos os outros dígitos por
*( segunda substituição )
Observe que "alguns dígitos" pode significar "sem dígitos" ( n = 2por exemplo). E "todos os outros dígitos" também podem representar "sem dígitos", se todos os dígitos já tiverem sido substituídos pela primeira substituição ( n = 0por exemplo).
A segunda substituição pode ser escrita facilmente em 11 bytes :
:%s/\d/*/g<CR>
A primeira substituição depende n, então primeiro temos que calcular quais dígitos serão substituídos. Se os caracteres substituídos estiverem armazenados no registro a, o comando de substituição também será gravado em 11 bytes :
:%s/<C-r>a/ /g<CR>
<C-r>aé substituído pelo conteúdo do registro aquando o comando é digitado.
Para calcular o valor de a, seguindo as instruções anteriores, o algoritmo é (em pseudo-código):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"string é usada porque quando n = 2, nenhum dígito é substituído por espaços. Qualquer string que não seja o sol pode ser usada aqui, desde que a primeira substituição não faça nada.
Isso pode ser escrito em 31 bytes :
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
Solução
Coloque todas essas peças na ordem certa e você terá a solução:
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