H Katalogi drzew


12

Programiści często mają obsesję na punkcie rysowania fraktali. Myślę, że potrzebujemy nowego medium komputerowego.

Drzewa H jest dość prosty typ Wstęga z linii poziomych i pionowych. Oto jego dziesiąta iteracja ( dzięki uprzejmości Wikipedii ):

Drzewo H.

Teraz wyobraź sobie, że każda z linii na obrazie jest katalogiem (folderem) w standardowym systemie plików komputera. Wszystkie linie oprócz najmniejszych przecinają dwie linie mniejsze od siebie; te dwie mniejsze linie są podkatalogami większej linii. Tak więc duża pozioma linia pośrodku jest katalogiem nadrzędnym dwóch największych pionowych linii, które z kolei są rodzicami, dziadkami itp. Pozostałych linii na obrazie.

Wyzwanie

Napisz program, który przyjmuje dodatnią liczbę całkowitą N przez stdin lub wiersz poleceń (lub najbliższą alternatywę) i tworzy drzewo katalogów, które odzwierciedla N-tą iterację fraktala drzewa H.

Pierwsza iteracja (N = 1) to pojedyncza linia pozioma. W każdej kolejnej iteracji nowy zestaw linii pionowych lub poziomych jest dodawany na końcach bieżących linii. Tak więc dla N = 2 dodaje się dwie linie pionowe (tworząc kształt H), dla N = 3 dodaje się do tego cztery linie poziome itp.

Nazwa katalogu głównego musi zawsze być tree. Nazwy podkatalogów musi być zgodny z kierunkiem są w odniesieniu do ich linii dominującej, przy wykorzystaniu right, left, upi down.

Ponieważ katalog główny jest zawsze linią poziomą, zawsze będzie miał righti leftpodkatalogi. Ale te dwa będą miały upi downpodkatalogi, a te będą miały rightileft jeszcze raz, i tak dalej.

Katalogi na końcu limitu iteracji powinny być puste.

Przykład

Dla N = 3 drzewo katalogów powinno wyglądać następująco:

tree
    right
        up
        down
    left
        up
        down

Dodatkowe informacje

  • Idealnie treekatalog wyskakuje w tym samym folderze, w którym znajduje się kod źródłowy, ale jest w porządku, jeśli przejdzie do jakiegoś katalogu roboczego.
  • Możesz założyć, że nie ma wcześniej istniejącego treekatalogu w miejscu, w którym zostanie utworzony twój.
  • Możesz założyć, że Twój program będzie zawsze działał w tym samym wspólnym nowoczesnym systemie operacyjnym (Mac / Windows / Linux). Zasadniczo nie martw się o użycie separatora plików, który nie działa we wszystkich systemach operacyjnych.

Punktacja

To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach .


Czy podkatalogami treezawsze muszą być lefti rightzamiast upi down?
KSFT,

1
@KSFT Tak: „Ponieważ katalog główny jest zawsze linią poziomą, zawsze będzie miał prawy i lewy podkatalog.”
Calvin's Hobbies

Odpowiedzi:


5

Rubin, 127 bajtów

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

Testowane w systemie Windows. Pobiera dane wejściowe przez STDIN.

frekurencyjnie generuje listę wymaganych liści drzewa, a następnie po prostu karmię je jednym wywołaniem systemowym 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)

jest nieco krótszy do zrobieniafrom os import*;s=system
DenDenDo

Dwie dodatkowe rzeczy: możesz też zrobić ["left","up"][n%2]i możesz upuścić nawiasy, (0,1)aby daćfor i in 0,1:
Sp3000,

2

Python 2 + * nix coreutils, 212 189

Generuje wszystkie najbardziej wewnętrzne ścieżki i połączenia

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

Awarie, jeśli dane wejściowe <1


możesz połączyć dwie pierwsze linie:import os,itertools as t
DenDenDo

@DenDenDo Całkowicie usunięto itertools
80551
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.