Code Golf: Cây thư mục -> Cây


11

Cuộc thi (!): Trong ngôn ngữ bạn chọn, hãy viết chương trình sẽ duyệt qua cây thư mục của một thư mục đã cho và xuất ra một cây (tức là một mảng các mảng) tương ứng với nó. Giả sử thư mục là một biến được xác định trước D. Số ký tự nhỏ nhất sẽ thắng.

Quy tắc:

  • Bạn phải sử dụng đệ quy
  • Xem quy tắc

Lưu ý: Giả sử rằng không có giới hạn độ sâu đệ quy. Nói cách khác, mã của bạn chỉ cần hoạt động cho các cây thư mục đủ nhỏ và về nguyên tắc cho các cây lớn hơn.

Ví dụ:

Cây thư mục là

dir1
├── dir11
│   ├── file111
│   └── file112
├── dir12
│   ├── file121
│   ├── file122
│   └── file123
├── file11
├── file12
└── file13

Cây đầu ra là

[[[],[]],[[],[],[]],[],[],[]]

Mã golf đầu tiên ở đây để tôi biết nếu tôi làm sai.

Chúc vui vẻ :)


7
"Quy tắc: 1. Bạn phải sử dụng đệ quy 2. Xem quy tắc" Ah !! HÃY GIÚP TÔI Ở MỘT CUỘC ĐỜI INFINITE!
Justin

1
Bạn có thể đi theo số lượng ký tự hoặc bạn có thể đi theo kích thước nhỏ nhất theo byte (theo cách này, các chương trình có ký tự unicode lớn hơn nếu chúng sử dụng ascii thuần túy)
Justin

1
Làm thế nào sâu nó sẽ đi qua?
Đó là NÓI.

Nhiều người sẽ đánh giá cao nó nếu thay vào đó bạn đưa ra một đầu vào của một tệp (dưới dạng đường dẫn hoặc thứ gì khác) và họ có thể chỉ cần xuất nó. Ngoài ra, đầu ra của bạn có vẻ hơi khó hiểu. Bạn có thể cung cấp một trường hợp thử nghiệm? Thay vì sử dụng một mảng các mảng, chúng ta có thể chỉ cần in từng thư mục / tệp trên dòng riêng của mình, nhưng được thụt lề để hiển thị lớp con? Về cơ bản, chúng ta phải xuất ra một định dạng nhất định (trong trường hợp nào đó, đưa ra một ví dụ), hoặc chúng ta có thể chọn một định dạng (miễn là không rõ ràng)?
Justin

3
Tôi sẽ bị mù, phân tích định dạng đầu ra của bạn. Điều này, từ một người thích Lisp.
Darren Stone

Câu trả lời:


6

Toán học 120 21 20

nhập mô tả hình ảnh ở đây

Đệ quy rõ ràng (cảm ơn alephalpha vì đã lưu một char):

f=f/@__~FileNames~#&

f["~/StackExchange/dir1"]

{{{}, {}}, {{}, {}, {}}, {}, {}, {}}

TreeForm[%]

nhập mô tả hình ảnh ở đây

Giải pháp quá phức tạp trước đây:

d="~/StackExchange/dir1"

