Directorios de árbol H

12

Los programadores a menudo están obsesionados con dibujar fractales. Creo que necesitamos un nuevo medio informático.

El árbol H es un tipo bastante simple de fractal hecho de líneas horizontales y verticales. Aquí está en su décima iteración ( cortesía de Wikipedia ):

Árbol H

Ahora, imagine que cada una de las líneas de la imagen es un directorio (carpeta) en un sistema de archivos de computadora estándar. Todas menos las líneas más pequeñas se cruzan con dos líneas más pequeñas que ellas; Estas dos líneas más pequeñas son subdirectorios de la línea más grande. Por lo tanto, la línea horizontal grande en el medio es el directorio padre de las dos líneas verticales más grandes, que son a su vez padres, abuelos, etc. del resto de las líneas de la imagen.

Desafío

Escriba un programa que tome un entero positivo N a través de stdin o la línea de comando (o la alternativa más cercana) y cree un árbol de directorios que refleje la enésima iteración del fractal del árbol H.

La primera iteración (N = 1) es una sola línea horizontal. En cada iteración posterior, se agrega un nuevo conjunto de líneas verticales u horizontales a los extremos de las líneas actuales. Entonces para N = 2 se agregan dos líneas verticales (formando una H), para N = 3 se agregan cuatro líneas horizontales, etc.

El nombre del directorio raíz siempre debe ser tree. Los nombres de los subdirectorios deben coincidir con la dirección que están en relación con su línea parental, utilizando right, left, upy down.

Desde el directorio raíz es siempre una línea horizontal que siempre tendrá righty leftsubdirectorios. Sin embargo, los dos tendrán upy downsubdirectorios, y los tendrá righty leftotra vez, y así sucesivamente.

Los directorios al final del límite de iteraciones deben estar vacíos.

Ejemplo

Para N = 3, el árbol de directorios debería verse así:

tree
    right
        up
        down
    left
        up
        down

Información adicional

  • Idealmente, el treedirectorio aparecerá en la misma carpeta en la que se encuentra el código fuente, pero está bien si va a algún directorio de trabajo.
  • Puede suponer que no hay un treedirectorio preexistente en el lugar donde se creará el suyo.
  • Puede suponer que su programa siempre se ejecutará en el mismo sistema operativo moderno común (Mac / Windows / Linux). Básicamente, no se preocupe por usar un separador de archivos que no funcione en todos los sistemas operativos.

Puntuación

Este es el código de golf, por lo que gana el código más corto en bytes .

Pasatiempos de Calvin
fuente
¿Los subdirectorios de treesiempre tienen que ser lefty en rightlugar de upy down?
KSFT
1
@KSFT Sí: "Dado que el directorio raíz siempre es una línea horizontal, siempre tendrá subdirectorios derecho e izquierdo".
Calvin's Hobbies

Respuestas:

5

Rubí, 127 bytes

f=->n{n<2?['tree']:f[n-1].map{|p|%w{left right up down}[n%2*2,2].map{|d|p+?/+d}}.flatten}
system'mkdir "'+f[gets.to_i]*'" "'+?"

Probado en Windows. Toma entrada a través de STDIN.

fgenera de forma recursiva una lista de las hojas requeridas del árbol, y luego las alimento a una sola llamada al sistema mkdir.

Martin Ender
fuente
3

Lua, 179

t=0+io.read()a={"left","right","up","down"}function h(d,v)if v~=t then os.execute("mkdir "..d)x=1 if v%2==1 then x=3 end for g=x,x+1 do h(d.."\\"..a[g],v+1)end end end h("tree",0)
CJStuart
fuente
2

Python - 194

from os import system as s
a="mkdir "
s(a+"tree")
def f(n):
 if n<j%2:return
 for i in(0,1):m=["up"if n%2 else"left","rdiogwhnt"[n%2::2]][i];s(a+m);s("cd "+m);f(n-1);s("cd..")
j=input()
f(j+j%2)
KSFT
fuente
es un poco más corto de hacerfrom os import*;s=system
DenDenDo
Dos cosas más: también puede hacer ["left","up"][n%2]y puede dejar los corchetes (0,1)para darfor i in 0,1:
Sp3000
2

Python 2 + * nix coreutils, 212 189

Genera todas las rutas y llamadas más internas.

mkdir -p

import os
n=int(raw_input())-1 
for i in range(2**n):os.system("mkdir -p "+os.path.join('tree',*([['right','left'],['up','down']][b%2][int(j)]for b,j in enumerate('{:0{}b}'.format(i,n)))))

Se bloquea si la entrada <1

usuario80551
fuente
puede combinar las dos primeras líneas:import os,itertools as t
DenDenDo
@DenDenDo Se eliminaron completamente las herramientas iterativas
user80551