Poner en cursiva el arte ASCII

32

Dada una entrada de una imagen de arte ASCII, muestra el arte ASCII en cursiva.

Para poner en cursiva el arte ASCII:

  1. Inserte cero espacios antes de la última línea, un espacio antes de la penúltima línea, dos espacios antes de la tercera última línea, etc.

  2. Elimine cualquier espacio en blanco inicial adicional que pueda haberse creado. Es decir, si cada línea tiene al menos nespacios que la preceden, elimine nespacios desde el principio de cada línea.

  3. Reemplace todas las \s con |, todas las |s con /, y todas las /s con _. Mantener existentes _s igual.

    La entrada está garantizada para contener solo los caracteres \|/_y el espacio.

Por ejemplo, la entrada

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

debe salir

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

que a su vez, provisto como entrada, salidas

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

que daría salida

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

La entrada y la salida pueden ser una sola cadena (con una nueva línea final opcional) o una matriz de líneas.

Como se trata de , ganará el código más corto en bytes.

Casos de prueba adicionales:

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


________
________


(es decir, la entrada de una cadena vacía da como resultado la salida de una cadena vacía)

Pomo de la puerta
fuente
¿Podemos suponer que la entrada está rellenada a un rectángulo?
Martin Ender
2
¿Son aceptables los espacios finales en cada línea de salida?
Luis Mendo
@ MartinBüttner Sí, puedes.
Pomo de la puerta
@DonMuesli Los espacios finales están bien, solo que no hay espacios iniciales.
Pomo de la puerta
¿Podemos tomar la entrada como una matriz rectangular (matriz)?
Adám

Respuestas:

6

CJam, 43 38 bytes

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

Requiere que la entrada se rellene en un rectángulo.

Pruébalo en línea!

Explicación

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.
Martin Ender
fuente
Anecdótico, pero probé el ejemplo de PCCG de la pregunta, alimentando cada salida al programa, pero sin rellenar un rectángulo. Funcionó bien.
alexwlchan
@alexwlchan Bueno, sí, los espacios finales más allá del rectángulo delimitador no importan (pero no se conservarán necesariamente). Pero si toma el ejemplo PPCG original, por ejemplo, y elimina los espacios finales dentro de él G, la transformación lo colapsará a la parte superior.
Martin Ender
4

Pyth, 32

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

Pruébelo aquí o ejecute Test Suite

Cada línea tiene varios espacios finales. Esto funciona aplicando .rcuál es la rotación incorporada a cada línea de la cadena. La rotación toma cada carácter en la cadena que coincide con uno en el otro argumento "\|/__"y lo reemplaza con el siguiente carácter. El doble guión bajo evita que los guiones bajos se conviertan en barras invertidas. Las cadenas también se rellenan según su índice.

Una vez hecho esto, las líneas se comprimen juntas, luego filtramos cada columna que solo contiene espacios, hasta que una de ellas no. Luego descomprimimos y nos unimos en nuevas líneas.

FryAmTheEggman
fuente
4

MATL , 38 33 29 bytes

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

Las líneas de salida tienen espacios finales para coincidir con la línea más larga (esto lo permite el desafío).

La entrada es una matriz de celdas (lista) de cadenas. La matriz usa llaves, y las cadenas usan comillas simples, de la siguiente manera (haga clic en cada enlace para ¡ Pruébelo en línea! ).

  • Primer ejemplo :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Segundo ejemplo :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Tercer ejemplo :

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

Explicación

La matriz se voltea inicialmente. Cada cadena se procesa en un bucle y la cadena modificada se inserta en la pila. El procesamiento consiste en reemplazar los caracteres y agregar varios espacios. El número de espacios es igual al número actual de elementos en la pila (gracias al hecho de que la matriz se ha volteado).

Después del bucle, las cadenas se recopilan en una matriz, que se voltea, se convierte en una matriz de caracteres 2D y se eliminan los espacios iniciales no deseados: espacios iniciales que están presentes en todas las filas de la matriz de caracteres 2D.

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
Luis Mendo
fuente
2

JavaScript (ES6), 171 149 148 bytes

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)]))

Acepta y devuelve líneas como un conjunto de cadenas.

Editar: Guardado 22 bytes gracias a @ user81655. Se guardó 1 byte al darse cuenta de que la entrada está limitada a los 5 caracteres \|/_y al espacio.

Neil
fuente
replaces pueden combinarse .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)pueden ser match` *`, los primeros dos maps pueden combinarse a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., los paréntesis externos ( (a=...)) ahora pueden eliminarse. 149 bytes: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 Wow, gracias! (Luego lo eché a perder jugando un byte con tu golf replace.)
Neil