Dizin Yapısı Grafiksel Ağaçlandırma


9

Bunun gibi klasik bir dizin yapısını dönüştürün:

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

Bunun içine

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Dört boşluk, yukarıdaki dizin için bir iç içe klasör veya dosya belirtir.
  • İzin verilen iç içe kategori düzeyleri değişiklik gösterebilir.

Güncelleme

  • dosya adları : geçerli Linux boşluk ve hat beslemeleri olmadan filenames: Herhangi bayt hariç NUL, /ve spaces,linefeeds
  • çizim karakterleri:
    • | dikey çizgi (U + 007C)
    • kutu çizimleri hafif yatay (U + 2500)
    • Drawings kutu çizimleri hafif dikey ve sağ (U + 251C)

Kazanan : Bayt'taki en kısa kod kazanır!


1
PPCG'ye Hoşgeldiniz! Güzel ilk gönderi!
R

Dikey çizgilerin \ x7C Dikey Çizgi mi yoksa \ u2502 Kutu Çizimleri Açık Dikey mi?
Neil

@Neil "Kutu Çizimleri Hafif Dikey" nin farkında değildim, örnekte "Dikey Çizgi" kullandım ve bununla ilgili iki cevap var. Zaten birincisini kullanmak daha mantıklı olurdu, çünkü diğer iki karakter Kutu Çizimleri türüdür, soruyu \ u2502 ile güncellemeliyim?
marcanuy

Seçtiğim REPL'e kolayca kutu çizim karakterleri yazamadığım için, cevabımı L, + ve - karakterlerini kullanarak yazdım ve daha sonra kutu çizim karakterlerini kullandığınıza inanan skoru ayarladım, aslında kopyaladım ve kontrol etmeden sorunuzdan yapıştırıldı. Dikey çizgi kabul edilebilirse puanımı 1 azaltabilirim.
Neil

1
Mükemmel, şimdi yeni cevabımda 2 bayt kaydettiğim için!
Neil

Yanıtlar:


2

Retina , 88 bayt

m`^ *
$&├── 
 {4}
|   
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶

Çevrimiçi deneyin!

Ben teknik olarak, bazı karakterleri değiştirerek ISO 8859-1 olarak kaynağını okuma ve daha sonra içeren çıkış için tek bayt kodlama bularak karakterin başına bir bayt olarak sayarız herhalde ve ama işe rahatsız olamaz şimdi ayrıntıları. (Kayıt için bu 72 bayt olur.)

açıklama

Aşama 1: Değiştirme

m`^ *
$&├── 

Her satırdaki girintiyi eşleştirerek ve ekleyerek başlıyoruz ├──.

Aşama 2: Değiştirme

 {4}
|   

Daha sonra, 4 boşluktan oluşan her grubu eşleştiriyoruz ve ilkini a ile değiştiriyoruz |. Şimdi sabitlenmesi gereken tek |şey, çıktının altına gitmek ve olması gerektiği . Bu durumların her ikisi de, potansiyel olarak değiştirmek istediğimiz karakterin altındaki karaktere bakarak tanınabilir.

Aşama 3: Harf çevirisi

T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])

(?<=(.)*)Birçok karakter geçerli satırda maçı öncesinde nasıl sayar 's yatay pozisyonunu ölçmek için. Sonra bir sonraki satıra ileri yönlü atlama .+¶, birçok biz grubunda yakalanan ettik karakterler olarak maçlar 1ile (?>(?<-1>.)*)(aynı yatay pozisyona önceden için) ve daha sonra çek (yani gerçek maçında aşağıdakine) sonraki karakterin biri olup olmadığını |├└. Eğer durum buysa, maç başarısız olur ve diğer tüm durumlarda başarılı olur ve sahne, |ve için boşlukların yerini alır .

Bu, tüm karakterleri tek bir işlemde düzeltmez, bu nedenle +çıktı değişmeyi bırakana kadar bu aşamayı seçenekle tekrar tekrar uygularız .

Aşama 4: Değiştirme

^
.¶

Geriye kalan tek şey ilk satırdır, bu nedenle dizenin başlangıcıyla eşleşiriz .ve a ve satır beslemenin başına geliriz .


Açıklama lütfen?
Neil

@Neil İşte.
Martin Ender

+`(?<=(.*))\|(?!.+¶\1[|├])(Boşluk) kullanmaya yardımcı olur +`(?<=(.*))├(?!.+¶\1[│├└]) mu?
Neil

@Neil Böyle bir şey denedim ama bayt kaydetmeyi başardığımı sanmıyorum.
Martin Ender

Yeni fikir:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil

2

JavaScript (ES6), 237 128 bayt

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

Burada \ngerçek satırsonu karakterini temsil eder. Açıklama: roluşturulur sprepending tarafından .hattı ve ekleme └──her çizginin girinti sonunda. Bu şimdi girişin son satırı için doğrudur, ancak her biri mümkün olduğunca yukarı doğru "genişletilmelidir". Bu, qa'yı arayan ve onun yerine dönüştürülen bir |başkasına ulaşmadıkça , doğrudan üstündeki boşlukları s ile yinelemeli olarak değiştirir . Başka bir değişiklik yapılamadığında özyineleme sona erer. Yukarıdaki karakter bir boşluk veya bir boşluksa, solundaki metnin her zaman önceki satırdakiyle aynı olduğunu unutmayın, böylece sadece\1 bir karakterin diğerinin üzerinde olduğunu test etmek için.

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.