Répertoires arborescents H

12

Les programmeurs sont souvent obsédés par le dessin de fractales. Je pense que nous avons besoin d'un nouveau support informatique.

L' arbre H est un type de fractale assez simple composé de lignes horizontales et verticales. Le voici à sa dixième itération ( avec la permission de Wikipedia ):

Arbre H

Maintenant, imaginez que chacune des lignes de l'image est un répertoire (dossier) dans un système de fichiers informatique standard. Toutes les lignes sauf les plus petites coupent deux lignes plus petites qu’elles; ces deux lignes plus petites sont des sous - répertoires de la ligne plus grande. Ainsi, la grande ligne horizontale au milieu est le répertoire parent des deux plus grandes lignes verticales, qui sont à leur tour les parents, les grands-parents, etc. du reste des lignes de l'image.

Défi

Écrivez un programme qui prend un entier positif N via stdin ou la ligne de commande (ou l'alternative la plus proche) et crée une arborescence de répertoires qui reflète la Nème itération de la fractale de l'arbre H.

La première itération (N = 1) est une seule ligne horizontale. À chaque itération suivante, un nouvel ensemble de lignes verticales ou horizontales est ajouté aux extrémités des lignes actuelles. Donc pour N = 2 deux lignes verticales sont ajoutées (en faisant une forme en H), pour N = 3 quatre lignes horizontales sont ajoutées à cela, etc.

Le nom du répertoire racine doit toujours être tree. Les noms des sous - répertoires doivent correspondre à la direction qu'ils sont en ce qui concerne leur lignée parentale, en utilisant right, left, upet down.

Comme le répertoire racine est toujours une ligne horizontale, il aura toujours des sous right- leftrépertoires. Mais ces deux auront upet downsous - répertoires, et ceux-ci auront rightet leftencore, et ainsi de suite.

Les répertoires à la fin de la limite d'itérations doivent être vides.

Exemple

Pour N = 3, l'arborescence de répertoires devrait ressembler à ceci:

tree
    right
        up
        down
    left
        up
        down

Information additionnelle

  • Idéalement, le treerépertoire apparaîtra dans le même dossier que le code source, mais ce n'est pas grave s'il va dans un répertoire de travail.
  • Vous pouvez supposer qu'il n'y a pas de treerépertoire préexistant à l'endroit où le vôtre sera créé.
  • Vous pouvez supposer que votre programme sera toujours exécuté sur le même système d'exploitation moderne commun (Mac / Windows / Linux). Fondamentalement, ne vous inquiétez pas d'utiliser un séparateur de fichiers qui ne fonctionne pas dans tous les systèmes d'exploitation.

Notation

Il s'agit de code-golf, donc le code le plus court en octets l' emporte.

Loisirs de Calvin
la source
Les sous-répertoires de treedoivent-ils toujours être leftet rightau lieu de upet down?
KSFT
1
@KSFT Oui: "Puisque le répertoire racine est toujours une ligne horizontale, il aura toujours des sous-répertoires droit et gauche."
Calvin's Hobbies

Réponses:

5

Rubis, 127 octets

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

Testé sous Windows. Prend entrée via STDIN.

fgénère récursivement une liste des feuilles requises de l'arborescence, puis je les alimente simplement à un seul appel système de mkdir.

Martin Ender
la source
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
la source
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
la source
c'est un peu plus court à fairefrom os import*;s=system
DenDenDo
Deux autres choses: vous pouvez aussi faire ["left","up"][n%2]et vous pouvez laisser tomber les crochets (0,1)pour donnerfor i in 0,1:
Sp3000
2

Python 2 + * nix coreutils, 212 189

Génère tous les chemins et appels les plus intérieurs

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 bloque si entrée <1

user80551
la source
vous pouvez combiner les deux premières lignes:import os,itertools as t
DenDenDo
@DenDenDo Suppression complète d'itertools
user80551