Struktura katalogów Graficzne drzewkowanie

9

Konwertuj klasyczną strukturę katalogów w następujący sposób:

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

Zaangażowany w to

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Cztery spacje określają zagnieżdżony folder lub plik powyższego katalogu.
  • Dopuszczalne poziomy kategorii zagnieżdżonych mogą się różnić.

Aktualizacja

  • nazwy plików : poprawne nazwy plików systemu Linux bez spacji i kanałów: dowolny bajt oprócz NUL, /oraz spaces,linefeeds
  • rysowanie znaków:
    • | linia pionowa (U + 007C)
    • rysunki w pudełku lekkie w poziomie (U + 2500)
    • rysunki w pudełku jasne pionowe i prawe (U + 251C)

Zwycięzca : Zwycięża najkrótszy kod w bajtach!

marcanuy
źródło
1
Witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
Czy pionowe linie mają być \ x7C Linia pionowa lub \ Rysunki ramek są jasne w pionie?
Neil
@Neil Nie wiedziałem o „Rysunkach ramek jasnych w pionie”, w przykładzie użyłem „linii pionowej” i są już na to dwie odpowiedzi. W każdym razie lepiej byłoby użyć pierwszego, ponieważ pozostałe dwa znaki są typu Rysunki w pudełku , czy powinienem zaktualizować pytanie za pomocą \ u2502?
marcanuy,
Ponieważ nie mogę łatwo wpisać znaków do rysowania w polu do mojej wybranej REPL, napisałem swoją odpowiedź używając znaków L, + i -, a następnie poprawiłem wynik, wierząc, że używasz znaków rysujących w pudełku, chociaż w rzeczywistości właśnie skopiowałem i wkleiłem z pytania bez sprawdzania. Jeśli pionowa linia jest akceptowalna, mógłbym zmniejszyć swój wynik o 1.
Neil
1
Doskonale, ponieważ teraz zapisuje moje 2 bajty na mojej nowej odpowiedzi!
Neil

Odpowiedzi:

2

Siatkówka , 88 bajtów

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

Wypróbuj online!

Podejrzewam, że technicznie mógłbym to policzyć jako jeden bajt na znak, zamieniając niektóre znaki, czytając źródło jako ISO 8859-1, a następnie znajdując kodowanie jednobajtowe dla danych wyjściowych, które zawierają i , ale nie przeszkadza mi praca teraz szczegóły. (Dla przypomnienia byłoby to 72 bajty).

Wyjaśnienie

Etap 1: Zmiana

m`^ *
$&├── 

Zaczynamy od dopasowania wcięcia na każdej linii i wstawienia ├──.

Etap 2: Zmiana

 {4}
|   

Następnie dopasowujemy każdą grupę 4 spacji i zastępujemy pierwszą spacją |. Teraz wszystko, co wymaga naprawy, to |przejście do dolnej części danych wyjściowych i tak powinno być . Oba te przypadki można rozpoznać, patrząc na postać bezpośrednio poniżej tej, którą potencjalnie chcemy zmienić.

Etap 3: Transliteracja

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

Do (?<=(.)*)liczy ile znaki poprzedzające spotkanie na bieżącej linii, aby zmierzyć jego pozycji poziomej. Następnie uprzedzona przejście do następnej linii z .+¶, mecze tyle znaków, ile mamy zrobionych w grupie 1z (?>(?<-1>.)*)(do góry do tej samej pozycji poziomej), a następnie sprawdza, czy następny znak (czyli ten poniżej rzeczywistej meczu) jest jednym z |├└. W takim przypadku dopasowanie kończy się niepowodzeniem, a we wszystkich innych przypadkach udaje się, a etap zastępuje spacje za |i za .

To nie naprawi wszystkich znaków w jednym przebiegu, dlatego stosujemy ten etap wielokrotnie z +opcją, aż wyjście przestanie się zmieniać.

Etap 4: Zmiana

^
.¶

Pozostaje tylko pierwsza linia, więc po prostu dopasowujemy początek łańcucha i poprzedzamy a .oraz linię.

Martin Ender
źródło
Wyjaśnienie proszę?
Neil,
@Neil Proszę bardzo.
Martin Ender,
Czy pomogłoby to w użyciu +`(?<=(.*))\|(?!.+¶\1[|├])(spacja) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@ Neil Próbowałem czegoś takiego, ale nie sądzę, że udało mi się zaoszczędzić bajty.
Martin Ender,
Nowy pomysł:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil
2

JavaScript (ES6), 237 128 bajtów

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

Gdzie \nreprezentuje dosłowny znak nowej linii. Objaśnienie: rjest tworzony sprzez poprzedzenie .linii i wstawienie └──na końcu wcięcia każdej linii. Jest to teraz poprawne dla ostatniego wiersza wejścia, ale każdy musi być „przedłużony” w górę tak daleko, jak to możliwe. Jest to zadanie polegające na qwyszukiwaniu „a” i rekursywnie zastępuje spacje bezpośrednio nad nim „ |s”, chyba że dotrze on do innego, który zamiast tego zostanie zamieniony . Rekurencja kończy się, gdy nie można dokonać dalszych zamian. Pamiętaj, że jeśli znak nad spacją to spacja lub a, to tekst po lewej stronie jest zawsze taki sam jak w poprzednim wierszu, więc mogę po prostu użyć\1 aby sprawdzić, czy jedna postać znajduje się nad drugą.

Neil
źródło