Diretórios H Tree


12

Os programadores geralmente são obcecados em desenhar fractais. Acho que precisamos de um novo meio baseado em computador.

A árvore H é um tipo bastante simples de fractal feito de linhas horizontais e verticais. Aqui está a décima iteração ( cortesia da Wikipedia ):

Árvore H

Agora, imagine que cada uma das linhas da imagem seja um diretório (pasta) em um sistema de arquivos padrão do computador. Todas, exceto as linhas menores, cruzam duas linhas menores que elas mesmas; essas duas linhas menores são subdiretórios da linha maior. Assim, a grande linha horizontal no meio é o diretório pai das duas maiores linhas verticais, que, por sua vez, são pais, avós, etc. do restante das linhas da imagem.

Desafio

Escreva um programa que receba um número inteiro positivo N via stdin ou pela linha de comando (ou alternativa mais próxima) e crie uma árvore de diretórios que espelhe a enésima iteração do fractal da árvore H.

A primeira iteração (N = 1) é uma única linha horizontal. Em cada iteração subsequente, um novo conjunto de linhas verticais ou horizontais é adicionado às extremidades das linhas atuais. Portanto, para N = 2 são adicionadas duas linhas verticais (formando H), para N = 3 são adicionadas quatro linhas horizontais, etc.

O nome do diretório raiz deve sempre ser tree. Os nomes dos subdiretórios devem corresponder a direção que eles estão em com relação a sua linha pai, usando right, left, upe down.

Desde o diretório raiz é sempre uma linha horizontal que terá sempre righte leftsubdiretórios. Mas esses dois terão upe downsubdiretórios, e aqueles terão righte leftnovamente, e assim por diante.

Os diretórios no final do limite de iterações devem estar vazios.

Exemplo

Para N = 3, a árvore de diretórios deve ficar assim:

tree
    right
        up
        down
    left
        up
        down

Informação adicional

  • Idealmente, o treediretório aparecerá na mesma pasta em que o código-fonte está, mas tudo bem se for para algum diretório de trabalho.
  • Você pode presumir que não há treediretório pré-existente no local em que o seu será criado.
  • Você pode presumir que seu programa sempre será executado no mesmo sistema operacional moderno e comum (Mac / Windows / Linux). Basicamente, não se preocupe em usar um separador de arquivos que não funcione em todos os sistemas operacionais.

Pontuação

Isso é código-golfe, então o código mais curto em bytes vence.


Os subdiretórios treesempre devem ser lefte em rightvez de upe down?
KSFT

1
@KSFT Sim: "Como o diretório raiz é sempre uma linha horizontal, ele sempre terá subdiretórios direito e esquerdo."
Passatempos de Calvin

Respostas:


5

Ruby, 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]*'" "'+?"

Testado no Windows. Recebe entrada via STDIN.

fgera recursivamente uma lista das folhas necessárias da árvore e, em seguida, apenas as alimento para uma única chamada de sistema de mkdir.


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)

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)

seu ligeiramente mais curto para fazerfrom os import*;s=system
DenDenDo

Mais duas coisas: você também pode fazer ["left","up"][n%2]e soltar os colchetes (0,1)para darfor i in 0,1:
Sp3000 17/15/15

2

Python 2 + * nix coreutils, 212 189

Gera todos os caminhos e chamadas mais internos

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)))))

Falha se a entrada <1


você pode combinar as duas primeiras linhas:import os,itertools as t
DenDenDo 17/01/2015

@DenDenDo Removido completamente itertools
user80551 18/01/15
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.