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>es el Enteraccidente cerebrovascular, <C-?>corresponde a Control + ?, y <Esc>que Escapeobviamente. Cada uno de estos cuenta para 1 byte (ver meta ). Los saltos de línea en la solución son para facilitar la lectura. Solo <CR>representa Entertrazos reales .
Entrada
El archivo de entrada debe contener solo 1 carácter, que representa n.
Lanzamiento
VI debe comenzar como:
vi -u NONE input
Explicaciones
Hay 3 partes en la solución. Primero describiré la segunda parte (segunda línea), ya que es la más fácil de explicar.
Dibujando el sol
El comando para dibujar el sol es:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
El sol debe ser dibujado con , *, 0, 1y 3, de esta manera:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Una simetría habría ayudado a reducir el tamaño de bytes de esta parte, pero no es tan importante. No explicaré la línea completa, pero el patrón *****se usa para generar fácilmente la última línea, y el patrón **1110333**se ha tomado como referencia para generar las otras 3 líneas que contienen 0, 1y3 .
Es importante usarlo 0, 1y 3para las partes solares que se pueden llenar (vea las siguientes explicaciones). Dibujar este sol toma 55 bytes , y probablemente se pueda jugar golf con algunos trucos.
Llenando el sol de acuerdo a n
Para llenar correctamente el sol, las instrucciones a seguir son:
- si
n = 0, entonces 0, 1y 3(todos los dígitos) deben reemplazarse con
- si
n = 1, entonces 1debe ser reemplazado con , los otros dígitos con*
- si
n = 2, entonces 0, 1y 3(todos los dígitos) deben reemplazarse con*
- si
n = 3, entonces 3debe ser reemplazado con , los otros dígitos con*
- si
n = 4, entonces 0, 1y 3(todos los dígitos) deben reemplazarse con (like n = 0)
A partir de eso, podemos inferir que las sustituciones requeridas son:
- reemplazar algunos dígitos por
( primera sustitución )
- reemplazar todos los otros dígitos por
*( segunda sustitución )
Tenga en cuenta que "algunos dígitos" pueden significar "sin dígitos" ( n = 2por ejemplo). Y "todos los demás dígitos" también pueden representar "sin dígitos", si todos los dígitos ya han sido reemplazados por la primera sustitución ( n = 0por ejemplo).
La segunda sustitución se puede escribir fácilmente en 11 bytes :
:%s/\d/*/g<CR>
La primera sustitución depende n, por lo que primero tenemos que calcular qué dígitos se van a reemplazar. Si los caracteres reemplazados se almacenan en el registro a, el comando de sustitución también se escribe en 11 bytes :
:%s/<C-r>a/ /g<CR>
<C-r>ase reemplaza por el contenido del registro acuando se escribe el comando.
Para calcular el valor de a, siguiendo las instrucciones anteriores, el algoritmo es (en pseudocódigo):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"La cadena se utiliza porque cuando n = 2no se reemplazan los dígitos por espacios. Aquí se puede usar cualquier cadena que no sea el sol, siempre que la primera sustitución no haga nada.
Esto podría escribirse en 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
Solución
Ponga todas estas partes en el orden correcto y tendrá la solución:
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