Arborescence graphique de la structure du répertoire

9

Convertissez une structure de répertoire classique comme celle-ci:

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

Dans ce

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • Quatre espaces spécifient un dossier ou un fichier imbriqué du répertoire ci-dessus.
  • Les niveaux des catégories imbriquées autorisés peuvent varier.

Mise à jour

  • noms de fichiers : noms de fichiers Linux valides sans espaces ni sauts de ligne: tout octet sauf NUL, /et spaces,linefeeds
  • dessiner des personnages:
    • | ligne verticale (U + 007C)
    • dessins de boîtes horizontaux légers (U + 2500)
    • dessins de boîte à lumière verticale et droite (U + 251C)

Gagnant : le code le plus court en octets gagne!

marcanuy
la source
1
Bienvenue chez PPCG! Bon premier post!
Rɪᴋᴇʀ
Les lignes verticales sont-elles censées être des lignes verticales \ x7C ou des dessins de boîte \ u2502 verticaux légers?
Neil
@Neil Je n'étais pas au courant de "Box Drawings Light Vertical", j'ai utilisé "Vertical Line" dans l'exemple et il y a déjà deux réponses à cela. Il serait plus judicieux d'utiliser l'ancien de toute façon, car les deux autres personnages sont des dessins de boîte type , dois-je mettre à jour la question avec \ u2502?
marcanuy
Étant donné que je ne peux pas facilement taper des caractères de dessin de boîte dans ma REPL de choix, j'ai écrit ma réponse en utilisant les caractères L, + et -, puis j'ai ajusté le score en croyant que vous utilisiez des caractères de dessin de boîte tout au long, bien que je venais en fait de copier et de collé de votre question sans vérification. Si la ligne verticale est acceptable, je pourrais réduire mon score de 1.
Neil
1
Excellent, car il enregistre maintenant mes 2 octets sur ma nouvelle réponse!
Neil

Réponses:

2

Rétine , 88 octets

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

Essayez-le en ligne!

Je suppose que je pourrais techniquement compter cela comme un octet par caractère en échangeant certains caractères, en lisant la source comme ISO 8859-1 puis en trouvant un codage à un octet pour la sortie qui contient et , mais je ne peux pas être dérangé de travailler les détails en ce moment. (Pour mémoire, ce serait 72 octets.)

Explication

Étape 1: substitution

m`^ *
$&├── 

Nous commençons par faire correspondre l'indentation sur chaque ligne et l'insérer ├──.

Étape 2: substitution

 {4}
|   

Ensuite, nous faisons correspondre chaque groupe de 4 espaces et remplaçons le premier par un | . Maintenant, tout ce qui doit être corrigé est d' |aller au bas de la sortie et cela devrait l'être . Ces deux cas peuvent être reconnus en regardant le personnage directement en dessous de celui que nous voulons potentiellement changer.

Étape 3: translittération

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

Le (?<=(.)*)nombre de caractères précédant la correspondance sur la ligne actuelle pour mesurer sa position horizontale. Ensuite, l'anticipation passe à la ligne suivante avec .+¶, correspond à autant de caractères que nous avons capturés dans le groupe 1avec (?>(?<-1>.)*)(pour avancer à la même position horizontale), puis vérifie si le caractère suivant (c'est-à-dire celui en dessous de la correspondance réelle) est l'un des|├└ . Si c'est le cas, le match échoue, et dans tous les autres cas, il réussit et la scène substitue des espaces pour |et pour .

Cela ne résoudra pas tous les caractères en une seule fois, nous appliquons donc cette étape à plusieurs reprises avec l' +option jusqu'à ce que la sortie cesse de changer.

Étape 4: substitution

^
.¶

Tout ce qui reste est la première ligne, donc nous faisons simplement correspondre le début de la chaîne et ajoutons un .et un saut de ligne.

Martin Ender
la source
Explication s'il vous plait?
Neil
@Neil Voilà.
Martin Ender
Serait-il utile d'utiliser +`(?<=(.*))\|(?!.+¶\1[|├])(espace) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@Neil J'ai essayé quelque chose comme ça, mais je ne pense pas avoir réussi à économiser des octets avec.
Martin Ender
Nouvelle idée:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil
2

JavaScript (ES6), 237 128 octets

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

\nreprésente le caractère de nouvelle ligne littéral. Explication: rest créé à partir de sen ajoutant la .ligne au début et en insérant le └──à la fin du retrait de chaque ligne. Ceci est maintenant correct pour la dernière ligne de l'entrée, mais chacun doit être "étendu" vers le haut autant que possible. C'est le travail de q, qui recherche un et remplace récursivement les espaces directement au-dessus de lui par |s à moins qu'il n'atteigne un autre qui devient à la place. La récursivité se termine quand aucun autre remplacement ne peut être effectué. Notez que si le caractère au-dessus de est un espace ou un le texte à gauche de est toujours le même que celui de la ligne précédente, je peux donc simplement utiliser\1 pour tester que l'un des caractères est au-dessus de l'autre.

Neil
la source