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>
is the Enter
stroke, <C-?>
corresponds to Control + ?
, and <Esc>
to Escape
obviously. Each of these count for 1 byte (see meta). The line breaks in the solution is for readability. Only <CR>
represents real Enter
strokes.
Input
The input file should contain only 1 character, representing n
.
Launch
VI should be started like :
vi -u NONE input
Explanations
There are 3 parts in the solution. I will describe the 2nd part first (2nd line), since it is the easiest to explain.
Drawing the sun
The command to draw the sun is :
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
The sun must be drawn with
, *
, 0
, 1
and 3
, like this :
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
A symmetry would have helped to reduce the bytes size of this part, but it's not that important. I will not explain the full line, but the pattern *****
is used to easily generate the last line, and the pattern **1110333**
has been taken as a reference to generate the 3 other lines containing 0
, 1
and 3
.
It is important to use 0
, 1
and 3
for sun parts that can be filled (see next explanations). Drawing this sun takes 55 bytes, and can probably be golfed with some tricks.
Filling the sun according to n
To correctly fill the sun, the instructions to follow are :
- if
n = 0
, then 0
, 1
and 3
(all digits) should be replaced with
- if
n = 1
, then 1
should be replaced with
, the other digits with *
- if
n = 2
, then 0
, 1
and 3
(all digits) should be replaced with *
- if
n = 3
, then 3
should be replaced with
, the other digits with *
- if
n = 4
, then 0
, 1
and 3
(all digits) should be replaced with
(like n = 0
)
From that, we can infer that the substitutions required are :
- replace some digits by
(first substitution)
- replace all other digits by
*
(second substitution)
Note that "some digits" can mean "no digits" (n = 2
for example). And "all other digits" can also represent "no digits", if all digits have already been replaced by the first substitution (n = 0
for example).
The second substitution can be easily written in 11 bytes :
:%s/\d/*/g<CR>
The first substitution depends on n
, so first we have to calculate what digits are going to be replaced. If replaced characters are stored in register a
, the substitution command is written in also 11 bytes :
:%s/<C-r>a/ /g<CR>
<C-r>a
is replaced by the content of register a
when the command is typed.
To calculate the value of a
, following the previous instructions, the algorithm is (in pseudo-code) :
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
string is used because when n = 2
, no digits are replaced by spaces. Any string that is not the sun could be used here, as long as the first substitution does nothing.
This could be written in 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
Solution
Put all these parts in the right order, and you have the solution :
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