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
,/
etspaces
,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!
Réponses:
Rétine , 88 octets
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
Nous commençons par faire correspondre l'indentation sur chaque ligne et l'insérer
├──
.Étape 2: substitution
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
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 groupe1
avec(?>(?<-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.la source
+`(?<=(.*))\|(?!.+¶\1[|├])
(espace)+`(?<=(.*))├(?!.+¶\1[│├└])
└
?m`^ *
$&└──
T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
JavaScript (ES6),
237128 octetsOù
\n
représente le caractère de nouvelle ligne littéral. Explication:r
est créé à partir des
en 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 deq
, 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.la source