H Дерево Каталоги


12

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

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

Н дерево

Тепер уявіть, що кожен із рядків на зображенні - це каталог (папка) у стандартній комп'ютерній файловій системі. Усі, крім найменших ліній, перетинаються на дві лінії, менші за себе; ці два менші рядки є підкаталогами більшого рядка. Таким чином, велика горизонтальна лінія посередині - це батьківський каталог двох найбільших вертикальних ліній, які в свою чергу є батьками, бабусями та дідусями та ін. Решти рядків на зображенні.

Виклик

Напишіть програму, яка приймає натуральне число 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)

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)

це трохи коротше, ніж зробитиfrom os import*;s=system
DenDenDo

Ще дві речі: ви також можете робити, ["left","up"][n%2]і ви можете опустити дужки, (0,1)щоб датиfor i in 0,1:
Sp3000

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


ви можете поєднати перші два рядки:import os,itertools as t
DenDenDo

@DenDenDo Видалив itertools повністю
користувач80551
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.