VI, 108 байт
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>является Enterинсульт, <C-?>соответствует Control + ?, и <Esc>к Escapeочевидно. Каждый из них считается за 1 байт (см. Мета ). Разрывы строк в решении предназначены для удобства чтения. Только <CR>представляет реальные Enterудары.
вход
Входной файл должен содержать только 1 символ, представляющий n.
запуск
VI должен быть запущен как:
vi -u NONE input
Пояснения
В решении 3 части. Сначала я опишу 2-ю часть (2-я строка), так как это проще всего объяснить.
Рисовать солнце
Команда рисовать солнце:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
ВС должны быть нарисованы , *, 0, 1и 3, как это:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Симметрия помогла бы уменьшить размер в байтах этой части, но это не так важно. Я не буду объяснять всю линию, но шаблон *****используется легко генерировать последнюю строку, и образец **1110333**был взят в качестве эталона для создания 3 других строк , содержащих 0, 1и 3.
Важно , чтобы использовать 0, 1и 3для солнечных частей , которые могут быть заполнены (см следующих пояснений). Рисование этого солнца занимает 55 байт , и, возможно, с некоторыми хитростями можно играть в гольф.
Заполнение солнцем согласно n
Чтобы правильно заполнить солнце, следуйте инструкциям:
- если
n = 0, то 0, 1и 3(все цифры) должны быть заменены
- если
n = 1, то 1следует заменить на , другие цифры с*
- если
n = 2, то 0, 1и 3(все цифры) должны быть заменены*
- если
n = 3, то 3следует заменить на , другие цифры с*
- если
n = 4, то 0, 1и 3(все цифры) должны быть заменены (как n = 0)
Исходя из этого, мы можем сделать вывод, что необходимые замены:
- заменить некоторые цифры на
( первая замена )
- заменить все остальные цифры на
*( вторая замена )
Обратите внимание, что «некоторые цифры» могут означать «без цифр» ( n = 2например). И «все остальные цифры» также могут представлять «без цифр», если все цифры уже были заменены первой заменой ( n = 0например).
Вторая замена может быть легко записана в 11 байт :
:%s/\d/*/g<CR>
Первая замена зависит n, поэтому сначала мы должны рассчитать , какие цифры будут заменены. Если замененные символы хранятся в регистре a, команда замещения записывается также в 11 байтах :
:%s/<C-r>a/ /g<CR>
<C-r>aзаменяется содержимым регистра aпри вводе команды.
Для вычисления значения a, следуя предыдущим инструкциям, алгоритм (в псевдокоде):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"Строка используется, потому что, когда n = 2, никакие цифры не заменяются пробелами. Любая строка, которая не является солнцем, могла бы использоваться здесь, пока первая замена ничего не делает.
Это может быть записано в 31 байте :
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
Решение
Разместите все эти части в правильном порядке, и у вас есть решение:
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