Курсив ASCII art


32

Учитывая ввод художественного изображения ASCII, выводите художественное выделение ASCII курсивом.

Курсивом ASCII art:

  1. Вставьте ноль пробелов перед последней строкой, один пробел перед второй-последней строкой, два пробела перед третьей-последней строкой и т. Д.

  2. Удалите все лишние пробелы, которые могли быть созданы. То есть, если nперед каждой строкой есть хотя бы пробелы, удалите nпробелы в начале каждой строки.

  3. Замените все \s на |, все |s на /, и все /s на _. Оставьте существующие _с прежними.

    Входные данные гарантированно содержат только символы \|/_и пробел.

Например, вход

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

должен выводить

_|_|_|    _|_|_|      _|_|_|    _|_|_|
_|    _|  _|    _|  _|        _|
_|_|_|    _|_|_|    _|        _|  _|_|
_|        _|        _|        _|    _|
_|        _|          _|_|_|    _|_|_|

которые, в свою очередь, предоставляются в качестве входных данных, выходов

    _/_/_/    _/_/_/      _/_/_/    _/_/_/
   _/    _/  _/    _/  _/        _/
  _/_/_/    _/_/_/    _/        _/  _/_/
 _/        _/        _/        _/    _/
_/        _/          _/_/_/    _/_/_/

который бы вывел

        ______    ______      ______    ______
      __    __  __    __  __        __
    ______    ______    __        __  ____
  __        __        __        __    __
__        __          ______    ______

Ввод и вывод может быть либо одной строкой (с необязательным завершающим переводом строки), либо массивом строк.

Поскольку это , победит самый короткий код в байтах.

Дополнительные тестовые случаи:

|||||
  /////
 \\\\\
   _____
 /////
  _____
|||||
 _____


________
________


(то есть, ввод пустой строки приводит к выводу пустой строки)


Можем ли мы предположить, что ввод дополнен прямоугольником?
Мартин Эндер

2
Допустимы ли пробелы в каждой выходной строке?
Луис Мендо

@ MartinBüttner Да, вы можете.
Дверная ручка

@DonMuesli Пробелы в порядке, просто нет пробелов.
Дверная ручка

Можем ли мы принять входные данные в виде прямоугольного массива (матрицы)?
Адам

Ответы:


6

CJam, 43 38 байт

qN/W%eeSf.*:sW%z_{S-}#>zN*"\|/__"_(+er

Требуется, чтобы ввод был дополнен прямоугольником.

Попробуйте онлайн!

объяснение

qN/     e# Read input, split into lines.
W%      e# Reverse lines.
ee      e# Enumerate them (pairing each line with its index starting from 0).
Sf.*    e# Turn each index i into i spaces.
:s      e# Flatten each pair into a single string, prepending the spaces.
W%      e# Reverse the lines again.
z_      e# Transpose the character grid, duplicate it.
{S-}#   e# Find the first row index that contains non-spaces.
>       e# Discard that many rows.
zN*     e# Transpose back and join with linefeeds.
"\|/__" e# Push this string.
_(+     e# Make a copy that's rotated one character to the left, i.e. "|/__\".
er      e# Perform character transliteration mapping from the first string to the second.

Неподходящий, но я попробовал пример PCCG из вопроса, возвращая каждый вывод обратно в программу, но без дополнения к прямоугольнику. Работал нормально.
alexwlchan

@alexwlchan Ну да, конечные пробелы за ограничительным прямоугольником не имеют значения (но не обязательно будут сохранены). Но если вы возьмете, например, сам оригинальный пример PPCG, и удалите конечные пробелы внутри, Gто преобразование свернет его до вершины.
Мартин Эндер

4

Пиф, 32

jCf|Z=Z-Td.t_.e+*kd.rb"\|/__"_Qd

Попробуйте здесь или запустите Test Suite

Каждая строка имеет несколько пробелов. Это работает, применяя .rвращение, встроенное в каждую строку строки. Вращение принимает каждый символ в строке, который соответствует одному в другом аргументе, "\|/__"и заменяет его следующим символом. Двойное подчеркивание прекрасно предотвращает обратную косую черту. Строки также дополняются на основе их индекса.

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


4

MATL , 38 33 29 байт

P"NZ"@Y:'\|/' '|/_'XEh]XhPcYv

Выходные строки имеют завершающие пробелы, чтобы соответствовать самой длинной строке (это допускается задачей).

Ввод - это массив ячеек (список) строк. Массив использует фигурные скобки, а строки используют одинарные кавычки, как показано ниже (нажмите на каждую ссылку, чтобы попробовать онлайн! ).

  • Первый пример :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Второй пример :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Третий пример :

    {'    _/_/_/    _/_/_/      _/_/_/    _/_/_/' '   _/    _/  _/    _/  _/        _/       ' '  _/_/_/    _/_/_/    _/        _/  _/_/  ' ' _/        _/        _/        _/    _/   ' '_/        _/          _/_/_/    _/_/_/    '}
    

объяснение

Массив изначально перевернут. Каждая строка обрабатывается в цикле, а измененная строка помещается в стек. Обработка состоит в замене символов и добавлении нескольких пробелов. Количество пробелов равно текущему количеству элементов в стеке (благодаря тому, что массив был перевернут).

После цикла строки собираются в массив, который переворачивается обратно, преобразуется в массив двумерных символов и удаляется из нежелательных начальных пробелов: начальных пробелов, присутствующих во всех строках массива двумерных символов.

P             % implicitly input cell array of strings. Flip it (reverse order)
"             % for each
  NZ"         %   string with as many spaces as elements there are on the stack
  @Y:         %   push current input string
  '\|/'       %   push string: origin for replacement
  '|/_'       %   push string: target for replacement
  XE          %   replace
  h           %   concatenate string with spaces and modified-character string
]             % end for each
Xh            % collect all processed strings in a cell array
P             % flip back to restore original order
c             % convert to 2D char array
Yv            % remove trailing spaces common to all rows. Implicitly display

2

JavaScript (ES6), 171 149 148 байт

a=>a.map(s=>(t=' '.repeat(--i)+s,l=t.match` *`[0].length,n=l<n?l:n,t),n=i=a.length).map(s=>s.slice(n).replace(/./g,c=>"|/__ "["\\|/_ ".indexOf(c)]))

Принимает и возвращает строки в виде массива строк.

Редактировать: 22 байта сохранены благодаря @ user81655. Сохраняется 1 байт, понимая, что ввод ограничен 5 символами \|/_и пробелом.


replaces может быть объединен в .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)может быть match` *`, первые два maps могут быть объединены a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., внешние скобки ( (a=...)) теперь могут быть удалены. 149 байт:a=>a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),n=i=a.length).map(s=>s.slice(n).replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]))
user81655,

@ user81655 Ого, спасибо! (Затем я немного испортил это, сыграв в байт ваш replace.)
Нил

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