Struktur Direktori Treefication Grafis

9

Konversi struktur direktori klasik seperti ini:

config.yml
drafts
    begin-with-the-crazy-ideas.textile
    on-simplicity-in-technology.markdown
includes
    footer.html
    header.html

Ke dalam ini

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Empat spasi menentukan folder atau file dari direktori di atas.
  • Level kategori bersarang yang diizinkan dapat bervariasi.

Memperbarui

  • nama file : nama file Linux yang valid tanpa spasi dan umpan baris: byte apa pun kecuali NUL, /dan spaces,linefeeds
  • menggambar karakter:
    • | garis vertikal (U + 007C)
    • gambar kotak cahaya horisontal (U + 2500)
    • kotak gambar cahaya vertikal dan kanan (U + 251C)

Pemenang : Kode Terpendek dalam Bytes menang!

marcanuy
sumber
1
Selamat datang di PPCG! Posting pertama yang bagus!
Rɪᴋᴇʀ
Apakah garis vertikal seharusnya \ x7C Garis Vertikal atau \ u2502 Box Drawings Light Vertical?
Neil
@Neil Saya tidak mengetahui "Box Drawings Light Vertical", saya telah menggunakan "Vertical Line" pada contoh dan sudah ada dua jawaban dengan itu. Akan lebih masuk akal untuk menggunakan yang pertama karena dua karakter lainnya adalah tipe Gambar Kotak , haruskah saya memperbarui pertanyaan dengan \ u2502?
marcanuy
Karena saya tidak bisa dengan mudah mengetikkan karakter menggambar kotak ke dalam REPL pilihan saya, saya menulis jawaban saya menggunakan karakter L, + dan -, dan kemudian menyesuaikan skor dengan percaya bahwa Anda menggunakan karakter menggambar kotak di seluruh, walaupun saya sebenarnya hanya menyalin dan disisipkan dari pertanyaan Anda tanpa memeriksa. Jika garis vertikal dapat diterima, saya dapat mengurangi skor saya dengan 1.
Neil
1
Luar biasa, karena sekarang menyimpan 2 byte saya pada jawaban baru saya!
Neil

Jawaban:

2

Retina , 88 byte

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.

Martin Ender
sumber
Penjelasannya tolong?
Neil
@Neil Ini dia.
Martin Ender
Apakah akan membantu menggunakan +`(?<=(.*))\|(?!.+¶\1[|├])(spasi) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@Neil Saya mencoba sesuatu seperti itu tetapi saya tidak berpikir saya berhasil menyelamatkan byte dengan itu.
Martin Ender
Gagasan baru:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil
2

JavaScript (ES6), 237 128 byte

f=(s,r=`.\n`+s.replace(/^ */gm,"$&└── "),q=r.replace(/^(.*)( |└)(?=.+\n\1[|└])/m,(_,i,j)=>i+`|├`[+(j>' ')]))=>q==r?r:f(s,q)

Dimana \nmewakili karakter baris baru literal. Penjelasan: rdibuat dari sdengan mendahulukan .baris dan memasukkan └──di akhir setiap indentasi baris. Ini sekarang benar untuk baris terakhir dari input, tetapi masing - masing harus "diperpanjang" ke atas sejauh mungkin. Ini adalah tugas dari q, yang mencari dan secara rekursif mengganti spasi tepat di atasnya dengan |s kecuali jika mencapai yang lain yang akan berubah menjadi gantinya. Rekursi berakhir ketika tidak ada penggantian lebih lanjut yang dapat dilakukan. Perhatikan bahwa jika karakter di atas adalah spasi atau maka teks di sebelah kiri selalu sama dengan yang ada di baris sebelumnya sehingga saya bisa menggunakan\1 untuk menguji bahwa satu karakter di atas yang lain.

Neil
sumber