目录结构图形树化


9

转换经典的目录结构,如下所示:

config.yml
drafts
    begin-with-the-crazy-ideas.textile
    on-simplicity-in-technology.markdown
includes
    footer.html
    header.html

入这个

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • 四个空格指定上述目录的嵌套文件夹或文件。
  • 允许的嵌套类别级别可以有所不同。

更新资料

  • 文件名:有效的Linux的文件名不带空格和换行:任何字节除NUL/并且spaceslinefeeds
  • 绘图字符:
    • | 垂直线(U + 007C)
    • 箱型图水平灯(U + 2500)
    • 箱体图垂直和右侧(U + 251C)

优胜者:以字节为单位的最短代码获胜!


1
欢迎来到PPCG!不错的第一篇文章!
Rɪᴋᴇʀ

垂直线应该是\ x7C垂直线还是\ u2502箱式工程图垂直吗?
尼尔

@Neil我不知道“ Box Drawings Light Vertical”,我在示例中使用了“ Vertical Line”,并且已经有了两个答案。无论如何,使用前一个会更有意义,因为其他两个字符是Box Drawings类型,是否应该使用\ u2502更新问题?
marcanuy

由于我无法轻松地在我选择的REPL中键入方框图字符,因此我使用L,+和-字符编写了答案,然后调整了分数,以为您始终使用方框图字符,尽管实际上我只是复制并从您的问题中粘贴而无需检查。如果可以接受垂直线,我可以将得分降低
Neil

1
太好了,因为它现在可以在我的新答案中节省2个字节!
尼尔

Answers:


2

视网膜,88字节

m`^ *
$&├── 
 {4}
|   
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶

在线尝试!

我想我可以从技术上算出每个字符一个字节,方法是换出一些字符,将源读取为ISO 8859-1,然后为包含和的输出找到单字节编码,但是我不希望工作立即列出细节。(为了记录,这将是72个字节。)

说明

阶段1:替代

m`^ *
$&├── 

我们首先在每行上匹配缩进并插入├──

第二阶段:替代

 {4}
|   

接下来,我们匹配每组4个空格,并用替换第一个空格|。现在,所有需要解决的问题就是|移至输出的底部,应该是。这两种情况都可以通过查看我们可能要更改的字符正下方的字符来识别。

阶段3:音译

T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])

(?<=(.)*)许多字符如何先在当前行的匹配数来衡量它的水平位置。然后,先行跳到与下一行.+¶,正如我们在组已经捕获许多字符匹配1(?>(?<-1>.)*)(前进到相同的水平位置),然后检查是否下一个字符(即,低于实际匹配的那一个)是中的一个|├└。如果是这样的话,这场比赛失败,而在所有其他情况下,成功和舞台替代空间的|

这不会一次修复所有字符,因此我们使用该+选项重复应用此阶段,直到输出停止更改。

阶段4:替代

^
.¶

剩下的就是第一行,因此我们只需匹配字符串的开头,并在前面加上.换行符即可。


请解释一下?
尼尔

@尼尔,你去。
Martin Ender

使用+`(?<=(.*))\|(?!.+¶\1[|├])(空格)+`(?<=(.*))├(?!.+¶\1[│├└]) 是否有帮助?
尼尔

@Neil我尝试了类似的方法,但我认为我没有用它保存字节。
Martin Ender

新思路:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
尼尔

2

的JavaScript(ES6),237个 128字节

f=(s,r=`.\n`+s.replace(/^ */gm,"$&└── "),q=r.replace(/^(.*)( |└)(?=.+\n\1[|└])/m,(_,i,j)=>i+`|├`[+(j>' ')]))=>q==r?r:f(s,q)

其中\n代表文字换行符。说明:rs通过.在行首添加并└──在每行缩进的末尾插入来创建的。现在这对于输入的最后一行是正确的,但是每行都必须尽可能“向上”扩展。这是的工作q,它将搜索a 并用|s 递归替换其正上方的空格,除非到达另一个被变成的空格。当无法进行进一步替换时,递归将结束。请注意,如果上方的字符是空格或a,则左侧的文本始终与前一行相同,因此我可以使用\1 测试一个字符高于另一个字符。

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.