m`^ *
$&├──
{4}
|
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶
Cobalah online!
Saya kira saya bisa secara teknis menghitung ini sebagai satu byte per karakter dengan menukar beberapa karakter, membaca sumber sebagai ISO 8859-1 dan kemudian menemukan pengkodean byte tunggal untuk output yang berisi ├dan └, tetapi saya tidak dapat diganggu untuk bekerja Rinciannya sekarang. (Sebagai catatan, itu akan menjadi 72 byte.)
Penjelasan
Tahap 1: Substitusi
m`^ *
$&├──
Kami mulai dengan mencocokkan indentasi pada setiap baris dan memasukkan ├──.
Tahap 2: Substitusi
{4}
|
Selanjutnya, kami mencocokkan setiap grup yang terdiri dari 4 spasi dan mengganti yang pertama dengan a |. Sekarang semua yang perlu diperbaiki adalah |yang menuju ke bagian bawah output dan ├yang seharusnya └. Kedua kasus tersebut dapat dikenali dengan melihat karakter langsung di bawah yang berpotensi ingin kita ubah.
Tahap 3: Transliterasi
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
The (?<=(.)*)jumlah berapa banyak karakter mendahului pertandingan pada baris saat ini untuk mengukur posisi itu horizontal. Kemudian lookahead melompat ke baris berikutnya dengan .+¶, cocok dengan karakter sebanyak yang kami tangkap dalam grup 1dengan (?>(?<-1>.)*)(untuk maju ke posisi horizontal yang sama) dan kemudian memeriksa apakah karakter berikutnya (yaitu yang di bawah pertandingan yang sebenarnya) adalah salah satu dari |├└. Jika itu masalahnya, pertandingan gagal, dan dalam semua kasus lainnya pertandingan berhasil dan panggung menggantikan ruang untuk |dan └untuk ├.
Ini tidak akan memperbaiki semua karakter dalam sekali jalan, jadi kami menerapkan tahap ini berulang kali dengan +opsi sampai output berhenti berubah.
Tahap 4: Substitusi
^
.¶
Semua yang tersisa adalah baris pertama, jadi kami cukup mencocokkan awal string dan menambahkan .dan linefeed.