Estructura de directorios Gráfica Treefication

9

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, /y spaces,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!

marcanuy
fuente
1
Bienvenido a PPCG! Bonito primer post!
Rɪᴋᴇʀ
¿Se supone que las líneas verticales son \ x7C Vertical Line o \ u2502 Box Drawings Light Vertical?
Neil
@Neil No estaba al tanto de "Dibujos de caja verticales verticales", he usado "Línea vertical" en el ejemplo y ya hay dos respuestas con eso. Tendría más sentido usar el anterior de todos modos porque los otros dos caracteres son del tipo Box Drawings , ¿debo actualizar la pregunta con \ u2502?
marcanuy
Como no puedo escribir fácilmente caracteres de dibujo de recuadro en mi REPL de elección, escribí mi respuesta usando caracteres L, + y -, y luego ajusté el puntaje creyendo que estaba usando caracteres de dibujo de recuadro, aunque de hecho solo había copiado y pegado de su pregunta sin verificar. Si la línea vertical es aceptable, podría reducir mi puntaje en 1.
Neil
1
Excelente, ya que ahora guarda mis 2 bytes en mi nueva respuesta.
Neil

Respuestas:

2

Retina , 88 bytes

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

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

m`^ *
$&├── 

Comenzamos haciendo coincidir la sangría en cada línea e insertando ├──.

Etapa 2: sustitución

 {4}
|   

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

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

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 grupo 1con (?>(?<-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.

Martin Ender
fuente
¿Explicación por favor?
Neil
@Neil Ahí tienes.
Martin Ender
¿Sería útil usar +`(?<=(.*))\|(?!.+¶\1[|├])(espacio) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@Neil Intenté algo así pero no creo que logré guardar bytes con él.
Martin Ender
Nueva idea:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil
2

JavaScript (ES6), 237128 bytes

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

Donde \nrepresenta el carácter literal de nueva línea. Explicación: rse crea desde santeponiendo 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 de q, 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.

Neil
fuente