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