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