Colocar em itálico a arte ASCII

32

Dada a entrada de uma imagem artística ASCII, produza a arte ASCII em itálico.

Para colocar em itálico a arte ASCII:

  1. Insira zero espaços antes da última linha, um espaço antes da segunda e última linha, dois espaços antes da terceira e última linha, etc.

  2. Remova qualquer espaço em branco extra à esquerda que possa ter sido criado. Ou seja, se cada linha tiver pelo menos nespaços anteriores, remova os nespaços do início de cada linha.

  3. Substitua todos \s com |, todos |s com /e todos /s com _. Mantenha os existentes _iguais.

    A entrada é garantida para conter apenas os caracteres \|/_e espaço.

Por exemplo, a entrada

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

deve produzir

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

que, por sua vez, fornecido como entrada, produz

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

o que produziria

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

A entrada e a saída podem ser uma única sequência (com nova linha à direita opcional) ou uma matriz de linhas.

Como esse é o , o código mais curto em bytes será vencedor.

Casos de teste extras:

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


________
________


(ou seja, a entrada da cadeia vazia resulta na saída da cadeia vazia)

Maçaneta da porta
fonte
Podemos assumir que a entrada é preenchida com um retângulo?
Martin Ender
2
Os espaços à direita são aceitáveis ​​em cada linha de saída?
Luis Mendo
@ MartinBüttner Sim, você pode.
Maçaneta
@DonMuesli Os espaços à direita são bons, apenas não há espaços à esquerda.
Maçaneta
Podemos considerar a entrada como uma matriz retangular (matriz)?
Adám 01/03/16

Respostas:

6

CJam, 43 38 bytes

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

Requer que a entrada seja preenchida em um retângulo.

Experimente online!

Explicação

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
fonte
Anedótico, mas tentei o exemplo PCCG da pergunta, alimentando cada saída novamente no programa, mas sem preencher um retângulo. Funcionou bem.
precisa saber é o seguinte
@alexwlchan Bem, sim, espaços à direita além do retângulo delimitador não importam (mas não serão necessariamente preservados). Mas se você pegar o exemplo original do PPCG, por exemplo, e remover os espaços finais dentro do G, a transformação o reduzirá ao topo.
Martin Ender
4

Pyth, 32

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

Experimente aqui ou execute o Test Suite

Cada linha possui vários espaços à direita. Isso funciona aplicando .rqual é a rotação interna para cada linha da string. A rotação pega cada caractere na string que corresponde a um no outro argumento "\|/__"e o substitui pelo próximo caractere. O sublinhado duplo evita que os sublinhados se tornem barras invertidas. As cadeias também são preenchidas com base em seu índice.

Feito isso, as linhas são compactadas e filtramos cada coluna que contém apenas espaços, até que uma delas não. Em seguida, descompactamos e ingressamos em novas linhas.

FryAmTheEggman
fonte
4

MATL , 38 33 29 bytes

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

As linhas de saída têm espaços à direita para corresponder à linha mais longa (isso é permitido pelo desafio).

Entrada é uma matriz de células (lista) de seqüências de caracteres. A matriz usa chavetas e as seqüências de caracteres usam aspas simples, como a seguir (clique em cada link para Experimentar online! ).

  • Primeiro exemplo :

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

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Terceiro exemplo :

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

Explicação

A matriz é invertida inicialmente. Cada sequência é processada em um loop e a sequência modificada é empurrada para a pilha. O processamento consiste em substituir os caracteres e anexar vários espaços. O número de espaços é igual ao número atual de elementos na pilha (graças ao fato de a matriz ter sido invertida).

Após o loop, as seqüências são coletadas em uma matriz, que é invertida, convertida em uma matriz de caracteres 2D e descartada de espaços iniciais indesejados: espaços iniciais presentes em todas as linhas da 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
fonte
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)]))

Aceita e retorna linhas como uma matriz de seqüências de caracteres.

Editar: salvou 22 bytes graças a @ user81655. Economizou 1 byte ao perceber que a entrada é limitada a 5 caracteres \|/_e espaço.

Neil
fonte
replaces podem ser combinados em .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)podem ser match` *`, os dois primeiros maps podem ser combinados em a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., parênteses externos ( (a=...)) agora podem ser removidos. 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 2/16
@ user81655 Uau, obrigado! (Então eu um pouco estragado pelo golfe um byte fora de seu replace.)
Neil
2

Dyalog APL (versões mais antigas), 23 48 bytes

Ajustar o espaço em branco é caro:

{{⍵↓⍨0,⌊/+/∧\' '=⍵}(⍳≢⍵)⌽'|/ _'['\| '⍳(∊,⊢,∊)⍵]}

Isso requer ⎕ML←0, que era o padrão até recentemente .

Adão
fonte