f@{x___,Longest@s:{y_,___}..,z___}:=f@{x,f@Drop[{s},1,1],z}
f[FileNameSplit/@FileNames[__,SetDirectory@d;"",∞]]/.f->(#&)

f=f/@__~FileNames~#&
alephalpha

2

Ruby, 38 ký tự

Nếu bạn không nhớ một số khoảng trắng thừa trong đầu ra:

f=->n{Dir[n+'/*'].map{|c|f[c]}}
p f[D]

Ví dụ sử dụng:

D='C:/work/dir1'
f=->n{Dir[n+'/*'].map{|c|f[c]}}
p f[D]

Đầu ra:

[[[], []], [[], [], []], [], [], []]

Nếu tôi không thể có khoảng trắng, một cái gì đó như thế này cho dòng thứ hai:

puts"#{f[D]}".tr' ',''

2

Python 2.7, 111 ký tự

Lấy đường dẫn đích từ stdin.

import os
def R(d):return[R(f)for f in[d+'/'+e for e in os.listdir(d)]if os.path.isdir(f)]
print R(raw_input())

2

Powershell - 182 Char

function A([string]$b){write-host -NoNewline '['; ls -path $b|foreach{if($_.PSIsContainer){A($_.FullName)}ELSE{write-host -NoNewline $f'[]';$f=', '}};write-host -NoNewline ']'};A($D)

Khá đơn giản. Có thể giảm 10 ký tự nếu không yêu cầu dấu phẩy. Lấy đầu vào từ $ D (như đã nêu trong câu hỏi), trả về đầu ra trên STD-Out như ví dụ trong câu hỏi đã đi.

Thực sự muốn bí danh có thể sử dụng tùy chọn! Tôi đang bị giết bởi 'máy chủ lưu trữ -Không dòng mới!


Tôi nghĩ rằng nó có thể có thể được thực hiện tốt hơn một chút. Một người chơi golf có kinh nghiệm hơn muốn cho nó một vết nứt?
lochok

Tôi không biết liệu bạn có thực sự đạt được mục tiêu mà thách thức đang nhắm đến không ... nhưng đó không phải là vấn đề lớn vì mọi người trả lời dường như đã chọn cách giải thích của riêng họ.
HRRambler

{doh! Lượt vào một cách tình cờ. } Điều đó được nói rằng tôi sẽ không chạm vào diễn giải {} của bạn, tôi sẽ chỉ ra một cải tiến mà bạn có thể thực hiện. Thủ thuật quyền hạn đầu tiên bạn thiếu là máy chủ ghi là không cần thiết, nếu bạn kết thúc mã của mình bằng dữ liệu trong đường ống thì nó được ghi cho máy chủ. Thủ thuật thứ hai là mở rộng tự động và ghép nối xảy ra trong dấu ngoặc kép. Cuối cùng sử dụng bí danh get để xác định các thủ thuật như% = foreach. Lần tới, hãy sử dụng chiến lược bao gồm các kết quả của bạn trong một biến rồi kết thúc bằng cách gọi biến đó: $ a = gi $ d | ls | % {}; "[$ a]"
HRRambler

1

C # 200 ký tự

Xuất ra một chuỗi, không phải là một mảng thực tế. Lấy một đường dẫn làm đối số đầu tiên.

using D=System.IO.DirectoryInfo;class P{static string R(D d){var r="[";foreach(D e in d.GetDirectories())r+=R(e);return r+"]";}static void Main(string[] a) {System.Console.WriteLine(R(new D(a[0])));}}

Ung dung:

using D = System.IO.DirectoryInfo;

class P
{
    static string R(D d)
    {
        var r = "[";
        foreach (D e in d.GetDirectories())
            r += R(e);
        return r + "]";
    }

    static void Main(string[] a)
    {
        System.Console.WriteLine(R(new D(a[0])));
    }
}

Nỗ lực chơi gôn đầu tiên của tôi và C # là một ngôn ngữ khá dài dòng. Lời khuyên nào sẽ được đánh giá cao.
Bob

0

C ++, 318 byte

#include <cstdio>
#include <dirent.h>
#include <string>
#define s std::string
#define n e->d_name
s l(s p){s r;dirent*e;DIR*d;if(d=opendir(p.c_str())){int c=0;while(e=readdir(d))if(s("..")!=n&s(".")!=n)r+=&",["[!c++]+(e->d_type==DT_DIR?l(p+'/'+n):"")+"]";closedir(d);}return r;}main(){puts((s("[")+l(D)+"]").c_str());}

Đây là một phiên bản hơi vô căn cứ:

#include <cstdio>
#include <dirent.h>
#include <string>

#define s std::string
#define n e->d_name

s l(s p) {
    s r;
    dirent*e;
    DIR*d;
    if (d=opendir(p.c_str())) {
        int c=0;
        while (e=readdir(d))
            if (s("..")!=n&s(".")!=n)
                r+=&",["[!c++]+(e->d_type==DT_DIR?l(p+'/'+n):"")+"]";
        closedir(d);
    }
    return r;
}

main() {
    puts((s("[")+l(D)+"]").c_str());
}

Xin lưu ý rằng vì - theo hướng dẫn - D được coi là biến được xác định trước, mã không được xây dựng mà không cung cấp bằng cách nào đó D. Đây là một cách để xây dựng:

g++ -Dmain="s D=\".\";main" -o tree golfed.cpp

0

Tập lệnh hàng loạt - 146, 157, 152 127 byte

set x=
:a
set x=%x%,[
cd %1
goto %errorlevel%
:0
for /f %%a in ('dir/b') do call:a %%a
cd..
:1
set x=%x:[,=[%]
cls
@echo %x:~1%

Chạy với:

scriptfile.cmd folderroot

Đầu ra trở nên lớn hơn trên mỗi lần chạy tập lệnh này.
khai mạc

1
Vâng, nó không thân thiện lắm, nhưng giờ nên tốt hơn
Robert Sørlie
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.