Miringkan seni ASCII

32

Diberikan input dari gambar seni ASCII, output seni ASCII dicetak miring.

Untuk memiringkan seni ASCII:

  1. Masukkan nol spasi sebelum baris terakhir, satu spasi sebelum baris kedua terakhir, dua spasi sebelum baris ketiga terakhir, dll.

  2. Hapus spasi kosong tambahan apa pun yang mungkin telah dibuat. Yaitu, jika setiap baris memiliki setidaknya nspasi sebelumnya, hapus nspasi dari awal setiap baris.

  3. Ganti semua \dengan |, semua |dengan /, dan semua /dengan _. Tetap ada _sama saja.

    Input dijamin hanya berisi karakter \|/_dan ruang.

Misalnya input

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

harus keluar

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

yang pada gilirannya, disediakan sebagai input, keluaran

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

yang akan menghasilkan

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

Input dan output dapat berupa string tunggal (dengan baris tambahan opsional) atau array baris.

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji ekstra:

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


________
________


(yaitu, input dari string kosong menghasilkan output dari string kosong)

Gagang pintu
sumber
Bisakah kita berasumsi bahwa input diisi ke persegi panjang?
Martin Ender
2
Apakah spasi tambahan dapat diterima di setiap jalur keluaran?
Luis Mendo
@ MartinBüttner Ya, Anda bisa.
Gagang pintu
@DonMuesli Trailing spasi tidak apa-apa, hanya saja tidak ada ruang utama.
Gagang pintu
Bisakah kita mengambil input sebagai array persegi panjang (matriks)?
Adám

Jawaban:

6

CJam, 43 38 byte

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

Membutuhkan input untuk diisi ke persegi panjang.

Cobalah online!

Penjelasan

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
sumber
Anekdotal, tapi saya mencoba contoh PCCG dari pertanyaan, memberi makan setiap output kembali ke program, tetapi tanpa padding ke persegi panjang. Bekerja dengan baik.
alexwlchan
@alexwlchan Yah ya, membuntuti spasi di luar persegi panjang yang terikat tidak masalah (tapi tidak harus dilestarikan). Tetapi jika Anda mengambil contoh PPCG asli itu sendiri misalnya, dan menghapus spasi di dalam Gmaka transformasi akan runtuh ke atas.
Martin Ender
4

Pyth, 32

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

Coba di sini atau jalankan Test Suite

Setiap baris memiliki beberapa spasi tambahan. Ini berfungsi dengan menerapkan .rrotasi bawaan ke setiap baris string. Rotasi mengambil setiap karakter dalam string yang cocok dengan satu di argumen lainnya"\|/__" dan menggantikannya dengan karakter berikutnya. Garis bawah ganda dengan baik mencegah garis bawah menjadi garis miring terbalik. String juga empuk berdasarkan indeks mereka.

Setelah selesai, garis-garis di-zip jadi satu, lalu kami menyaring setiap kolom yang hanya berisi spasi, sampai salah satunya tidak. Lalu kami unzip dan bergabung di baris baru.

FryAmTheEggman
sumber
4

MATL , 38 33 29 byte

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

Garis keluaran memiliki spasi tambahan untuk mencocokkan garis terpanjang (ini diizinkan oleh tantangan).

Input adalah array sel (daftar) string. Array menggunakan kurung kurawal, dan string menggunakan tanda kutip tunggal, sebagai berikut (klik setiap tautan untuk Coba online! ).

  • Contoh pertama :

    {'/\/\/\    /\/\/\      /\/\/\    /\/\/\'  ' /\    /\  /\    /\  /\        /\'  '  /\/\/\    /\/\/\    /\        /\  /\/\' '   /\        /\        /\        /\    /\' '    /\        /\          /\/\/\    /\/\/\'}
    
  • Contoh kedua :

    {'_|_|_|    _|_|_|      _|_|_|    _|_|_|' '_|    _|  _|    _|  _|        _|      ' '_|_|_|    _|_|_|    _|        _|  _|_|' '_|        _|        _|        _|    _|' '_|        _|          _|_|_|    _|_|_|'}
    
  • Contoh ketiga :

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

Penjelasan

Array awalnya dibalik. Setiap string diproses dalam satu lingkaran dan string yang dimodifikasi didorong ke tumpukan. Pemrosesan terdiri dalam mengganti karakter dan menambahkan sejumlah spasi. Jumlah spasi sama dengan jumlah elemen saat ini di tumpukan (berkat fakta bahwa array telah dibalik).

Setelah loop, string dikumpulkan dalam array, yang dibalik, dikonversi ke array char 2D, dan dibuang spasi yang tidak diinginkan: ruang terdepan yang hadir di semua baris array char 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
sumber
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)]))

Menerima dan mengembalikan garis sebagai array string.

Sunting: Disimpan 22 byte berkat @ user81655. Disimpan 1 byte dengan menyadari bahwa input terbatas pada 5 karakter \|/_dan ruang.

Neil
sumber
replaces dapat digabungkan menjadi .replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)bisa jadi match` *`, dua maps pertama dapat digabungkan menjadi a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),..., kurung luar ( (a=...)) sekarang dapat dihapus. 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, terima kasih! (Lalu saya agak merusaknya dengan memainkan golf dari byte Anda replace.)
Neil
2

Dyalog APL (versi yang lebih lama), 23 48 byte

Menyesuaikan spasi putih mahal:

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

Ini memerlukan ⎕ML←0, yang standar hingga saat ini .

Adm
sumber