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
,/
orazspaces
,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!
Odpowiedzi:
Siatkówka , 88 bajtów
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
Zaczynamy od dopasowania wcięcia na każdej linii i wstawienia
├──
.Etap 2: Zmiana
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
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 grupie1
z(?>(?<-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ę.źródło
+`(?<=(.*))\|(?!.+¶\1[|├])
(spacja)+`(?<=(.*))├(?!.+¶\1[│├└])
└
?m`^ *
$&└──
T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
JavaScript (ES6),
237128 bajtówGdzie
\n
reprezentuje dosłowny znak nowej linii. Objaśnienie:r
jest tworzonys
przez 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 naq
wyszukiwaniu „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ą.źródło