Kod Golf: Dizin Ağacı -> Ağaç


11

Yarışma (!): Seçtiğiniz dilde, belirli bir dizinin dizin ağacını geçecek ve ona karşılık gelen bir ağaç (yani bir dizi dizisi) çıkaran bir program yazın. Dizinin önceden tanımlanmış bir D değişkeni olduğunu varsayın. En küçük karakter sayısı kazanır.

Kurallar:

  • Özyineleme kullanmalısınız
  • Kurallara Bakın

Not: Yineleme derinliği sınırı olmadığını varsayın. Başka bir deyişle, kodunuzun yeterince küçük dizin ağaçları için ve prensip olarak daha büyük dizin ağaçları için çalışması gerekir.

Örneğin:

Dizin ağacı (şimdiki değeri)

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

Çıktı ağacı

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

İlk kod golf burada öylesine lemme biliyorum eğer yanlış bir şey yapıyorum.

İyi eğlenceler :)


7
"Kurallar: 1. Özyineleme kullanmalısınız 2. Kurallara bakın" Ah !! YANLIŞ BİR DÖNGÜ İÇİNDE İSTİYORUM YARDIM!
Justin

1
Karakter sayısına göre gidebilir ya da bayt cinsinden en küçük boyuta gidebilirsiniz (bu şekilde unicode karakterleri olan programlar saf ascii kullandıklarından daha büyüktür)
Justin

1
Ne kadar derine inerdi?
Olmaz.

Birçok kişi bunun yerine bir dosya girdisi (yol veya başka bir şey olarak) verdiyseniz ve dosya çıktısını alabiliyorsa çok memnun olurlar. Ayrıca, çıktılarınızı anlamak biraz zor görünüyor. Bir test durumu sağlayabilir misiniz? Bir dizi dizi kullanmak yerine, her dizini / dosyayı kendi satırına yazdırabiliriz, ancak alt klasör göstermeye girebilir miyiz? Temel olarak, belirli bir formatta çıktı almalıyız (bu durumda, bir örnek veriniz) ya da bir format seçebilir miyiz (açık olduğu sürece)?
Justin

3
Körleşiyorum, çıktı biçiminizi ayrıştırıyorum. Bu Lisp'i seven birinden.
Darren Stone

Yanıtlar:


6

Mathematica 120 21 20

resim açıklamasını buraya girin

Açık özyineleme (bir karakter kaydetmek için teşekkürler alephalpha):

f=f/@__~FileNames~#&

f["~/StackExchange/dir1"]

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

TreeForm[%]

resim açıklamasını buraya girin

Önceki aşırı karmaşık çözüm:

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

Yakut, 38 karakter

Çıktıda fazladan boşluk kalmazsa:

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

Örnek kullanım:

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

Çıktı:

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

Eğer boşluk yoksa, ikinci satır için böyle bir şey:

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

2

Python 2.7, 111 karakter

Hedef yolu stdin'den alır.

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 Karakter

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)

Oldukça basit. Virgül gerekli değilse 10 karakter azaltılabilir. (D'de belirtildiği gibi) $ D'den girdi alır, sorudaki örnekte olduğu gibi STD-Out'ta çıktı döndürür.

Gerçekten takma adlar seçenekleri kullanabilirsiniz! Ben 'ev sahibi -NoNewline's tarafından öldürülüyorum


Bence biraz daha iyi yapılabilir. Daha deneyimli bir golfçü ona bir çatlak vermek ister mi?
lochok

Zorluğun amaçladığı hedefe gerçekten ulaşıp ulaşmadığınızı bilmiyorum ... ama bu büyük bir sorun değil çünkü yanıt veren herkes kendi yorumunu seçmiş gibi görünüyor.
HRRambler

{doh! Kazara enter tuşuna basın. } Öngörü {} yorumunuza dokunmayacağım söyleniyor, sadece yapabileceğiniz bir gelişmeye işaret edeceğim. Eksik olduğunuz ilk powershell hilesi, yazma-ana bilgisayarının gereksiz olmasıdır, kodunuzu boru hattındaki verilerle sonlandırırsanız, ana bilgisayara yazılır. İkinci hile, çift tırnak içinde gerçekleşen otomajik genişleme ve birleştirme işlemidir. Son olarak,% = foreach gibi hileleri tanımlamak için get-alias kullanın. Bir dahaki sefere sonuçlarınızı bir değişkenin içine alan bir strateji kullanın ve ardından bu değişkeni çağırarak sona erdirin: $ a = gi $ d | ls | % {}; "[$ a]"
HRRambler

1

C # 200 karakter

Gerçek bir dizi değil, bir dize çıktısı. İlk argüman olarak bir yol izler.

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

Ungolfed:

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

İlk golf girişimim ve C # oldukça ayrıntılı bir dildir. Herhangi bir tavsiye mutluluk duyacağız.
Bob

0

C ++, 318 bayt

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

İşte biraz ungolfed versiyonu:

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

Talimatlara göre - D'nin önceden tanımlanmış bir değişken olduğu varsayıldığından, kodun bir şekilde D'yi sağlamadan oluşturulmadığını lütfen unutmayın: İşte yapmanın bir yolu:

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

0

Toplu komut dosyası - 146, 157, 152127 bayt

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%

Şununla çalıştır:

scriptfile.cmd folderroot

Bu komut dosyasının her çalıştırıldığında çıktı büyür.
unclemeat

1
Evet, çok oturum dostu değildi, ama şimdi daha iyi olmalı
Robert Sørlie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.