Советы по игре в гольф ASCII art


18

Я думаю, что художественные вопросы ASCII по PPCG очень интересны, но лично я думаю, что это может быть довольно сложно, особенно когда вопрос помечен как .

Интересно, есть ли у кого-нибудь здесь несколько советов, которые будут полезны для создания искусства ASCII.

Простое расположение символов легко, но с (короткими) алгоритмами все станет сложнее.

Я говорю об искусстве ASCII как:

  • Текст в ASCII art (символы)
  • Изображения (логотипы или значки)

Я просто ищу общие советы, но язык разрешен, так как большинство из них можно перевести в любом случае.

Ответы:


8

Алгоритмы сжатия

Вы можете применить сжатие LZMA к строке.
Многие языки поддерживают это.

Кодирование по длине прогона

Вы можете использовать инструкции по обработке, такие как [char][number](например b12).
Этот алгоритм сжатия используется здесь: /codegolf//a/20589/10920

Дальнейшее чтение: http://en.wikipedia.org/wiki/Run-length_encoding

Целочисленная упаковка

Вы можете использовать массивы целых чисел для хранения небольших фигур, таких как:

// This is an invader!
// (SE line height makes it looks awful)
// ~158 characters

    ##          ##    
      ##      ##      
    ##############    
  ####  ######  ####  
######################
##  ##############  ##
##  ##          ##  ##
      ####  ####       

Каждое пространство будет переведено в 0.
Каждый острый будет переведен в 1.

// ~58 characters
// Saved ~100 bytes!
[
  196656,  49344,   262128,  999228,
  4194303, 3407859, 3342387, 62400
]

Каждый бит затем читается с помощью побитового оператора &.

Приведенный выше алгоритм может быть улучшен с использованием большей целочисленной базы:

// ~44 characters
// Integers are in base 36.
// Use `_` as a separator (or a line break).
"47qo_122o_5m9c_lf0c_2hwcf_211ir_1zn03_1c5c"

3
Ваши инструкции по обработке обычно известны как кодирование длин серий , к вашему сведению.
FireFly

@FireFly Спасибо! Я не знал, что есть имя для этого.
Флорент,

В пар (мой язык) это может быть расширено, поскольку оно поддерживает целые числа, закодированные до основания 62:[0-9A-Za-z]
Cyoce

5

Ищите симметрию

Иногда требуемое искусство ASCII в какой-то момент симметрично. Например, Argyle ASCII Art требует вывода, подобного следующему:

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

Можно просто напечатать это нормально, но в зависимости от языка требуемый код может быть сокращен, только генерируя верхнюю половину результата, обращая его и меняя местами /и \.

Попробуй транспонировать

В ASCII Art Archery Arrows результат для печати такой, масштабированный до заданного n:

     /\
    /  \
   /    \
  /      \
  \      /
   \____/
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
    |  |
   /|  |\
  / |  | \
 /  |  |  \
/   |  |   \
/   |  |   \
/   |__|   \
/  /    \  \
/ /      \ \
//        \\
/          \

Если мы посмотрим на стрелку, мы увидим, что есть 8 видов линий:

/ \
\ /
\_/
| |
/ | | \
/ |_| \
/ / \ \
/ \

Давайте попробуем то же самое для его транспонирования.

                         ///////
                        /     / 
   /\                  /     /  
  /  \                /     /   
 /   _||||||||||||||||||||||    
/    _                     _    
\    _                     _    
 \   _||||||||||||||||||||||    
  \  /                \     \   
   \/                  \     \  
                        \     \ 
                         \\\\\\\

Здесь есть 10 видов линий.

/
/ /
/ \ / /
/ _|
/ _ _
\ _ _
\ _|
\ / \ \
\ \
\

Но тут есть одна загвоздка: нижние 5 идентичны верхним 5, за исключением перестановки /и \. Согласно предыдущему правилу, вы можете сначала сгенерировать первые 5, скопировать, сделать своп и, наконец, транспонировать, чтобы получить стрелку. Это может сэкономить много кода.


5

Управляющие символы, escape-последовательности и консольные коды

Если вопрос не запрещает их, текущий консенсус в отношении Meta заключается в том, что для художественных задач ASCII не требуется определенный поток байтов, а вывод, который выглядит правильным.

Это означает, что в наших ответах мы можем использовать управляющие символы ASCII , escape-последовательности ANSI и консольные коды Linux , при условии поддержки терминала.

Если не указано иное, остальная часть этого ответа объяснит поведение терминалов Linux, что я и имею в наличии для тестирования прямо сейчас.

