H树目录


12

程序员经常沉迷于绘制分形。我认为我们需要一种新的基于计算机的介质。

ħ树是一个相当简单的类型的分形制成的水平线和垂直线。这是第十次迭代(由Wikipedia提供):

H树

现在,假设图像中的每一行都是标准计算机文件系统中的目录(文件夹)。除最小的线外,所有线都相交于比自己小的两条线。这两条较小的线是较大线的子目录。因此,中间的大水平线是两条最大的垂直线的父目录,这两个垂直线又是图像中其余线的父级,祖父母等。

挑战

编写一个程序,该程序通过stdin或命令行(或最接近的替代方案)接收一个正整数N,并创建一个目录树,该目录树反映了H树形的第N次迭代。

第一次迭代(N = 1)是一条水平线。在每个后续迭代中,将一组新的垂直线或水平线添加到当前线的末端。因此,对于N = 2,添加两条垂直线(形成H形),对于N = 3,添加四条水平线,依此类推。

根目录的名称必须始终为tree。子目录的名称必须是它们相对于它们的父行,使用方向一致rightleftupdown

由于根目录始终是一条水平线,因此它将始终具有rightleft子目录。但是,这两个会updown子目录,以及那些将rightleft再次,等等。

迭代限制末尾的目录应该为空。

对于N = 3,目录树应如下所示:

tree
    right
        up
        down
    left
        up
        down

附加信息

  • 理想情况下,该tree目录将弹出源代码所在的文件夹,但是如果转到某个工作目录也可以。
  • 您可能会假设tree您将在其中创建目录的地方没有预先存在的目录。
  • 您可能会假设您的程序将始终在相同的常见现代操作系统(Mac / Windows / Linux)上运行。基本上不必担心使用并非在所有操作系统上都起作用的文件分隔符。

计分

这是代码高尔夫球,因此以字节为单位的最短代码获胜。


子目录tree始终必须是leftright而不是updown吗?
KSFT

1
@KSFT是:“由于根目录始终是水平线,因此它将始终具有左右子目录。”
加尔文的爱好

Answers:


5

Ruby,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 2015年

两两件事:你也可以做["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 2015年

@DenDenDo完全删除了itertools
user80551
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.