কোড গল্ফ: ডিরেক্টরি গাছ -> গাছ


11

প্রতিযোগিতা (!): আপনার পছন্দের ভাষায়, এমন একটি প্রোগ্রাম লিখুন যা কোনও প্রদত্ত ডিরেক্টরিতে ডিরেক্টরি গাছকে অতিক্রম করবে এবং এর সাথে মিলিত করে একটি গাছ আউটপুট করবে (অর্থাত্ অ্যারেগুলির একটি অ্যারে)। ধরে নিন ডিরেক্টরিটি একটি পূর্বনির্ধারিত পরিবর্তনশীল ডি। ক্ষুদ্রতম অক্ষরের গণনা জয়।

নিয়মাবলী:

  • আপনার অবশ্যই পুনরাবৃত্তি ব্যবহার করা উচিত
  • বিধিগুলি দেখুন

দ্রষ্টব্য: ধরে নিন যে কোনও পুনরাবৃত্তির গভীরতার সীমা নেই। অন্য কথায়, আপনার কোডটিতে কেবলমাত্র পর্যাপ্ত ছোট ডিরেক্টরি গাছের জন্য কাজ করা দরকার, এবং মূলত বৃহত্তরগুলির জন্য for

এই ক্ষেত্রে:

ডিরেক্টরি গাছ হয়

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

আউটপুট ট্রি হয়

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

এখানে প্রথম কোড গল্ফ তাই lemme জানি যদি আমি কিছু ভুল করছি।

আনন্দ কর :)


7
"বিধি: 1. আপনার অবশ্যই পুনরাবৃত্তি ব্যবহার করতে হবে 2. বিধিগুলি দেখুন" আহ !! আমি একটি ইনফিনিটি লুপ আটকে সাহায্য!
জাস্টিন

1
আপনি অক্ষর গণনা অনুসারে যেতে পারেন, বা আপনি বাইটের মধ্যে সবচেয়ে ছোট আকারে যেতে পারেন (এইভাবে ইউনিকোড অক্ষরযুক্ত প্রোগ্রামগুলি যদি খাঁটি এসসিআই ব্যবহার করা হয় তার চেয়ে বড় হয়)
জাস্টিন

1
এটা কত গভীর যেতে পারে?
ইটনাটালি

আপনি পরিবর্তে কোনও ফাইলের একটি ইনপুট (পথ হিসাবে বা অন্য কিছু হিসাবে) দেন এবং তারা কেবল এটিকে আউটপুট দিতে পারলে অনেক লোক এটির প্রশংসা করবে। এছাড়াও, আপনার আউটপুটটি বোঝা কিছুটা কঠিন বলে মনে হচ্ছে। আপনি একটি পরীক্ষা কেস প্রদান করতে পারেন? অ্যারের অ্যারে ব্যবহার করার পরিবর্তে, আমরা কেবল প্রতিটি ডিরেক্টরি / ফাইল তার নিজস্ব লাইনে মুদ্রণ করতে পারি, তবে সাবফোল্ডনেস দেখানোর জন্য অভিযুক্ত? মূলত, আমরা কি একটি নির্দিষ্ট বিন্যাসে আউটপুট দিতে পারি (কোন ক্ষেত্রে, একটি উদাহরণ দিন), বা আমরা কোনও ফর্ম্যাট (যতক্ষণ না এটি দ্ব্যর্থহীন) চয়ন করতে পারি?
জাস্টিন

3
আমি অন্ধ হয়ে যাচ্ছি, আপনার আউটপুট ফর্ম্যাটটি বিশ্লেষণ করছি। এটি লিস্প উপভোগ করা এমন কারও কাছ থেকে।
ড্যারেন স্টোন

উত্তর:


6

গণিত 120 21 20

এখানে চিত্র বর্ণনা লিখুন

সুস্পষ্ট পুনরাবৃত্তি (একটি চর সংরক্ষণ করার জন্য ধন্যবাদ আলেফল্যা):

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~#&
আলেফাল্ফ

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

পাইথন ২.7, ১১১ টি অক্ষর

স্টিডিন থেকে লক্ষ্যের পথ ধরে।

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 চর

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 টি অক্ষর দ্বারা হ্রাস করা যেতে পারে। $ ডি থেকে ইনপুট নেয় (প্রশ্নে বর্ণিত হিসাবে), প্রশ্নের উদাহরণ যেমন চলেছে তেমন এসটিডি-আউটে আউটপুট ফেরত দেয়।

প্রকৃতপক্ষে ইলিয়াস ইচ্ছুক বিকল্পগুলি ব্যবহার করতে পারে! আমি 'রাইট-হোস্ট -নিউইলাইন'-এর হাতে মারা যাচ্ছি!


আমি মনে করি এটি আরও ভালভাবে করা সম্ভব হবে। আরও অভিজ্ঞ গল্ফাররা কি এটি একটি ক্র্যাক দিতে চায়?
lochok

আমি জানি না যে আপনি চ্যালেঞ্জটি যে টার্গেট করেছে তার পক্ষে আপনি আসলে আঘাত করেছেন কিনা ... তবে এটি কোনও বড় বিষয় নয় যেহেতু যারা প্রত্যুত্তর করেছেন তারা নিজের ব্যাখ্যাটি বেছে নিয়েছেন বলে মনে হয়।
এইচআরআর্যামব্লার

{DOH! দুর্ঘটনাক্রমে প্রবেশ করুন। Said এমনটি বলা হচ্ছে যে আমি আপনার ভবিষ্যদ্বাণী স্পর্শ করব না}} ব্যাখ্যা, আমি কেবল আপনি করতে পারেন এমন একটি উন্নতির দিকে নির্দেশ করতে যাচ্ছি। আপনি যে প্রথম পাওয়ারশেল ট্রিকটি মিস করছেন তা হ'ল লিখন-হোস্টটি অপ্রয়োজনীয়, যদি আপনি হোস্টে লেখা পাইপলাইনে ডেটা দিয়ে আপনার কোডটি শেষ করেন। দ্বিতীয় কৌশলটি স্বয়ংক্রিয় বিস্তৃত এবং সংলগ্ন যা ডাবল-কোটের মধ্যে ঘটে। অবশেষে% = foreach এর মতো কৌশলগুলি সনাক্ত করতে get-عرف ব্যবহার করুন। পরের বার এমন কৌশল ব্যবহার করুন যা আপনার ফলাফলগুলিকে ভেরিয়েবলের মধ্যে ঘিরে রাখে তারপরে সেই পরিবর্তনশীলটিকে কল করে শেষ হয়: $ a = gi $ d | ls | % {}; "[$ এ]"
এইচআরআরবলার

1

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

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

আমার প্রথম গল্ফ প্রচেষ্টা, এবং সি # একটি বরং ভার্ভোজ ভাষা। কোন পরামর্শ প্রশংসা হবে।
বব

0

সি ++, 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());}

এখানে একটি সামান্য অবারিত সংস্করণ:

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

দয়া করে নোট করুন যেহেতু - প্রতি নির্দেশ অনুসারে - ডি একটি পূর্বনির্ধারিত পরিবর্তনশীল হিসাবে ধরে নেওয়া হয়, কোডটি কোনওভাবে ডি সরবরাহ না করেই বিল্ড হয় না build এখানে তৈরির একটি উপায় রয়েছে:

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

0

ব্যাচের স্ক্রিপ্ট - 146, 157, 152 127 বাইট

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
হ্যাঁ, এটি খুব সেশন বান্ধব ছিল না, তবে এখনই আরও ভাল হওয়া উচিত
রবার্ট সর্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.