Kode Golf: Pohon Direktori -> Pohon

11

Kontes (!): Dalam bahasa pilihan Anda, tulis sebuah program yang akan melintasi pohon direktori dari direktori yang diberikan dan menghasilkan pohon (yaitu, array array) yang sesuai dengannya. Asumsikan direktori adalah variabel yang telah ditentukan D. Hitungan karakter terkecil menang.

Aturan:

  • Anda harus menggunakan rekursi
  • Lihat Aturan

Catatan: Asumsikan bahwa tidak ada batas kedalaman rekursi. Dengan kata lain, kode Anda hanya perlu bekerja untuk pohon direktori yang cukup kecil, dan pada prinsipnya untuk yang lebih besar.

Misalnya:

Pohon direktori adalah

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

Pohon hasil adalah

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

Golf kode pertama di sini jadi saya tahu jika saya melakukan sesuatu yang salah.

Selamat bersenang-senang :)

Andrew Odesky
sumber
7
"Aturan: 1. Anda harus menggunakan rekursi 2. Lihat aturan" Ah !! BANTUAN SAYA TERTARIK DI SEBUAH LOOP INFINITE!
Justin
1
Anda bisa menggunakan jumlah karakter, atau Anda bisa menggunakan ukuran terkecil dalam byte (cara ini program dengan karakter unicode lebih besar daripada jika mereka menggunakan ascii murni)
Justin
1
Seberapa dalam ia akan melintasi?
Notalie.
Banyak orang akan menghargainya jika Anda memberi input file (sebagai path, atau sesuatu yang lain) dan mereka hanya bisa menampilkannya. Juga, output Anda tampaknya agak sulit dimengerti. Bisakah Anda memberikan test case? Daripada menggunakan array array, bisakah kita cukup mencetak setiap direktori / file pada barisnya sendiri, tetapi indentasi untuk menunjukkan subfolderness? Pada dasarnya, haruskah kita mengeluarkan dalam format tertentu (dalam hal ini, memberikan contoh), atau dapatkah kita memilih format (selama tidak ambigu)?
Justin
3
Saya akan buta, parsing format output Anda. Ini, dari seseorang yang menikmati Lisp.
Darren Stone

Jawaban:

6

Mathematica 120 21 20

masukkan deskripsi gambar di sini

Rekursi eksplisit (terima kasih alephalpha karena telah menyelamatkan satu char):

f=f/@__~FileNames~#&

f["~/StackExchange/dir1"]

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

TreeForm[%]

masukkan deskripsi gambar di sini

Solusi rumit berlebih sebelumnya:

d="~/StackExchange/dir1"

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

Ruby, 38 karakter

Jika Anda tidak keberatan dengan spasi putih tambahan di output:

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

Contoh penggunaan:

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

Keluaran:

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

Jika saya tidak dapat memiliki spasi putih, sesuatu seperti ini untuk baris kedua:

puts"#{f[D]}".tr' ',''
Paul Prestidge
sumber
2

Python 2.7, 111 karakter

Mengambil jalur target dari 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())
Bob
sumber
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)

Cukup sederhana. Dapat dikurangi 10 karakter jika koma tidak diperlukan. Mengambil input dari $ D (sebagaimana dinyatakan dalam pertanyaan), mengembalikan output pada STD-Out seperti contoh dalam pertanyaan.

Benar-benar berharap alias bisa menggunakan opsi! Saya terbunuh oleh 'host-host -NoNewline!

lochok
sumber
Saya pikir itu mungkin bisa dilakukan sedikit lebih baik. Seorang pegolf yang lebih berpengalaman ingin memberikan celah?
lochok
Saya tidak tahu apakah Anda benar-benar mencapai target yang dituju oleh tantangan ... tapi itu bukan masalah besar karena semua orang yang merespons tampaknya telah memilih interpretasi mereka sendiri.
HRRambler
{doh! Masuk tanpa sengaja. } Dikatakan bahwa saya tidak akan menyentuh interpretasi Anda {}, saya hanya akan menunjuk ke perbaikan yang dapat Anda lakukan. Trik powershell pertama yang Anda lewatkan adalah bahwa host-host tidak perlu, jika Anda mengakhiri kode Anda dengan data dalam pipa itu ditulis ke host. Trik kedua adalah perluasan dan penyatuan automagic yang terjadi dalam tanda kutip ganda. Akhirnya gunakan get-alias untuk mengidentifikasi trik seperti% = foreach. Lain kali gunakan strategi yang membungkus hasil Anda dalam suatu variabel kemudian diakhiri dengan memanggil variabel itu: $ a = gi $ d | ls | % {}; "[$ a]"
HRRambler
1

C # 200 karakter

Mengeluarkan string, bukan array aktual. Mengambil jalur sebagai argumen pertama.

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])));}}

Tidak Disatukan:

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])));
    }
}
Bob
sumber
Usaha golf pertama saya, dan C # adalah bahasa yang agak verbose. Nasihat apa pun akan dihargai.
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());}

Berikut ini adalah versi yang sedikit tidak diubah:

#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());
}

Harap perhatikan bahwa karena - sesuai instruksi - D diasumsikan sebagai variabel yang sudah ditentukan sebelumnya, kode tidak akan dibangun tanpa menyediakan D.

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

Script batch - 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%

Jalankan dengan:

scriptfile.cmd folderroot
Robert Sørlie
sumber
Outputnya semakin besar di setiap jalannya skrip ini.
hapus tanda
1
Ya, itu tidak terlalu ramah sesi, tapi seharusnya lebih baik sekarang
Robert Sørlie