Я думаю, что художественные вопросы ASCII по PPCG очень интересны, но лично я думаю, что это может быть довольно сложно, особенно когда вопрос помечен как code-golf .
Интересно, есть ли у кого-нибудь здесь несколько советов, которые будут полезны для создания искусства ASCII.
Простое расположение символов легко, но с (короткими) алгоритмами все станет сложнее.
Я говорю об искусстве ASCII как:
- Текст в ASCII art (символы)
- Изображения (логотипы или значки)
Я просто ищу общие советы, но язык разрешен, так как большинство из них можно перевести в любом случае.
[0-9A-Za-z]
Ищите симметрию
Иногда требуемое искусство ASCII в какой-то момент симметрично. Например, Argyle ASCII Art требует вывода, подобного следующему:
Можно просто напечатать это нормально, но в зависимости от языка требуемый код может быть сокращен, только генерируя верхнюю половину результата, обращая его и меняя местами
/
и\
.Попробуй транспонировать
В ASCII Art Archery Arrows результат для печати такой, масштабированный до заданного
n
:Если мы посмотрим на стрелку, мы увидим, что есть 8 видов линий:
Давайте попробуем то же самое для его транспонирования.
Здесь есть 10 видов линий.
Но тут есть одна загвоздка: нижние 5 идентичны верхним 5, за исключением перестановки
/
и\
. Согласно предыдущему правилу, вы можете сначала сгенерировать первые 5, скопировать, сделать своп и, наконец, транспонировать, чтобы получить стрелку. Это может сэкономить много кода.источник
Управляющие символы, escape-последовательности и консольные коды
Если вопрос не запрещает их, текущий консенсус в отношении Meta заключается в том, что для художественных задач ASCII не требуется определенный поток байтов, а вывод, который выглядит правильным.
Это означает, что в наших ответах мы можем использовать управляющие символы ASCII , escape-последовательности ANSI и консольные коды Linux , при условии поддержки терминала.
Если не указано иное, остальная часть этого ответа объяснит поведение терминалов Linux, что я и имею в наличии для тестирования прямо сейчас.
Управляющие символы ASCII
Поддержка / интерпретация варьируется от терминала к терминалу и от персонажа к персонажу. Наиболее переносимым должен быть перевод строки (
\n
,\x0a
), который перемещает символ в начало следующей строки.Другие полезные символы включают в себя:
Вертикальная вкладка (
\v
,\x0b
) перемещает курсор на одну позицию вправо, а затем на одну позицию вниз.Возврат каретки (
\r
,\x0d
) перемещает курсор в начало текущей строки. Любой последующий печатный символ будет перезаписывать первый символ текущей строки.Возврат (
\b
,\x08
) перемещает курсор на одну позицию влево. Любой последующий печатный символ будет перезаписывать символ перед возвратом.Escape (
\e
,\x1b
) ничего не делает само по себе, но является частью escape-последовательностей ANSI (необязательно) и консольных кодов Linux.Многие языки допускают фактические управляющие символы в исходном коде.
Escape-последовательности ANSI
(еще впереди)
Linux консольные коды
Хотя их гораздо больше, наиболее полезными консольными кодами для ASCII-графики, вероятно, являются следующие:
Последовательность
\ec
будет сбросить терминал. Это очистит экран, поместит курсор в верхний левый угол и установит передний и фоновый цвета, частоту мигания курсора и т. Д. По умолчанию.Последовательность
\eM
вызывает обратную перевод строки , т.е. курсор переместится на одну позицию вверх.Последовательность
\eH
устанавливает табуляцию в текущем столбце.источник
Ищите шаблоны
Это может быть немного очевидно, но ... ищите шаблоны, сходства и повторения в выходных данных. Например, когда я увидел задачу « Преобразовать число в 7-сегментный шаблон отображения», я начал думать о том, как можно играть в нее, и начал искать сходства. Из-за того, как горизонтальные сегменты проходят между вертикальными сегментами в матрице символов, вероятно, было бы легче иметь дело с тремя сегментами одновременно, сгруппированными как таковые (добавляя два «всегда пустых» сегмента для первого, самого верхнего сегмента) :
Таким образом, вы могли бы сделать что - то вроде
).
lc + " "*N + rc + "\n"
N-1 раз , а затемlc + bc*N + rc
один раз на каждые три сегмента (lc
,bc
,rc
будучи символы лево-, снизу - , и правый сегмент, т.е. один из|
,_
илиисточник
Использовать базовое преобразование
Этот ответ был на вопрос, который хотел искусство ASCII, которое состояло из символов
+ |-
и новых строк. Поскольку существует только 5 возможных символов, их можно рассматривать как базовое число 5 и преобразовывать в байты, упаковывая 3,45 символа на байт.Эксплуатировать закономерности
Часто данные имеют некоторые закономерности, даже если эти закономерности недостаточно сильны, чтобы использовать определенные инструменты, такие как зеркальное отображение. Например, в приведенном выше вопросе желаемый вывод имел новые строки, примерно равномерно распределенные по всему тесту, поскольку текст был примерно прямоугольным. Я воспользовался этим, чтобы сократить свой код, используя функцию разбиения Pyth на n частей, а затем присоединяясь к новым строкам.
Знайте свои инструменты и выберите правильный для работы.
Самые мощные и эффективные инструменты обработки текста, которые я знаю:
Движки Regex:
///
Retina, Perl, в порядке компромисса между мощностью и краткостью.Используйте, если то, что вы хотите сделать, может быть сознательно описано в подстановках регулярных выражений, таких как этот ответ
Неясные инструменты обработки текста: гема и т. Д. (Я уверен, что есть и другие, но они слишком неясны)
Используйте, если у них есть функция, которая именно то, что вам нужно, что больше ничего не имеет. Как в этом вопросе , с рекурсивным соответствием гемы.
Общие коды языков игры в гольф: CJam, Pyth и др.
Используйте, если вы используете какой-то сложный набор тонкостей, чтобы никакой другой инструмент не справлялся с работой или он просто выполнял работу короче.
Попробуйте много подходов
Это относится к каждому вопросу о код-гольфе, но особенно здесь. Вы не узнаете, пригодна ли регулярность, пока не попробуете. Возможно на нескольких языках.
источник