Управляющие символы ASCII

Поддержка / интерпретация варьируется от терминала к терминалу и от персонажа к персонажу. Наиболее переносимым должен быть перевод строки ( \n, \x0a), который перемещает символ в начало следующей строки.

Другие полезные символы включают в себя:

  • Вертикальная вкладка ( \v, \x0b) перемещает курсор на одну позицию вправо, а затем на одну позицию вниз.

    $ echo -e 'a\vb'
    a
     b
    
  • Возврат каретки ( \r, \x0d) перемещает курсор в начало текущей строки. Любой последующий печатный символ будет перезаписывать первый символ текущей строки.

    $ echo -e 'ab\rc'
    cb
    
  • Возврат ( \b, \x08) перемещает курсор на одну позицию влево. Любой последующий печатный символ будет перезаписывать символ перед возвратом.

    $ echo -e 'ab\bc'
    ac
    
  • Escape ( \e, \x1b) ничего не делает само по себе, но является частью escape-последовательностей ANSI (необязательно) и консольных кодов Linux.

Многие языки допускают фактические управляющие символы в исходном коде.

Escape-последовательности ANSI

(еще впереди)

Linux консольные коды

Хотя их гораздо больше, наиболее полезными консольными кодами для ASCII-графики, вероятно, являются следующие:

  • Последовательность \ecбудет сбросить терминал. Это очистит экран, поместит курсор в верхний левый угол и установит передний и фоновый цвета, частоту мигания курсора и т. Д. По умолчанию.

  • Последовательность \eMвызывает обратную перевод строки , т.е. курсор переместится на одну позицию вверх.

    $ echo -e '\na\eMb\n'
     b
    a
    
  • Последовательность \eHустанавливает табуляцию в текущем столбце.

    $ echo -e '   \eHa\n\tb'
       a
       b
    

2

Ищите шаблоны

Это может быть немного очевидно, но ... ищите шаблоны, сходства и повторения в выходных данных. Например, когда я увидел задачу « Преобразовать число в 7-сегментный шаблон отображения», я начал думать о том, как можно играть в нее, и начал искать сходства. Из-за того, как горизонтальные сегменты проходят между вертикальными сегментами в матрице символов, вероятно, было бы легче иметь дело с тремя сегментами одновременно, сгруппированными как таковые (добавляя два «всегда пустых» сегмента для первого, самого верхнего сегмента) :

ощупывание сегментов

Таким образом, вы могли бы сделать что - то вроде lc + " "*N + rc + "\n"N-1 раз , а затем lc + bc*N + rcодин раз на каждые три сегмента ( lc, bc, rcбудучи символы лево-, снизу - , и правый сегмент, т.е. один из |, _или  ).


2

Использовать базовое преобразование

Этот ответ был на вопрос, который хотел искусство ASCII, которое состояло из символов + |-и новых строк. Поскольку существует только 5 возможных символов, их можно рассматривать как базовое число 5 и преобразовывать в байты, упаковывая 3,45 символа на байт.

Эксплуатировать закономерности

Часто данные имеют некоторые закономерности, даже если эти закономерности недостаточно сильны, чтобы использовать определенные инструменты, такие как зеркальное отображение. Например, в приведенном выше вопросе желаемый вывод имел новые строки, примерно равномерно распределенные по всему тесту, поскольку текст был примерно прямоугольным. Я воспользовался этим, чтобы сократить свой код, используя функцию разбиения Pyth на n частей, а затем присоединяясь к новым строкам.

Знайте свои инструменты и выберите правильный для работы.

Самые мощные и эффективные инструменты обработки текста, которые я знаю:

Движки Regex: ///Retina, Perl, в порядке компромисса между мощностью и краткостью.

Используйте, если то, что вы хотите сделать, может быть сознательно описано в подстановках регулярных выражений, таких как этот ответ

Неясные инструменты обработки текста: гема и т. Д. (Я уверен, что есть и другие, но они слишком неясны)

Используйте, если у них есть функция, которая именно то, что вам нужно, что больше ничего не имеет. Как в этом вопросе , с рекурсивным соответствием гемы.

Общие коды языков игры в гольф: CJam, Pyth и др.

Используйте, если вы используете какой-то сложный набор тонкостей, чтобы никакой другой инструмент не справлялся с работой или он просто выполнял работу короче.

Попробуйте много подходов

Это относится к каждому вопросу о код-гольфе, но особенно здесь. Вы не узнаете, пригодна ли регулярность, пока не попробуете. Возможно на нескольких языках.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.