Thư mục cây


12

Các lập trình viên thường bị ám ảnh với việc vẽ fractals. Tôi nghĩ rằng chúng ta cần một phương tiện dựa trên máy tính mới.

Cây H là một loại fractal khá đơn giản được tạo thành từ các đường ngang và dọc. Đây là lần lặp lại thứ mười ( Wikipedia lịch sự ):

Cây H

Bây giờ, hãy tưởng tượng mỗi dòng trong ảnh là một thư mục (thư mục) trong một hệ thống tệp máy tính tiêu chuẩn. Tất cả trừ những dòng nhỏ nhất cắt nhau hai dòng nhỏ hơn mình; hai dòng nhỏ hơn này là thư mục con của dòng lớn hơn. Do đó, đường ngang lớn ở giữa là thư mục mẹ của hai đường thẳng đứng lớn nhất, lần lượt là cha mẹ, ông bà, v.v ... phần còn lại của các dòng trong ảnh.

Thử thách

Viết chương trình lấy số nguyên dương N thông qua stdin hoặc dòng lệnh (hoặc thay thế gần nhất) và tạo một cây thư mục phản ánh lần lặp thứ N của fractal cây H.

Lặp lại đầu tiên (N = 1) là một đường ngang duy nhất. Trong mỗi lần lặp tiếp theo, một tập hợp các dòng dọc hoặc ngang mới được thêm vào cuối của các dòng hiện tại. Vì vậy, đối với N = 2, hai đường thẳng đứng được thêm vào (tạo hình chữ H), cho N = 3 bốn đường kẻ ngang được thêm vào đó, v.v.

Tên của thư mục gốc phải luôn luôn tree. Tên của các thư mục con phải phù hợp với hướng họ đối với dòng bố mẹ của họ, sử dụng right, left, updown.

Vì thư mục gốc luôn là một đường nằm ngang nên nó sẽ luôn có rightvà các leftthư mục con. Nhưng hai cái đó sẽ có updownthư mục con, và những cái đó sẽ có rightleftmột lần nữa, v.v.

Các thư mục ở cuối giới hạn lặp sẽ trống.

Thí dụ

Với N = 3, cây thư mục sẽ trông như thế này:

tree
    right
        up
        down
    left
        up
        down

Thông tin bổ sung

  • Lý tưởng nhất là treethư mục sẽ bật lên trong cùng thư mục chứa mã nguồn, nhưng không sao nếu nó đi đến một thư mục làm việc.
  • Bạn có thể cho rằng không có treethư mục tồn tại ở nơi bạn sẽ được tạo.
  • Bạn có thể cho rằng chương trình của bạn sẽ luôn được chạy trên cùng một hệ điều hành hiện đại chung (Mac / Windows / Linux). Về cơ bản, đừng lo lắng về việc sử dụng trình phân tách tệp không hoạt động trong tất cả các hệ điều hành.

Chấm điểm

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


Các thư mục con treeluôn luôn phải leftrightthay vì updown?
KSFT

1
@KSFT Có: "Vì thư mục gốc luôn là một đường nằm ngang nên nó sẽ luôn có các thư mục con phải và trái."
Sở thích của Calvin

Câu trả lời:


5

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

Đã thử nghiệm trên Windows. Đưa đầu vào qua STDIN.

fđệ quy tạo ra một danh sách các lá cần thiết của cây, và sau đó tôi chỉ cần đưa chúng vào một cuộc gọi hệ thống duy nhất 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

Con trăn - 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)

nó hơi ngắn để làmfrom os import*;s=system
DenDenDo 17/1/2015

Hai điều nữa: bạn cũng có thể làm ["left","up"][n%2]và bạn có thể thả dấu ngoặc xung quanh (0,1)để đưa rafor i in 0,1:
Sp3000

2

Coreutils Python 2 + * nix, 212 189

Tạo ra tất cả các đường dẫn và cuộc gọi trong cùng

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

Sự cố nếu đầu vào <1


bạn có thể kết hợp hai dòng đầu tiên:import os,itertools as t
DenDenDo

@DenDenDo Đã xóa hoàn toàn itertools
user80551
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.