Kursiv ASCII art

32

Bei einer Eingabe eines ASCII-Kunstbilds wird das ASCII-Kunstbild kursiv ausgegeben.

So setzen Sie die ASCII-Grafik in Kursivschrift:

  1. Fügen Sie vor der letzten Zeile keine Leerzeichen ein, ein Leerzeichen vor der vorletzten Zeile, zwei Leerzeichen vor der vorletzten Zeile usw.

  2. Entfernen Sie alle zusätzlichen führenden Leerzeichen, die möglicherweise erstellt wurden. Das heißt, wenn jeder Zeile mindestens nLeerzeichen vorangestellt sind, entfernen Sie nLeerzeichen am Anfang jeder Zeile.

  3. Ersetzen Sie alle \s mit |, alle |s mit /und alle /s mit _. Bestehendes _beibehalten.

    Die Eingabe enthält garantiert nur die Zeichen \|/_und Leerzeichen.

Zum Beispiel die Eingabe

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

muss ausgeben

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

was wiederum als Eingang, Ausgänge zur Verfügung gestellt

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

was ausgeben würde

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

Eingabe und Ausgabe können entweder eine einzelne Zeichenfolge (mit optionalem Zeilenumbruch) oder ein Array von Zeilen sein.

Da es sich um , wird der kürzeste Code in Bytes gewinnen.

Zusätzliche Testfälle:

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


________
________


(Das heißt, die Eingabe einer leeren Zeichenfolge führt zur Ausgabe einer leeren Zeichenfolge.)

Türknauf
quelle
Können wir annehmen, dass die Eingabe zu einem Rechteck aufgefüllt ist?
Martin Ender
2
Sind nachfolgende Leerzeichen in jeder Ausgabezeile zulässig?
Luis Mendo
@ MartinBüttner Ja, das kannst du.
Türklinke
@DonMuesli Nachgestellte Leerzeichen sind in Ordnung, nur keine führenden Leerzeichen.
Türklinke
Dürfen wir Eingaben als rechteckiges Array (Matrix) annehmen?
Adám

Antworten:

6

CJam, 43 38 Bytes

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

Erfordert, dass die Eingabe in ein Rechteck aufgefüllt wird.

Probieren Sie es online!

Erläuterung

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
quelle
Anekdotisch, aber ich habe das PCCG-Beispiel aus der Frage ausprobiert, wobei jede Ausgabe zurück in das Programm eingespeist wurde, jedoch ohne Auffüllen eines Rechtecks. Hat gut funktioniert.
Alexwlchan
@alexwlchan Nun ja, nachgestellte Leerzeichen jenseits des Begrenzungsrechtecks ​​spielen keine Rolle (werden aber nicht unbedingt beibehalten). Wenn Sie jedoch beispielsweise das ursprüngliche PPCG-Beispiel selbst nehmen und die nachgestellten Leerzeichen entfernen G, wird es durch die Transformation nach oben reduziert .
Martin Ender
4

Pyth, 32

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

Probieren Sie es hier aus oder starten Sie die Test Suite

Jede Zeile hat mehrere nachgestellte Leerzeichen. Dies funktioniert durch Anwenden .rder Rotation, die in jede Zeile der Zeichenfolge integriert ist. Bei der Drehung wird jedes Zeichen in der Zeichenfolge verwendet, das mit dem anderen Argument übereinstimmt, "\|/__"und durch das nächste Zeichen ersetzt. Der doppelte Unterstrich verhindert, dass Unterstriche zu Backslashes werden. Die Zeichenfolgen werden auch basierend auf ihrem Index aufgefüllt.

Sobald dies erledigt ist, werden die Zeilen zusammengezippt und jede Spalte, die nur Leerzeichen enthält, herausgefiltert, bis eine von ihnen dies nicht mehr tut. Dann entpacken wir und verbinden uns auf Newlines.

FryAmTheEggman
quelle
4

MATL , 38 33 29 Bytes

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

Ausgabezeilen haben nachgestellte Leerzeichen, um mit der längsten Zeile übereinzustimmen (dies ist durch die Abfrage zulässig).

Die Eingabe ist ein Zellenarray (Liste) von Zeichenfolgen. Das Array verwendet geschweifte Klammern und Zeichenfolgen einfache Anführungszeichen (klicken Sie auf jeden Link, um es online auszuprobieren! ).

  • Erstes Beispiel :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Zweites Beispiel :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Drittes Beispiel :

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

Erläuterung

Das Array wird zunächst gespiegelt. Jede Zeichenfolge wird in einer Schleife verarbeitet und die geänderte Zeichenfolge wird auf den Stapel geschoben. Bei der Verarbeitung werden die Zeichen ersetzt und eine Reihe von Leerzeichen angehängt. Die Anzahl der Leerzeichen entspricht der aktuellen Anzahl der Elemente im Stapel (dank der Tatsache, dass das Array gespiegelt wurde).

Nach der Schleife werden die Zeichenfolgen in einem Array gesammelt, das zurückgedreht, in ein 2D-Zeichen-Array konvertiert und von unerwünschten führenden Leerzeichen befreit wird: führende Leerzeichen, die in allen Zeilen des 2D-Zeichen-Arrays vorhanden sind.

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

Akzeptiert und gibt Zeilen als Array von Zeichenfolgen zurück.

Bearbeiten: 22 Bytes dank @ user81655 gespeichert. 1 Byte gespart, indem erkannt wurde, dass die Eingabe auf 5 Zeichen \|/_und Leerzeichen beschränkt ist.

Neil
quelle
replaces können kombiniert werden .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)können kombiniert werden match` *`, zuerst können zwei maps kombiniert werden a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., äußere Klammern ( (a=...)) können jetzt entfernt werden. 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, danke! (Dann habe ich es ein wenig verwöhnt, indem ich ein Byte von Ihrem golfen habe replace.)
Neil
2

Dyalog APL (ältere Versionen), 23 48 Bytes

Das Anpassen von Leerzeichen ist teuer:

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

Dies erfordert ⎕ML←0, was bis vor kurzem Standard war .

Adam
quelle