Corsivo ASCII art


32

Dato un input di un'immagine di arte ASCII, output di arte ASCII in corsivo.

Per scrivere in corsivo l'arte ASCII:

  1. Inserisci zero spazi prima dell'ultima riga, uno spazio prima dell'ultima riga, due spazi prima dell'ultima riga, ecc.

  2. Rimuovere eventuali spazi bianchi iniziali aggiuntivi che potrebbero essere stati creati. Cioè, se ogni riga ha almeno nspazi che la precedono, rimuovere gli nspazi dall'inizio di ogni riga.

  3. Sostituisci tutte le \s con |, tutte le |s con /e tutte le /s con _. Mantieni _lo stesso esistente .

    L'ingresso è garantito per contenere solo i caratteri \|/_e lo spazio.

Ad esempio, l'input

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

deve produrre

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

che a sua volta, fornito come input, output

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

quale sarebbe uscita

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

L'input e l'output possono essere una singola stringa (con newline finale opzionale) o una matrice di linee.

Dato che si tratta di , vincerà il codice più breve in byte.

Casi di prova extra:

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


________
________


(ovvero, l'inserimento di una stringa vuota comporta l'output di una stringa vuota)


Possiamo supporre che l'input sia riempito con un rettangolo?
Martin Ender

2
Gli spazi finali sono accettabili in ciascuna linea di uscita?
Luis Mendo,

@ MartinBüttner Sì, puoi.
Maniglia della porta

@DonMuesli Gli spazi finali sono ok, ma non ci sono spazi iniziali.
Maniglia della porta

Possiamo prendere l'input come una matrice rettangolare (matrice)?
Adám

Risposte:


6

CJam, 43 38 byte

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

Richiede che l'input sia riempito con un rettangolo.

Provalo online!

Spiegazione

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.

Aneddotico, ma ho provato l'esempio PCCG dalla domanda, reinserendo ogni output nel programma, ma senza riempire con un rettangolo. Ha funzionato bene.
alexwlchan,

@alexwlchan Beh, sì, gli spazi finali oltre il rettangolo di delimitazione non contano (ma non saranno necessariamente conservati). Ma se prendi ad esempio l'esempio PPCG originale stesso e rimuovi gli spazi finali all'interno di Gallora la trasformazione lo farà collassare in alto.
Martin Ender,

4

Pyth, 32

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

Provalo qui o esegui Test Suite

Ogni riga ha diversi spazi finali. Funziona applicando .rquale è la rotazione incorporata in ciascuna riga della stringa. La rotazione prende ogni carattere nella stringa che corrisponde a uno nell'altro argomento "\|/__"e lo sostituisce con il carattere successivo. Il doppio carattere di sottolineatura impedisce che i caratteri di sottolineatura diventino barre rovesciate. Le stringhe sono anche riempite in base al loro indice.

Una volta fatto ciò, le linee vengono compresse insieme, quindi filtriamo ogni colonna che contiene solo spazi, fino a quando una di esse non lo fa. Quindi decomprimiamo e ci uniamo a newline.


4

MATL , 38 33 29 byte

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

Le linee di output hanno spazi finali per corrispondere alla linea più lunga (ciò è consentito dalla sfida).

L'input è un array di celle (elenco) di stringhe. L'array utilizza parentesi graffe e le stringhe utilizzano virgolette singole, come indicato di seguito (fare clic su ciascun collegamento per provarlo online! ).

  • Primo esempio :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Secondo esempio :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Terzo esempio :

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

Spiegazione

L'array viene inizialmente capovolto. Ogni stringa viene elaborata in un ciclo e la stringa modificata viene inserita nello stack. L'elaborazione consiste nel sostituire i caratteri e aggiungere un numero di spazi. Il numero di spazi è uguale al numero corrente di elementi nello stack (grazie al fatto che l'array è stato capovolto).

Dopo il ciclo, le stringhe vengono raccolte in un array, che viene capovolto, convertito in un array di caratteri 2D e eliminato spazi iniziali indesiderati: spazi iniziali presenti in tutte le righe dell'array di caratteri 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

2

JavaScript (ES6), 171 149 148 byte

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

Accetta e restituisce le righe come una matrice di stringhe.

Modifica: salvato 22 byte grazie a @ user81655. Salvato 1 byte realizzando che l'ingresso è limitato a 5 caratteri \|/_e spazio.


replacele s possono essere combinate in .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)possono essere match` *`, le prime due maps possono essere combinate in a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., le parentesi esterne ( (a=...)) possono ora essere rimosse. 149 byte: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, grazie! (Poi l'ho rovinato un po 'giocando a golf un byte dal tuo replace.)
Neil

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.