H Tree Directories


12

I programmatori sono spesso ossessionati dal disegno di frattali. Penso che abbiamo bisogno di un nuovo supporto basato su computer.

L' albero H è un tipo abbastanza semplice di frattale fatto di linee orizzontali e verticali. Eccolo alla sua decima iterazione (per gentile concessione di Wikipedia ):

Albero H.

Ora, immagina che ciascuna delle linee nell'immagine sia una directory (cartella) in un file system standard per computer. Tutte tranne le linee più piccole intersecano due linee più piccole di loro; queste due linee più piccole sono sottodirectory della linea più grande. Quindi la grande linea orizzontale al centro è la directory principale delle due più grandi linee verticali, che sono a loro volta genitori, nonni, ecc. Del resto delle linee nell'immagine.

Sfida

Scrivi un programma che accetta un numero intero positivo N tramite stdin o la riga di comando (o l'alternativa più vicina) e crea un albero di directory che rispecchia l'ennesima iterazione del frattale dell'albero H.

La prima iterazione (N = 1) è una singola linea orizzontale. In ogni iterazione successiva viene aggiunto un nuovo set di linee verticali o orizzontali alle estremità delle linee correnti. Quindi per N = 2 vengono aggiunte due linee verticali (creando una forma ad H), per N = 3 vengono aggiunte quattro linee orizzontali, ecc.

Il nome della directory principale deve essere sempre tree. I nomi delle sottodirectory devono corrispondere la direzione che sono in rispetto alla loro linea di genitore, utilizzando right, left, upe down.

Poiché la directory principale è sempre una linea orizzontale avrà sempre righte leftsottodirectory. Ma quei due avranno upe downsottodirectory, e quelli avranno righte leftancora, e così via.

Le directory alla fine del limite di iterazioni dovrebbero essere vuote.

Esempio

Per N = 3 l'albero delle directory dovrebbe apparire così:

tree
    right
        up
        down
    left
        up
        down

Informazioni addizionali

  • Idealmente la treedirectory apparirà nella stessa cartella in cui si trova il codice sorgente, ma va bene se va in una directory funzionante.
  • Puoi presumere che non ci sia una treedirectory preesistente nel luogo in cui verrà creata la tua.
  • Puoi presumere che il tuo programma sarà sempre eseguito sullo stesso sistema operativo moderno comune (Mac / Windows / Linux). Fondamentalmente non preoccuparti di usare un separatore di file che non funziona in tutti i sistemi operativi.

punteggio

Questo è code-golf, quindi vince il codice più breve in byte .


Le sottodirectory di treedevono sempre essere lefte rightinvece di upe down?
KSFT,

1
@KSFT Sì: "Poiché la directory principale è sempre una linea orizzontale, avrà sempre le sottodirectory destra e sinistra."
Hobby di Calvin il

Risposte:


5

Rubino, 127 byte

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

Testato su Windows. Accetta input tramite STDIN.

fgenera in modo ricorsivo un elenco delle foglie richieste dell'albero, e quindi le inserisco in una sola chiamata di sistema di 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)

è leggermente più breve da farefrom os import*;s=system
DenDenDo

Altre due cose: puoi anche fare ["left","up"][n%2]e puoi lasciare le parentesi intorno (0,1)per darefor i in 0,1:
Sp3000

2

Python 2 + * nix coreutils, 212 189

Genera tutti i percorsi e le chiamate più interne

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

Si arresta in modo anomalo se input <1


puoi combinare le prime due righe:import os,itertools as t
DenDenDo

@DenDenDo Rimossi completamente itertools
user80551
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.