Verzeichnisstruktur Grafische Treefication

9

Konvertieren Sie eine klassische Verzeichnisstruktur wie folgt:

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

Das mögen

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Vier Leerzeichen geben einen verschachtelten Ordner oder eine verschachtelte Datei des obigen Verzeichnisses an.
  • Die zulässigen Ebenen für verschachtelte Kategorien können variieren.

Aktualisieren

  • Dateinamen : gültig Linux Dateinamen ohne Leerzeichen und Zeilenumbrüche: alle Byte außer NUL, /und spaces,linefeeds
  • Zeichen zeichnen:
    • | vertikale Linie (U + 007C)
    • ─ Boxzeichnungen leuchten horizontal (U + 2500)
    • Box Zeichnungen Licht vertikal und rechts (U + 251C)

Gewinner : Der kürzeste Code in Bytes gewinnt!

marcanuy
quelle
1
Willkommen bei PPCG! Schöner erster Beitrag!
Rɪᴋᴇʀ
Sollen die vertikalen Linien \ x7C Vertical Line oder \ u2502 Box Drawings Light Vertical sein?
Neil
@Neil "Box Drawings Light Vertical" war mir nicht bekannt, ich habe im Beispiel "Vertical Line" verwendet und es gibt bereits zwei Antworten damit. Es wäre sinnvoller, das erstere zu verwenden, da die beiden anderen Zeichen vom Typ Box Drawings sind. Sollte ich die Frage mit \ u2502 aktualisieren?
Marcanuy
Da ich Box-Zeichen nicht einfach in meine REPL meiner Wahl eingeben kann, habe ich meine Antwort mit den Zeichen L, + und - geschrieben und dann die Punktzahl angepasst, da ich davon ausgegangen bin, dass Sie durchgehend Box-Zeichen verwendet haben, obwohl ich tatsächlich nur und kopiert habe aus Ihrer Frage eingefügt, ohne zu überprüfen. Wenn die vertikale Linie akzeptabel ist, könnte ich meine Punktzahl um 1 reduzieren.
Neil
1
Ausgezeichnet, da es jetzt meine 2 Bytes bei meiner neuen Antwort spart!
Neil

Antworten:

2

Netzhaut , 88 Bytes

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

Probieren Sie es online aus!

Ich nehme an, ich könnte dies technisch als ein Byte pro Zeichen zählen, indem ich einige Zeichen austausche, die Quelle als ISO 8859-1 lese und dann eine Einzelbyte-Codierung für die Ausgabe finde, die und enthält , aber ich kann nicht arbeiten jetzt die Details heraus. (Für den Datensatz wären das 72 Bytes.)

Erläuterung

Stufe 1: Substitution

m`^ *
$&├── 

Wir beginnen mit dem Abgleichen der Einrückung in jeder Zeile und dem Einfügen ├──.

Stufe 2: Substitution

 {4}
|   

Als nächstes passen wir jede Gruppe von 4 Feldern an und ersetzen das erste durch ein |. Jetzt muss nur noch |das behoben werden, was am Ende der Ausgabe steht, und das sollte auch so sein . Beide Fälle können erkannt werden, indem Sie den Charakter direkt unter dem betrachten, den wir möglicherweise ändern möchten.

Stufe 3: Transliteration

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

Die (?<=(.)*)Anzahl der Zeichen, die der Übereinstimmung in der aktuellen Zeile vorausgehen, um die horizontale Position zu messen. Dann werden die Look - Ahead springt in die nächste Zeile mit .+¶, Streichhölzer so viele Zeichen wie wir in der Gruppe aufgenommen haben 1mit (?>(?<-1>.)*)(zu vorher auf die gleiche horizontale Position) und dann überprüft , ob das nächste Zeichen (dh die unter dem eigentlichen Spiel) ist eine der |├└. Wenn dies der Fall ist, schlägt das Match fehl und in allen anderen Fällen ist es erfolgreich und die Bühne ersetzt Leerzeichen für |und für .

Dadurch werden nicht alle Zeichen in einem Durchgang behoben. Daher wenden wir diese Phase wiederholt mit der +Option an, bis sich die Ausgabe nicht mehr ändert.

Stufe 4: Substitution

^
.¶

Alles, was übrig bleibt, ist die erste Zeile, also passen wir einfach den Anfang der Zeichenfolge an und stellen einen .und einen Zeilenvorschub voran.

Martin Ender
quelle
Erklärung bitte?
Neil
@Neil Los geht's.
Martin Ender
Würde es helfen, +`(?<=(.*))\|(?!.+¶\1[|├])(Raum) zu verwenden +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@Neil Ich habe so etwas versucht, aber ich glaube nicht, dass ich damit Bytes sparen konnte.
Martin Ender
Neue Idee: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)

Wobei \ndas wörtliche Zeilenumbruchzeichen steht. Erläuterung: Wird rerstellt, sindem die .Zeile vorangestellt und └──am Ende des Einzugs jeder Zeile eingefügt wird. Dies ist jetzt für die letzte Zeile der Eingabe korrekt, aber jede muss so weit wie möglich nach oben "erweitert" werden. Dies ist die Aufgabe von q, die nach a sucht und die Leerzeichen direkt darüber rekursiv durch |s ersetzt, es sei denn, es erreicht ein anderes , in das stattdessen verwandelt wird. Die Rekursion endet, wenn keine weiteren Ersetzungen vorgenommen werden können. Beachten Sie, dass wenn das Zeichen über dem ein Leerzeichen oder ein Leerzeichen ist, der Text links von immer immer der gleiche ist wie der in der vorherigen Zeile, sodass ich ihn einfach verwenden kann\1 um zu testen, ob das eine Zeichen über dem anderen liegt.

Neil
quelle