Convierta una estructura de directorio clásica como esta:
config.yml
drafts
begin-with-the-crazy-ideas.textile
on-simplicity-in-technology.markdown
includes
footer.html
header.html
Dentro de esto
.
├── config.yml
├── drafts
| ├── begin-with-the-crazy-ideas.textile
| └── on-simplicity-in-technology.markdown
└── includes
├── footer.html
└── header.html
- Cuatro espacios especifican una carpeta o archivo anidado del directorio anterior.
- Los niveles de categorías anidados permitidos pueden variar.
Actualizar
- nombres de archivo : nombres de archivo de Linux válidos sin espacios y saltos de línea: cualquier byte excepto
NUL
,/
yspaces
,linefeeds
- personajes de dibujo:
- El | línea vertical (U + 007C)
- ─ dibujos en caja horizontales claros (U + 2500)
- ├ dibujos en caja de luz vertical y derecha (U + 251C)
Ganador : ¡El código más corto en bytes gana!
Respuestas:
Retina , 88 bytes
Pruébalo en línea!
Supongo que técnicamente podría contar esto como un byte por carácter intercambiando algunos caracteres, leyendo la fuente como ISO 8859-1 y luego encontrando una codificación de un solo byte para la salida que contiene
├
y└
, pero no puedo molestarme en trabajar Fuera los detalles ahora mismo. (Para el registro, eso sería 72 bytes).Explicación
Etapa 1: sustitución
Comenzamos haciendo coincidir la sangría en cada línea e insertando
├──
.Etapa 2: sustitución
A continuación, hacemos coincidir cada grupo de 4 espacios y reemplazamos el primero con a
|
. Ahora todo lo que necesita arreglarse es|
ir al final de la salida y├
eso debería ser└
. Ambos casos pueden reconocerse mirando el personaje directamente debajo del que potencialmente queremos cambiar.Etapa 3: transliteración
Los
(?<=(.)*)
recuentos de cuántos caracteres preceden al partido en la línea actual para medir su posición horizontal. Luego, la búsqueda anticipada salta a la siguiente línea con.+¶
, coincide con tantos caracteres como hemos capturado en grupo1
con(?>(?<-1>.)*)
(para avanzar a la misma posición horizontal) y luego verifica si el siguiente carácter (es decir, el que está debajo de la coincidencia real) es uno de|├└
. Si ese es el caso, la coincidencia falla, y en todos los demás casos tiene éxito y el escenario sustituye espacios por|
y└
para├
.Esto no solucionará todos los caracteres en una sola ejecución, por lo que aplicamos esta etapa repetidamente con la
+
opción hasta que la salida deje de cambiar.Etapa 4: sustitución
Todo lo que queda es la primera línea, por lo que simplemente hacemos coincidir el comienzo de la cadena y anteponemos un salto de
.
línea.fuente
+`(?<=(.*))\|(?!.+¶\1[|├])
(espacio)+`(?<=(.*))├(?!.+¶\1[│├└])
└
?m`^ *
$&└──
T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
JavaScript (ES6),
237128bytesDonde
\n
representa el carácter literal de nueva línea. Explicación:r
se crea desdes
anteponiendo la.
línea e insertando└──
al final de la sangría de cada línea. Esto ahora es correcto para la última línea de la entrada, pero cada uno└
debe "extenderse" hacia arriba tanto como sea posible. Este es el trabajo deq
, que busca a└
y reemplaza recursivamente los espacios directamente encima de él con|
s a menos que llegue a otro└
que se convierte en su├
lugar. La recursión termina cuando no se pueden realizar más reemplazos. Tenga en cuenta que si el carácter sobre el└
es un espacio o a,└
entonces el texto a la izquierda del└
siempre es el mismo que el de la línea anterior, así que puedo usar\1
para probar que un personaje está por encima del otro.fuente