Mettre en italique l'art ASCII

32

Étant donné l'entrée d'une image d'art ASCII, sortez l'art ASCII en italique.

Pour mettre en italique l'art ASCII:

  1. Insérez zéro espace avant la dernière ligne, un espace avant l'avant-dernière ligne, deux espaces avant l'avant-dernière ligne, etc.

  2. Supprimez tous les espaces blancs de tête supplémentaires qui peuvent avoir été créés. Autrement dit, si chaque ligne a au moins des nespaces la précédant, supprimez les nespaces du début de chaque ligne.

  3. Remplacez tous les \s par |, tous les |s par /et tous les /s par _. Gardez _les mêmes existants .

    L'entrée est garantie pour contenir uniquement les caractères \|/_et l'espace.

Par exemple, l'entrée

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

doit sortir

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

qui à son tour, fourni en entrée, sorties

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

qui produirait

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

L'entrée et la sortie peuvent être soit une seule chaîne (avec un retour à la ligne facultatif) ou un tableau de lignes.

Puisqu'il s'agit de , le code le plus court en octets gagnera.

Cas de test supplémentaires:

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


________
________


(c'est-à-dire que l'entrée d'une chaîne vide entraîne la sortie d'une chaîne vide)

Poignée de porte
la source
Pouvons-nous supposer que l'entrée est complétée par un rectangle?
Martin Ender
2
Les espaces de fin sont-ils acceptables dans chaque ligne de sortie?
Luis Mendo
@ MartinBüttner Oui, vous le pouvez.
Poignée de porte
@DonMuesli Les espaces de fin sont corrects, juste aucun espace de début.
Poignée de porte
Pouvons-nous prendre l'entrée comme un tableau rectangulaire (matrice)?
Adám

Réponses:

6

CJam, 43 38 octets

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

Nécessite que l'entrée soit complétée par un rectangle.

Essayez-le en ligne!

Explication

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
la source
Anecdotique, mais j'ai essayé l'exemple PCCG de la question, en réintroduisant chaque sortie dans le programme, mais sans remplissage dans un rectangle. A bien fonctionné.
alexwlchan
@alexwlchan Eh bien oui, les espaces de fin au-delà du rectangle englobant n'ont pas d'importance (mais ne seront pas nécessairement préservés). Mais si vous prenez l'exemple PPCG original lui-même par exemple, et supprimez les espaces de fin à l'intérieur de la Galors la transformation la réduira au sommet.
Martin Ender
4

Pyth, 32

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

Essayez-le ici ou exécutez la suite de tests

Chaque ligne a plusieurs espaces de fin. Cela fonctionne en appliquant .rquelle est la rotation intégrée à chaque ligne de la chaîne. La rotation prend chaque caractère de la chaîne qui correspond à l'un dans l'autre argument "\|/__"et le remplace par le caractère suivant. Le double trait de soulignement empêche bien les traits de soulignement de devenir des barres obliques inverses. Les chaînes sont également remplies en fonction de leur index.

Une fois cela fait, les lignes sont zippées ensemble, puis nous filtrons chaque colonne qui ne contient que des espaces, jusqu'à ce que l'une d'entre elles ne le fasse pas. Ensuite, nous décompressons et nous rejoignons sur les nouvelles lignes.

FryAmTheEggman
la source
4

MATL , 38 33 29 octets

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

Les lignes de sortie ont des espaces de fin pour correspondre à la ligne la plus longue (cela est autorisé par le défi).

L'entrée est un tableau de cellules (liste) de chaînes. Le tableau utilise des accolades et les chaînes utilisent des guillemets simples, comme suit (cliquez sur chaque lien pour l' essayer en ligne! ).

  • Premier exemple :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Deuxième exemple :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Troisième exemple :

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

Explication

Le tableau est initialement inversé. Chaque chaîne est traitée dans une boucle et la chaîne modifiée est poussée sur la pile. Le traitement consiste à remplacer les caractères et à ajouter plusieurs espaces. Le nombre d'espaces est égal au nombre actuel d'éléments dans la pile (grâce au fait que le tableau a été inversé).

Après la boucle, les chaînes sont collectées dans un tableau, qui est retourné, converti en un tableau de caractères 2D et éliminé les espaces de début indésirables: les espaces de tête qui sont présents dans toutes les lignes du tableau de caractères 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
la source
2

JavaScript (ES6), 171 149 148 octets

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

Accepte et renvoie des lignes sous forme de tableau de chaînes.

Edit: enregistré 22 octets grâce à @ user81655. 1 octet enregistré en réalisant que l'entrée est limitée aux 5 caractères \|/_et à l'espace.

Neil
la source
replaceles s peuvent être combinés en .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)peuvent être match` *`, les deux premiers maps peuvent être combinés en a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., les parenthèses externes ( (a=...)) peuvent maintenant être supprimées. 149 octets: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, merci! (Ensuite, je l'ai un peu gâché en jouant un octet sur votre replace.)
Neil