Поради для гольфу ASCII art


18

Я думаю, що питання мистецтва ASCII на PPCG цікаво робити, але особисто я думаю, що це може бути досить важко, особливо коли це позначено як .

Цікаво, чи може хтось тут мати поради, які будуть корисні для створення мистецтва ASCII.

Впорядкувати символи просто, але з (короткими) алгоритмами все ускладниться.

Я говорю про мистецтво ASCII на кшталт:

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

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

Відповіді:


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
Ваші інструкції з обробки зазвичай відомі як кодування довжиною виконання , FYI.
FireFly

@FireFly Дякую! Я не знав, що там є ім'я.
Флорент

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

5

Шукайте симетрію

Іноді необхідне мистецтво ASCII в якийсь момент симетричне. Наприклад, Argyle ASCII Art вимагає результату, аналогічного цьому:

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

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

Спробуйте перенести

В ASCII Art Archery Arrow результат для друку такий, масштабується до заданого n:

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

Якщо ми подивимось на стрілку, то можемо побачити, що існує 8 видів рядків:

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

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

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

Тут існує 10 видів ліній.

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

Але ось ось улов: нижній 5 ідентичний верхньому 5, за винятком заміни /та \. Відповідно до попереднього правила, ви можете спершу створити перші 5, скопіювати, зробити своп і, нарешті, перемістити, щоб отримати стрілку. Це може заощадити багато коду.


5

Керуйте символами, послідовностями відходу та кодами консолей

Якщо питання не забороняє їх, поточний консенсус щодо Meta полягає в тому, що виклики для мистецтва ASCII не вимагають конкретного потоку байтів, а висновок, який виглядає правильним.

Це означає, що ми можемо використовувати у своїх відповідях символи керування ASCII , послідовності відходу 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) не робить нічого самостійно, але є частиною послідовностей аварійних відбітків ANSI (необов'язково) та кодів консолі Linux.

Багато мов дозволяють фактичні символи управління у вихідному коді.

Послідовності втечі 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, у порядку компромісу потужності / стислість.

Використовуйте, якщо те, що ви хочете зробити, можна точно описати в замінах регулярних виразів, таких як ця відповідь

Неясні інструменти для обробки тексту: gema тощо (я впевнений, що є й інші, але вони занадто незрозумілі)

Використовуйте, якщо вони мають функцію, саме те, що вам потрібно, і нічого іншого не має. Як, наприклад, у цьому питанні , з рекурсивною відповідністю gema.

Загальні мови гольф-коду: CJam, Pyth тощо.

Використовуйте, якщо ви використовуєте якусь тонку складність, щоб жоден інший інструмент не зробив цю роботу або він просто зробить роботу коротше.

Спробуйте багато підходів

Це стосується кожного кодового питання про гольф, але особливо тут. Ви не дізнаєтесь, чи корисність регулярності, поки ви не спробуєте її. Можливо на кількох мовах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.