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 Enter
acidente 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 Enter
traç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
, 1
e 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
, 1
e 3
.
É importante usar 0
, 1
e 3
para 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
, 1
e 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
, 1
e 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
, 1
e 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 = 2
por 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 = 0
por 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 a
quando 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