ASCII sanatını italikleştirmek


32

Bir ASCII sanat resminin bir girişi göz önüne alındığında, italik hale getirilmiş ASCII sanatının çıktısını alın.

ASCII sanatını italik hale getirmek için:

  1. Son satırdan önce sıfır boşluk, ikinci satırdan önce bir boşluk, üçüncü satırdan önce iki boşluk, vb.

  2. Oluşturulmuş olabilecek tüm diğer boşlukları kaldırın. Diğer bir deyişle, her satırın nönünde en az boşluk varsa, nher satırın başındaki boşlukları kaldırın .

  3. Tümünü \s ile değiştirin |, hepsi |s ile /ve hepsi /s ile _. Var _olanları aynı tut .

    Giriş sadece karakter \|/_ve boşluk içerecek şekilde garanti edilir .

Örneğin, giriş

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

çıktı gerekir

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

sırayla girdi olarak sağlanan çıktılar

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

hangi çıktı

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

Giriş ve çıkış, tek bir dize (isteğe bağlı izleyen yeni satırlı) veya satır dizisi olabilir.

Bu olduğundan, bayttaki en kısa kod kazanır.

Ekstra test durumları:

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


________
________


(yani, boş dizgenin girişi boş dizgenin çıktısıyla sonuçlanır)


Girişin bir dikdörtgene yattığını varsayabilir miyiz?
Martin Ender

2
Her çıktı satırında sondaki boşluklar kabul edilebilir mi?
Luis Mendo

@ MartinBüttner Evet, yapabilirsiniz.
Doorknob

@DonMuesli Firar boşlukları tamam, sadece ön boşluk yok.
Doorknob

Dikdörtgen bir dizi (matris) olarak girdi alabilir miyiz?
Adám

Yanıtlar:


6

CJam, 43 38 bayt

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

Girişin bir dikdörtgene yastığını gerektirir.

Çevrimiçi deneyin!

açıklama

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.

Anekdot, ancak PCCG'yi sorudan denedim, her çıktıyı programa geri besledim, ancak bir dikdörtgene dolmadan. İyi çalıştı.
alexwlchan

@alexwlchan Evet, sınırlayıcı dikdörtgenin ötesindeki izleyen boşluklar önemli değil (ama mutlaka korunmayacak). Ancak, örneğin orijinal PPCG örneğinin kendisini alırsanız ve içindeki boşlukları kaldırırsanız G, dönüşüm onu ​​en üste indirecektir.
Martin Ender

4

Pyth, 32

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

Burada deneyin veya Test Suite'i çalıştırın

Her çizginin birkaç izleri vardır. Bu .r, dizenin her satırına yerleşik rotasyonun hangisi olduğunu uygulayarak çalışır . Döndürme, dizgideki her bir karakteri diğer argümandaki biri ile eşleşen "\|/__"ve bir sonraki karakterle değiştirir. Çift alt çizgi, alt çizgilerin ters eğik çizgi olmasını önler. Dizeler ayrıca dizinlerine göre doldurulur.

Bu yapıldıktan sonra, çizgiler bir araya toplanır, sonra sadece boşluk içeren her bir sütunu filtreleriz. Sonra fermuarını açıp yeni hatlara katılırız.


4

MATL , 38 33 29 bayt

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

Çıktı çizgileri en uzun çizgiyle eşleşecek boşluklara sahiptir (buna meydan okuma tarafından izin verilir).

Giriş, dizelerin bir hücre dizisidir (listesi). Dizi küme ayraçları kullanır ve dizeler aşağıdaki gibi tek tırnak işaretleri kullanır ( çevrimiçi olarak denemek için her bağlantıyı tıklayın ! ).

  • İlk örnek :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • İkinci örnek :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Üçüncü örnek :

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

açıklama

Dizi başlangıçta çevrilir. Her dize bir döngüde işlenir ve değiştirilen dize yığının üstüne itilir. İşlem, karakterleri değiştirmekten ve birkaç boşluk eklemekten ibarettir. Boşluk sayısı, kümedeki mevcut öğe sayısına eşittir (dizinin çevrilmiş olması nedeniyle).

Döngüden sonra, diziler geri çevrilen, bir 2D karakter dizisine dönüştürülen ve istenmeyen öncü alanlardan arındırılmış bir dizide toplanır: 2B karakter dizisinin tüm satırlarında bulunan öncü boşluklar.

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 bayt

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

Satırları bir dizi dizisi olarak kabul eder ve döndürür.

Düzenleme: @ user81655 sayesinde 22 bayt kaydedildi. Girişin 5 karakter \|/_ve boşluk ile sınırlı olduğunun farkına varmak suretiyle 1 bayt kaydedildi .


replaces birleştirilebilir .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)olabilir match` *`, ilk iki maps birleştirilebilir a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., dış parantezler ( (a=...)) şimdi çıkarılabilir. 149 bayt: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 Vay, teşekkürler! (O zaman, bir bayt golf oynayarak onu biraz şımarttım replace.)
Neil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.