H Дерево каталогов

12

Программисты часто одержимы рисованием фракталов. Я думаю, что нам нужен новый компьютерный носитель.

Н дерево является довольно простым типом фрактала изготовлен из горизонтальных и вертикальных линий. Вот оно на десятой итерации ( любезно предоставлено Википедией ):

H дерево

Теперь представьте, что каждая из строк на изображении является каталогом (папкой) в стандартной компьютерной файловой системе. Все линии, кроме самых маленьких, пересекаются на две линии меньше их самих; эти две меньшие строки являются подкаталогами большей строки. Таким образом, большая горизонтальная линия в середине является родительским каталогом двух самых больших вертикальных линий, которые, в свою очередь, являются родителями, бабушкой и дедушкой и т. Д. Остальных линий на изображении.

Вызов

Напишите программу, которая принимает положительное целое число N через stdin или командную строку (или ближайшую альтернативу) и создает дерево каталогов, которое отражает N-ю итерацию фрактала H-дерева.

Первая итерация (N = 1) представляет собой одну горизонтальную линию. В каждой последующей итерации новый набор вертикальных или горизонтальных линий добавляется к концам текущих строк. Таким образом, для N = 2 добавляются две вертикальные линии (образующие Н-образную форму), для N = 3 к этому добавляются четыре горизонтальные линии и т. Д.

Имя корневого каталога всегда должно быть tree. Имена подкаталогов должны совпадать с направлением , они находятся в отношении их материнской линии, используя right, left, upи down.

Поскольку корневой каталог всегда горизонтальная линия , она всегда будет иметь rightи leftподкаталоги. Но у тех двоих будут upи downподкаталоги, и у тех будут rightи leftснова, и так далее.

Каталоги в конце лимита итераций должны быть пустыми.

пример

Для N = 3 дерево каталогов должно выглядеть так:

tree
    right
        up
        down
    left
        up
        down

Дополнительная информация

  • В идеале treeкаталог будет отображаться в той же папке, в которой находится исходный код, но ничего страшного, если он перейдет в какой-то рабочий каталог.
  • Вы можете предположить, что treeв том месте, где будет создан ваш каталог, нет уже существующего каталога.
  • Вы можете предположить, что ваша программа всегда будет работать в одной и той же современной операционной системе (Mac / Windows / Linux). По сути, не беспокойтесь об использовании разделителя файлов, который работает не во всех ОС.

счет

Это код-гольф, поэтому выигрывает самый короткий код в байтах .

Кальвин Хобби
источник
Подкаталоги treeвсегда должны быть leftи rightвместо upи down?
KSFT
1
@KSFT Да: «Поскольку корневой каталог всегда является горизонтальной линией, он всегда будет иметь подкаталоги справа и слева».
Увлечения Кельвина

Ответы:

5

Рубин, 127 байт

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

Проверено на Windows. Принимает ввод через STDIN.

fрекурсивно генерирует список требуемых листьев дерева, а затем я просто передаю их в один системный вызов mkdir.

Мартин Эндер
источник
3

Луа, 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
источник
2

Питон - 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
источник
его немного короче сделатьfrom os import*;s=system
DenDenDo
Еще две вещи: вы также можете сделать, ["left","up"][n%2]и вы можете (0,1)for i in 0,1:
оставить
2

Python 2 + * nix coreutils, 212 189

Создает все внутренние пути и вызовы

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

Сбои, если вход <1

user80551
источник
Вы можете объединить первые две строки:import os,itertools as t
DenDenDo
@DenDenDo полностью удалил itertools
user80551