코드 골프 : 디렉토리 트리-> 트리


11

콘테스트 (!) : 선택한 언어로 지정된 디렉토리의 디렉토리 트리를 가로 지르는 트리를 출력하는 프로그램을 작성하십시오 (즉, 배열 배열). 디렉토리가 사전 정의 된 변수 D라고 가정하십시오. 문자 수가 가장 적습니다.

규칙 :

  • 재귀를 사용해야합니다
  • 규칙 참조

참고 : 재귀 깊이 제한이 없다고 가정하십시오. 다시 말해, 코드는 충분히 작은 디렉토리 트리와 원칙적으로 큰 디렉토리 트리에 대해서만 작동하면됩니다.

예를 들어 :

디렉토리 트리는

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

출력 트리는

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

여기에 첫 번째 코드 골프가 있으므로 lemme은 내가 잘못하고 있는지 알 수 있습니다.

재미있게 보내세요 :)


7
"규칙 : 1. 재귀를 사용해야합니다. 2. 규칙을보십시오"Ah !! 나는 무한 루프에 빠지게 도와주세요!
Justin

1
당신은 문자 수로 가거나 바이트 단위로 가장 작은 크기로 갈 수 있습니다 (이렇게하면 유니 코드 문자를 가진 프로그램이 순수한 ASCII를 사용하는 것보다 더 큽니다)
Justin

1
얼마나 깊이지나 갈까요?
NotALie입니다.

대신 파일의 경로를 입력하거나 다른 것으로 입력하면 많은 사람들이 감사하게 생각할 수 있습니다. 또한 출력 내용을 이해하기가 다소 어려워 보입니다. 테스트 케이스를 제공 할 수 있습니까? 배열 배열을 사용하는 대신 각 디렉토리 / 파일을 자체 행에 인쇄 할 수 있지만 하위 폴더를 표시하도록 들여 쓰기를 할 수 있습니까? 기본적으로 특정 형식으로 출력해야합니까 (이 경우 예제 제공), 또는 모호하지 않은 경우 형식을 선택할 수 있습니까?
Justin

3
출력 형식을 파싱하면서 장님이 될 것입니다. 이것은 Lisp를 즐기는 사람으로부터입니다.
대런 스톤

답변:


6

매스 매 티카 120 21 20

여기에 이미지 설명을 입력하십시오

명시 적 재귀 (한 문자를 저장해 준 alephalpha 덕분에) :

f=f/@__~FileNames~#&

f["~/StackExchange/dir1"]

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

TreeForm[%]

여기에 이미지 설명을 입력하십시오

이전의 복잡한 솔루션 :

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

루비, 38 자

출력에 여분의 공백이 필요하지 않은 경우 :

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

사용법 예 :

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

산출:

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

공백이 없으면 두 번째 줄에 다음과 같이하십시오.

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

2

파이썬 2.7, 111 자

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

파워 쉘-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)

상당히 간단합니다. 쉼표가 필요하지 않은 경우 10자를 줄일 수 있습니다. $ D에서 입력을 받고 (질문에 설명 된대로) 질문의 예제가 진행됨에 따라 STD-Out에서 출력을 리턴합니다.

정말로 희망하는 별명은 옵션을 사용할 수 있습니다! 'write-host -NoNewline 's에 의해 죽고 있습니다!


조금 더 잘할 수있을 것 같아요. 더 숙련 된 골퍼가 균열을주고 싶습니까?
lochok

도전이 목표로 삼고있는 목표를 실제로 달성했는지는 모르겠지만, 응답 한 모든 사람이 자신의 해석을 선택한 것으로 보이므로 큰 문제는 아닙니다.
HRRambler

{도! 우연히 엔터를 치십시오. } 나는 당신의 foreach {} 해석을 건드리지 않을 것이라고 말하면서, 당신이 할 수있는 개선점을 지적하려고합니다. 누락 된 첫 번째 파워 쉘 트릭은 쓰기 호스트가 불필요하다는 것입니다. 파이프 라인의 데이터로 코드를 끝내면 호스트에 기록됩니다. 두 번째 요령은 큰 따옴표 내에서 발생하는 자동 확장 및 연결입니다. 마지막으로 get-alias를 사용하여 % = foreach와 같은 트릭을 식별하십시오. 다음에 변수 내에 결과를 넣는 전략을 사용하고 해당 변수를 호출하여 종료합니다. $ a = gi $ d | LS | % {}; "[$ a]"
HRRambler

1

C # 200 자

실제 배열이 아닌 문자열을 출력합니다. 첫 번째 인수로 경로를 사용합니다.

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

언 골프 드 :

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

내 첫 골프 시도, C #은 다소 장황한 언어입니다. 모든 조언을 부탁드립니다.
Bob

0

C ++, 318 바이트

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

다음은 약간 ungolfed 버전입니다.

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

명령어에 따라 D는 사전 정의 된 변수 인 것으로 가정되므로 코드는 D를 제공하지 않으면 빌드되지 않습니다. 빌드하는 방법은 다음과 같습니다.

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

0

배치 스크립트 -146, 157, 152127 바이트

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%

로 실행 :

scriptfile.cmd folderroot

이 스크립트를 실행할 때마다 출력이 커집니다.
unclemeat

1
예, 세션 친화적이지 않았지만 지금은 나아질 것입니다
Robert Sørlie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.