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 Enter
accidente cerebrovascular, <C-?>
corresponde a Control + ?
, y <Esc>
que Escape
obviamente. 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 Enter
trazos 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
, 1
y 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
, 1
y3
.
Es importante usarlo 0
, 1
y 3
para 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
, 1
y 3
(todos los dígitos) deben reemplazarse con
- si
n = 1
, entonces 1
debe ser reemplazado con
, los otros dígitos con*
- si
n = 2
, entonces 0
, 1
y 3
(todos los dígitos) deben reemplazarse con*
- si
n = 3
, entonces 3
debe ser reemplazado con
, los otros dígitos con*
- si
n = 4
, entonces 0
, 1
y 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 = 2
por 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 = 0
por 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>a
se reemplaza por el contenido del registro a
cuando 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 = 2
no 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