VI, 108 octets
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>
est le Enter
coup, <C-?>
correspond à Control + ?
, et <Esc>
à Escape
évidemment. Chacun d'entre eux compte pour 1 octet (voir méta ). Les sauts de ligne dans la solution sont pour la lisibilité. Ne <CR>
représente que de vrais Enter
coups.
Contribution
Le fichier d'entrée ne doit contenir qu'un seul caractère, représentant n
.
lancement
Le VI doit être démarré comme:
vi -u NONE input
Explications
Il y a 3 parties dans la solution. Je décrirai d'abord la 2e partie (2e ligne), car elle est la plus simple à expliquer.
Dessiner le soleil
La commande pour dessiner le soleil est:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Le soleil doit être établi avec
, *
, 0
, 1
et 3
, comme celui - ci:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Une symétrie aurait aidé à réduire la taille en octets de cette partie, mais ce n'est pas si important. Je n'expliquerai pas la ligne complète, mais le motif *****
est utilisé pour générer facilement la dernière ligne, et le motif **1110333**
a été pris comme référence pour générer les 3 autres lignes contenant 0
, 1
et 3
.
Il est important de l'utiliser 0
, 1
et 3
pour les pièces solaires qui peuvent être remplies (voir explications suivantes). Dessiner ce soleil prend 55 octets et peut probablement être joué au golf avec quelques astuces.
Remplir le soleil selon n
Pour bien remplir le soleil, les instructions à suivre sont les suivantes:
- si
n = 0
, alors 0
, 1
et 3
(tous les chiffres) doivent être remplacés par
- si
n = 1
, alors 1
doit être remplacé par
, les autres chiffres avec*
- si
n = 2
, alors 0
, 1
et 3
(tous les chiffres) doivent être remplacés par*
- si
n = 3
, alors 3
doit être remplacé par
, les autres chiffres avec*
- si
n = 4
, alors 0
, 1
et 3
(tous les chiffres) doivent être remplacés par
(comme n = 0
)
On peut en déduire que les substitutions requises sont:
- remplacer certains chiffres par
( première substitution )
- remplacer tous les autres chiffres par
*
( deuxième substitution )
Notez que "certains chiffres" peuvent signifier "pas de chiffres" ( n = 2
par exemple). Et "tous les autres chiffres" peuvent également représenter "pas de chiffres", si tous les chiffres ont déjà été remplacés par la première substitution ( n = 0
par exemple).
La deuxième substitution peut être facilement écrite en 11 octets :
:%s/\d/*/g<CR>
La première substitution dépend n
, donc nous devons d'abord calculer quels chiffres vont être remplacés. Si les caractères remplacés sont stockés dans le registre a
, la commande de substitution est également écrite en 11 octets :
:%s/<C-r>a/ /g<CR>
<C-r>a
est remplacé par le contenu du registre a
lorsque la commande est tapée.
Pour calculer la valeur de a
, en suivant les instructions précédentes, l'algorithme est (en pseudo-code):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
chaîne est utilisée car quand n = 2
, aucun chiffre n'est remplacé par des espaces. Toute chaîne qui n'est pas le soleil peut être utilisée ici, tant que la première substitution ne fait rien.
Cela pourrait être écrit en 31 octets :
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
Mettez toutes ces pièces dans le bon ordre, et vous avez la 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