Treefication grafico della struttura di directory


9

Converti una struttura di directory classica come questa:

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

In questo

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Quattro spazi specificano una cartella o un file nidificati della directory sopra.
  • I livelli di categorie nidificate consentiti possono variare.

Aggiornare

  • nomi file : nomi file Linux validi senza spazi e avanzamenti riga: qualsiasi byte tranne NUL, /e spaces,linefeeds
  • personaggi di disegno:
    • | linea verticale (U + 007C)
    • disegni a scatola luce orizzontale (U + 2500)
    • disegni a scatola luce verticale e destra (U + 251C)

Vincitore : vince il codice più corto in byte!


1
Benvenuti in PPCG! Bel primo post!
Rɪᴋᴇʀ

Le linee verticali dovrebbero essere \ x7C Vertical Line o \ u2502 Box Drawings Light Vertical?
Neil,

@Neil Non ero a conoscenza di "Disegni a scatola verticale verticale", ho usato "Linea verticale" nell'esempio e ci sono già due risposte. Avrebbe più senso usare il primo comunque perché gli altri due caratteri sono del tipo Disegni a riquadro , dovrei aggiornare la domanda con \ u2502?
marcanuy,

Dal momento che non riesco a digitare facilmente i caratteri del disegno a scatola nel mio REPL preferito, ho scritto la mia risposta usando i caratteri L, + e -, e quindi ho aggiustato il punteggio credendo che stessi usando i caratteri del disegno a scatola, anche se in effetti avevo appena copiato e incollato dalla tua domanda senza controllare. Se la linea verticale è accettabile, potrei ridurre il mio punteggio di 1.
Neil

1
Eccellente, dal momento che ora salva i miei 2 byte sulla mia nuova risposta!
Neil,

Risposte:


2

Retina , 88 byte

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

Provalo online!

Suppongo che potrei tecnicamente contare questo come un byte per carattere scambiando alcuni caratteri, leggendo l'origine come ISO 8859-1 e quindi trovando una codifica a byte singolo per l'output che contiene e , ma non posso preoccuparmi di lavorare i dettagli adesso. (Per la cronaca, sarebbero 72 byte.)

Spiegazione

Fase 1: sostituzione

m`^ *
$&├── 

Iniziamo abbinando il rientro su ciascuna riga e inserendo ├──.

Fase 2: sostituzione

 {4}
|   

Quindi, abbiniamo ogni gruppo di 4 spazi e sostituiamo il primo con a |. Ora tutto ciò che deve essere risolto è |andare in fondo all'output e dovrebbe essere . Entrambi questi casi possono essere riconosciuti guardando il personaggio direttamente sotto quello che potenzialmente vogliamo cambiare.

Fase 3: traslitterazione

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

I (?<=(.)*)conteggi quanti caratteri precedono la partita sulla linea di corrente per misurare la posizione orizzontale è di. Poi i cassonetti guardano avanti alla riga successiva con .+¶, partite come molti personaggi come abbiamo imprigionati nel gruppo 1con (?>(?<-1>.)*)(per avanzare alla stessa posizione orizzontale) e poi controlla se il carattere successivo (cioè quello al di sotto della partita reale) è uno dei |├└. In tal caso, la partita ha esito negativo e in tutti gli altri casi ha esito positivo e lo stage sostituisce gli spazi per |e per .

Questo non risolverà tutti i personaggi in una singola corsa, quindi applichiamo questo stage ripetutamente con l' +opzione fino a quando l'output non smette di cambiare.

Fase 4: sostituzione

^
.¶

Tutto ciò che rimane è la prima riga, quindi abbiniamo semplicemente l'inizio della stringa e anteponiamo ae .un avanzamento riga.


Spiegazione per favore?
Neil,

@Neil Ecco qua.
Martin Ender,

Aiuterebbe a usare +`(?<=(.*))\|(?!.+¶\1[|├])(spazio) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil,

@Neil Ho provato qualcosa del genere ma non credo di essere riuscito a salvare byte con esso.
Martin Ender,

Nuova idea: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)

Dove \nrappresenta il carattere letterale di newline. Spiegazione: rviene creato santeponendo la .riga e inserendo il carattere └──alla fine del rientro di ciascuna riga. Questo è ora corretto per l'ultima riga dell'input, ma ognuno deve essere "esteso" verso l'alto il più possibile. Questo è il lavoro di q, che cerca un e sostituisce ricorsivamente gli spazi direttamente sopra di esso con |s, a meno che non raggiunga un altro che viene invece trasformato in . La ricorsione termina quando non è possibile effettuare ulteriori sostituzioni. Si noti che se il carattere sopra il è uno spazio o un quindi il testo a sinistra del è sempre lo stesso di quello della riga precedente, quindi posso semplicemente usare\1 per verificare che un personaggio sia sopra l'altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.