Kursywa ASCII art

32

Biorąc pod uwagę obraz sztuki ASCII, tekst ASCII należy pisać kursywą.

Aby zapisać kursywą grafikę ASCII:

  1. Wstaw zero spacji przed ostatnią linią, jedną spację przed drugą ostatnią linią, dwie spacje przed trzecią ostatnią linią itp.

  2. Usuń wszelkie dodatkowe wiodące białe znaki, które mogły zostać utworzone. Oznacza to, że jeśli każda linia ma co najmniej nspacje poprzedzające ją, usuń nspacje na początku każdej linii.

  3. Zamień wszystkie \s na |, wszystkie |s na /i wszystkie /s na _. Zachowaj istniejące _s takie same.

    Dane wejściowe z pewnością zawierają tylko znaki \|/_i spację.

Na przykład dane wejściowe

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

musi generować

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

które z kolei dostarczone jako dane wyjściowe

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

co by wydało

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

Dane wejściowe i wyjściowe mogą być pojedynczym ciągiem (z opcjonalnym końcowym znakiem nowej linii) lub tablicą wierszy.

Ponieważ jest to , wygra najkrótszy kod w bajtach.

Dodatkowe przypadki testowe:

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


________
________


(to znaczy, że wprowadzenie pustego ciągu powoduje wyjście pustego ciągu)

Klamka
źródło
Czy możemy założyć, że dane wejściowe są wypełnione prostokątem?
Martin Ender
2
Czy końcowe spacje są dopuszczalne w każdej linii wyjściowej?
Luis Mendo
@ MartinBüttner Tak, możesz.
Klamka
@DonMuesli Spacje końcowe są w porządku, po prostu nie ma spacji wiodących.
Klamka
Czy możemy przyjmować dane wejściowe jako tablicę prostokątną (macierz)?
Adám

Odpowiedzi:

6

CJam, 43 38 bajtów

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

Wymaga dopełnienia wejścia do prostokąta.

Wypróbuj online!

Wyjaśnienie

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
źródło
Anegdota, ale wypróbowałem przykład PCCG z pytania, przesyłając każde wyjście z powrotem do programu, ale bez dopełniania prostokąta. Działało dobrze
alexwlchan
@alexwlchan No tak, końcowe spacje poza ograniczającym prostokątem nie mają znaczenia (ale niekoniecznie zostaną zachowane). Ale jeśli weźmiesz na przykład oryginalny przykład PPCG i usuniesz końcowe spacje wewnątrz, Gwówczas transformacja zwinie go do góry.
Martin Ender
4

Pyth, 32

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

Wypróbuj tutaj lub uruchom pakiet testowy

Każda linia ma kilka końcowych spacji. Działa to poprzez zastosowanie .rwbudowanego obrotu do każdej linii łańcucha. Rotacja bierze każdy znak w ciągu, który pasuje do jednego w drugim argumencie "\|/__"i zastępuje go kolejnym znakiem. Podwójny znak podkreślenia ładnie zapobiega odwróceniu znaków podkreślenia. Ciągi są również wypełniane na podstawie ich indeksu.

Po zakończeniu wiersze są spakowane razem, a następnie odfiltrowujemy każdą kolumnę, która zawiera tylko spacje, dopóki jedna z nich nie będzie. Następnie rozpakowujemy i dołączamy do nowych linii.

FryAmTheEggman
źródło
4

MATL , 38 33 29 bajtów

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

Linie wyjściowe mają końcowe spacje, aby dopasować najdłuższą linię (jest to dozwolone przez wyzwanie).

Dane wejściowe to tablica komórek (lista) ciągów. Tablica używa nawiasów klamrowych, a ciągi znaków używają pojedynczych cudzysłowów w następujący sposób (kliknij każdy link, aby wypróbować online! ).

  • Pierwszy przykład :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Drugi przykład :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Trzeci przykład :

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

Wyjaśnienie

Tablica jest początkowo odwrócona. Każdy ciąg jest przetwarzany w pętli, a zmodyfikowany ciąg jest wypychany na stos. Przetwarzanie polega na zamianie znaków i dodawaniu spacji. Liczba spacji jest równa bieżącej liczbie elementów na stosie (dzięki temu, że tablica została odwrócona).

Po pętli ciągi znaków są gromadzone w tablicy, która jest odwracana, przekształcana w tablicę znaków 2D i usuwana z niechcianych spacji wiodących: spacji wiodących obecnych we wszystkich rzędach tablicy znaków 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
źródło
2

JavaScript (ES6), 171 149 148 bajtów

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

Akceptuje i zwraca linie jako tablicę ciągów.

Edycja: Zapisano 22 bajty dzięki @ user81655. Zaoszczędzono 1 bajt, wiedząc, że dane wejściowe są ograniczone do 5 znaków \|/_i spacji.

Neil
źródło
replaces mogą być łączone w .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)mogą być match` *`, pierwsze dwa maps mogą być łączone w a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., zewnętrzne nawiasy ( (a=...)) mogą być teraz usunięte. 149 bajtów: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, dzięki! (W pewnym sensie zepsułem to, grając w twój bajt replace.)
Neil
2

Dyalog APL (starsze wersje), 23 48 bajtów

Dostosowanie białych znaków jest kosztowne:

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

Wymaga to ⎕ML←0, co było domyślne do niedawna .

Adám
źródło