Терминалы такие скучные в наши дни. Раньше они выглядели так:
Теперь они просто мягкие, скучные и черно-белые. Я хочу, чтобы вы написали мне программу, которая сделает мой терминал снова красочным!
Описание
Возьмите этот пример кода Ruby:
Большинство терминалов Linux поддерживают эти escape-последовательности ( \e
расшифровывается как escape-символ), и Windows может поддерживать их с помощью ANSICON . Вот синтаксис конкретной escape-последовательности, которая может изменить цвет текста или фона строки:
\e[{{COLOR}}m
где \e
обозначает escape-символ ( 0x1B
в ASCII) и {{COLOR}}
заменяется номером цвета, который вы хотите использовать (более подробно об этом позже). Текст, который следует после этой escape-последовательности, будет отформатирован в соответствии с указаниями, а значение 0
сбрасывает все форматирование.
Ваша задача - взять строку с указанием текста, который может содержать цвет, и вывести его красочную версию.
Ввод, вывод
Нормальный текст работает так же, как обычный, и печатается буквально. Например, ввод waffles
дает тот же вывод, без специального цвета.
Синтаксис для указания цвета аналогичен синтаксису Википедии . Например, чтобы закрасить слова «красный цвет» в предложении красным цветом This is the color red!
, введите:
This is {{red|the color red}}!
Цвет фона тоже работает. Если вы хотите черные буквы на белом фоне, вы должны использовать это:
{{black|white|This text is black on white}}
Чтобы получить только цвет фона, опустите передний план:
{{|red|This text has a red background}}
Технические характеристики
Две открытые фигурные скобки всегда указывают начало цветовой директивы . Две закрывающие фигурные скобки указывают конец. Скобки всегда будут совпадать; никогда не будет {{
без соответствующего }}
, и }}
никогда не будет предшествовать его соответствующему {{
. Эти цветовые директивы не будут вложенными, и {{
никогда не будут появляться внутри цветовой директивы.
Внутри цветовой директивы всегда будет один или два |
символа. Если он есть, то текст перед ним - это цвет переднего плана, а текст после - это строка, которая будет отображаться в этом цвете. Если их два, текст перед первым - это цвет переднего плана, текст после первого, но перед вторым - цвет фона, а текст после второго - строка для отображения. Эти вертикальные полосы могут существовать вне цветовой директивы и должны быть напечатаны буквально.
Цвет переднего плана или цвет фона (но не оба) могут быть пустыми, в этом случае вы должны оставить их по умолчанию. Последняя строка (которая выводится) никогда не будет пустой.
Вот инструкции для вывода текста определенного цвета:
Последовательность цветов определена в разделе «Описание». Например, цветовая последовательность 42 будет
"\e[42m"
.Чтобы установить цвет, напечатайте цветовую последовательность числа, определенного ниже:
Color name | Color sequence number (foreground / background) --------------+---------- black | 30 / 40 red | 31 / 41 green | 32 / 42 yellow | 33 / 43 blue | 34 / 44 magenta | 35 / 45 cyan | 36 / 46 lightgray | 37 / 47 darkgray | 90 / 100 lightred | 91 / 101 lightgreen | 92 / 102 lightyellow | 93 / 103 lightblue | 94 / 104 lightmagenta | 95 / 105 lightcyan | 96 / 106 white | 97 / 107
Имена цветов чувствительны к регистру, и неверное имя цвета никогда не будет предоставлено. Вам не нужно обрабатывать такие вещи, как
RED
илиlightgrey
(пишется сe
).После того, как вы напечатаете цветовую последовательность, она будет применяться ко всему тексту, следующему за ней. Чтобы завершить цветовую последовательность (восстановить цвет по умолчанию), выведите цветовую последовательность
0
("\e[0m"
).
Прецедент
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Это должно вывести смайлик ... со злыми красными глазами.
правила
Вы не можете использовать какие-либо библиотеки или функции вашего языка программирования для автоматического анализа цвета. Это значит, что именно вы должны определить, что это
"red"
значит; вы не можете иметь библиотеку, которая автоматически сделает это за вас.Это код-гольф , поэтому выиграет самый короткий код в байтах!
\n\[\e[32m\]\w\n\[\e[0m\]>
(зеленое имя каталога, обычное приглашение на следующей строке), но я не могу заставить его работать из программы (пока пробовал python и Java). Любые идеи?echo -e "\e[31mtest\e[0m"
.lolcat
.you
он образно подразумеваетyour program
(в отличие от вызова библиотечной функции), и что он принимаетdetermine
в смыслеfigure out
, а не вchoose
. То есть именно ваша программа должна обрабатывать отображение: String ("red") | -> Integer (31).red
только31
потому, что он так говорит, эта информация должна быть интегрирована в программу. Хотя можно утверждать, что именно это считаетсяyour program
- можем ли мы использовать универсальные функции манипулирования строками? - не нагло обманывать / оскорблять.Ответы:
Ruby,
205189188186185182174170165161159154 байтаРазмещение длинных строк с именами цветов в вашем коде не выглядит достаточно занудно.
До 170 отчасти благодаря
rubik
. Теперь полосы прокрутки исчезли!Одно очевидное и одно не очень очевидное улучшение, благодаря гибкому ответу, без улучшения, я бы не пересмотрел это!
Теперь я сохранил 4 байта с помощью #sum.
Я не собирался этого делать, но я только заметил, что это решение не учитывает регистр. Это счастливо обрабатывает{{RED|Red text}}
.Шестнадцатеричный дамп:
Вы можете конвертировать его с
xxd -r hex.dump
.Программа со всеми непечатными символами экранирована для справочных целей:
Это одна строка. Используйте это так
-W0
Флаг подавляет предупреждения , которые будут отправлены вstderr
противном случае. Тем не менее, программа прекрасно работает без каких-либо флагов.Выход:
источник
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Моя строка длиной 16, хотя. Я вижу, тебе 18 лет, так что тебе, вероятно, придется приспосабливаться.int()
функция Python не может превышать 36). Затем я попробовал все комбинации для модуля (от 2 до 10000, но в теории можно было бы расширить поиск по всему Unicode) и для xor, который я оставил небольшим (от 1 до 9). Тогда я считал приемлемыми результаты только те, которые не содержали повторяющихся символов.x.to_i(base)%mod+offset
. Затем я заменил+
с^
, потому что хорошо, это выглядит кулер. Кроме этого, это излишне. Отбрасывание^99
и переход<<
к+
сохранению для большего количества байтов. Спасибо за совет, я бы не заметил иначе!Рубин, 329 байт.
источник
ruby 2.1.2p95
и бросить ошибку:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, он будет продолжать цикл после того, как все входные данные были прочитаны. Затемgets
возвращаетсяnil
, у которого нет#gsub
метода , что вызывает ошибку. Используйте$><<$<.read
вместоloop{puts gets
, это также короче; )Flex (лексер) -
226197192182168 (или 166)Чтобы уменьшить его до 166, измените его
\33
на фактический escape-символ.Скомпилируйте и запустите:
источник
Питон - 351
источник
Кобра - 496
Это может быть почти одно печатное заявление.
источник
Python, 561
Читает текст для форматирования из стандартного ввода.
источник
is not None
в Codegolf. Вы можете использовать!=None
, например.def p(f,b,t)
ваш код будет брошеноZeroDivisionError
. Все, что мод 0, невозможно.re.sub
запуске этого