ডিরেক্টরি গণনা


19

এই চ্যালেঞ্জের জন্য, আপনাকে একটি পরম পথ এবং একটি "নতুন" পাথ দেওয়া হবে (যা নিরঙ্কুশ বা আপেক্ষিক হতে পারে), এবং আপনাকে চূড়ান্ত পথে ফিরে আসতে হবে।

উদাহরণস্বরূপ, যদি আপনার বর্তমান ডিরেক্টরিটি ছিল /var/tmp/test:

my_dirঅথবা my_dir/ ফিরে আসা উচিত/var/tmp/test/my_dir

../../my_dir ফিরে আসা উচিত /var/my_dir

/my_dir/./ ফিরে আসা উচিত /my_dir

../../../../../ ফিরে আসা উচিত /

আরও পেডেন্টিক হতে:

  • একটি ডিরেক্টরি একটি খালি আলফানিউমেরিক অক্ষর নিয়ে গঠিত স্ট্রিং এবং চিহ্ন -, _বা.
  • একটি পাথ 0 বা ততোধিক ডিরেক্টরিগুলির একটি তালিকা যা ব্যবহার করে পৃথক করা হয় /। একটি নিখুঁত পথ একটি দিয়ে শুরু হয় /, একটি আপেক্ষিক পথ হয় না। পাথগুলিতে একটি শেষ অন্তর্ভুক্ত থাকতে পারে /

আপনাকে প্রথম পথটি দিয়ে দ্বিতীয় পথটি "সমাধান" করতে হবে।

সমাধানের প্রক্রিয়াটি হ'ল:

  1. দ্বিতীয় পথটি আপেক্ষিক কিনা তা পরীক্ষা করুন। যদি তা হয় তবে দ্বিতীয় পথের শুরুতে পরম পথের ডিরেক্টরিগুলি সন্নিবেশ করান।
  2. ডিরেক্টরিগুলির মধ্যে যদি কোনও হয় ..তবে এটি এবং পূর্ববর্তী ডিরেক্টরিটি সরিয়ে ফেলুন। এটি যদি প্রথম ডিরেক্টরি হয় তবে কেবল এটি সরান।
  3. ডিরেক্টরিগুলির কোনও যদি থাকে .তবে এটি সরিয়ে ফেলুন।
  4. চূড়ান্ত পরম পথ আউটপুট। আপনার শেষ হওয়া উচিত নয় /

আপনাকে ভুল ইনপুট হ্যান্ডেল করার দরকার নেই। কমান্ডগুলি কাজ করা উচিত, ডিরেক্টরিগুলি উত্তীর্ণ হয়েছে কিনা তা আপনার মেশিনে আসলে বিদ্যমান কিনা। আপনি ধরে নিতে পারেন যে এটির একটি এক্সটেনশন থাকলেও সবকিছুই একটি ডিরেক্টরি।

পরীক্ষার মামলা

Absolute      New          Output
"/a/b/c"      "d"       -> "/a/b/c/d" 
"/a/b/c/"     "d"       -> "/a/b/c/d"
"/a/b/c/"     "d/"      -> "/a/b/c/d"
"/a/b/c"      "/d"      -> "/d"
"/a/b/c"      "/d/"     -> "/d"
"/../a/b/c/"  "d"       -> "/a/b/c/d"
"/a/../b/c/"  "d"       -> "/b/c/d"
"/a/b/../c"   "d"       -> "/a/c/d"
"/a/b/c/.."   "d"       -> "/a/b/d"
"/a/b/c/"     ".."      -> "/a/b"
"/a/b/c"      "../d"    -> "/a/b/d"
"/a/b/c"      "/../d"   -> "/d"
"/a/b/c"      ""        -> "/a/b/c"
"/a/b/c"      "."       -> "/a/b/c"
"/a/b/c"      "./d"     -> "/a/b/c/d"
"/a/b/c"      "/./d"    -> "/d"
"/a/b/c"      "d.txt"   -> "/a/b/c/d.txt"
"/a/b/c"      "d."      -> "/a/b/c/d."
"/a/b/c"      ".txt"    -> "/a/b/c/.txt"
"/a/b/c"      ".txt/d"  -> "/a/b/c/.txt/d"
"/a/b/."      "./././." -> "/a/b"
"/direc"      "tory"    -> "/direc/tory"
"/a-_.b/"     "__._-."  -> "/a-_.b/__._-."
"/a/b"        "../.."   -> "/"
"/a/b"        "../../.."-> "/"
"/a"          "../../.."-> "/"
"/"           ""        -> "/"
"/"           "a"       -> "/a"
"/.."         "a"       -> "/a"
"/."          ""        -> "/"

এটি একটি , সুতরাং আপনার প্রিয় ভাষায় আপনার জমাগুলি যতটা সম্ভব সংক্ষিপ্ত করুন!


কিছু উত্তরগুলি অনুমান করা প্রদর্শিত ফাইল ডিরেক্টরি গাছের কোন অংশ নামেই (অথবা symlinks)) না না মেশিনে বিদ্যমান। এটা কি অনুমোদিত?
ডেনিস

আমরা যে কোনও ক্রমে দুটি ইনপুট নিতে পারি?
ডাউনগোট

বোকা প্রশ্ন ... আমার কি পার্শ্ব প্রতিক্রিয়া হতে পারে? বিশেষত, ওম, mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`(বা কিছু) এর মতো পার্শ্ব প্রতিক্রিয়া ?
বিড়াল

@dennis। প্রোগ্রামগুলির আউটপুট ফাইল সিস্টেমের চেয়ে পৃথক হওয়া উচিত
নাথান মেরিল

@ ডাওনগোট ঠিক আছে
নাথান মেরিল

উত্তর:


7

রেটিনা , 44 বাইট

+`.+ /| |/\.?/
/
+1`/?[^/]*/\.\.|/\.?$

^$
/

ইনপুটটি একক স্পেস দ্বারা পৃথক দুটি পথ হবে বলে আশা করা হচ্ছে।

এটি অনলাইন চেষ্টা করুন! (প্রথম লাইন একটি লাইনফিড-বিচ্ছিন্ন পরীক্ষা স্যুট সক্ষম করে))


3

পাইথন, 53 বাইট

from os.path import*;p=lambda a,n:normpath(join(a,n))

3

ব্যাচ, 282 281 279 276 বাইট

@echo off
set a=\
set r=%~2
if "%r%"=="" set r=%~1
if not %r:~,1%==/ set r=%~1/%~2
for %%a in (%r:/= %)do call:x %%a
if not %a%==\ set a=%a:~,-1%
echo %a:\=/%
exit/b
:x
if %1==. exit/b
if not %1==.. set a=%a%%1\&exit/b
if not %a%==\ for %%a in (%a:~,-1%)do set a=%%~pa

বিরক্তিকরভাবে ব্যাচের এক্সপ্রেশনগুলি সাধারণত খালি ভেরিয়েবল পছন্দ করে না। সম্পাদনা করুন: @ ইওজি'র কাছে 1 বাইট ধন্যবাদ এবং 2 বাইট ধন্যবাদ সংরক্ষণ করা হয়েছে (এবং অন্যান্য উত্তরগুলিতেও বাইটের একগুচ্ছ, যদিও হতাশাকে স্বীকৃতি দেওয়া হয়নি)।


আমি মনে করি আপনি callএবং: x a এর মধ্যে কোনও স্থান সরাতে পারবেন ?
কনর ও'ব্রায়েন

@ কোওবি হু, তাই আপনি পারেন। আমার কাছে এমন একগুচ্ছ উত্তর পেয়েছে যা সে ক্ষেত্রে আপডেট করা দরকার ...
নীল

2

পাইথন 2, 265 260 254 বাইট

y=lambda:[x for x in raw_input().split("/")if x!=""and x!="."]
a=y();n=y();m=len(a)-1
while m>0:
 if a[m]==".."and m>0:del a[m];del a[m-1];m-=1
 elif a[m]=="..":del a[m]
 m-=1
for i in n:
 if i==".."and len(a)>0:del a[-1]
 else:a+=i,
print"/"+"/".join(a)

1

পাইথন, 142 137 বাইট

def p(a,n,r=[],S="/"):
 for s in[s for s in((n[:1]!=S)*a+S+n).split(S)if"."!=s and s]:e=s!="..";r=[s]*e+r[1-e:]
 return S+S.join(r[::-1])

1

বাশ, 41 বাইট

এই বাশ স্ক্রিপ্টের ডিরেক্টরিগুলি তৈরি করার পার্শ্ব প্রতিক্রিয়া রয়েছে যদি সেগুলির অস্তিত্ব না থাকে তবে এটি প্রয়োজনীয়তা পূরণ করে। আপনার উন্নতির জন্য কার্ল এবং নীলকে ধন্যবাদ ।

mkdir -p $1;cd $1;mkdir -p $2;cd "$2";pwd

ব্যবহার: bash getpath.sh "পরম" "নতুন"

দ্বিতীয় আর্গুমেন্ট খালি স্ট্রিং যখন আপনি স্টাডার পছন্দ করেন না, আপনি নিম্নলিখিত হিসাবে এটি পরীক্ষা করতে পারেন (48 বাইট):

mkdir -p $1;cd $1;[ $2 ]&&mkdir -p $2&&cd $2;pwd

পূর্ববর্তী 30 বাইট প্রচেষ্টা (ডিরেক্টরি বিদ্যমান থাকার প্রয়োজন): সিডি $ 1; [$ 2] && সিডি $ 2; প্রতিধ্বনিpwd


প্রশ্নটি বলে যে কমান্ডগুলি কাজ করা উচিত, পাস করা ডিরেক্টরিগুলি আসলে আপনার মেশিনে বিদ্যমান কিনা।
ডেনিস

আহ আমি দেখি. খুব খারাপ.
ব্রায়ান

হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! সাধারণত, যদি আপনার উত্তরটি কাজ করে না, আপনি এটি মুছুন। আপনি এই মন্তব্যের উপরে ডিলিট লিঙ্কটি ক্লিক করতে পারেন।
নন ইনি এখানে

আপনি mkdir -pতাদের বিদ্যমান আছে তা নিশ্চিত করতে পারতেন ।
কার্ল ন্যাপফ

ধন্যবাদ, আমি mkdir সহ একটি সংস্করণ চেষ্টা করছি। আমি এই উত্তরটি মুছব এবং যদি আমি এটির সন্ধান করি তবে একটি নতুন যুক্ত করব।
ব্রায়ান

1

সি #, 43 বাইট

(x,y)=>Path.GetFullPath(Path.Combine(x,y));

@Aloisdg- এর জন্য 1 টি বাইট সংরক্ষণ করা হয়েছে

Path.Combineরাখে আর্গুমেন্ট একসঙ্গে, এবং Path.GetFullPathসমাধান করা ..\গুলি


হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি বৈধ প্রোগ্রাম নয় - হয় অন্তর্ভুক্ত করুন mainএবং একটি শ্রেণি, বা এটি একটি ল্যানবডায় পরিবর্তন করুন: a,b->...
নোইনইহির এখানে

আমি এটি পোস্ট করতে যাচ্ছি :) চমৎকার প্রথম জমা! আপনি স্থানটি মুছে ফেলতে পারেন এর পরে ,: (x, y)=>(x,y)
অ্যালোইসডজি বলেছেন পুনর্নির্মাণ মনিকা

এছাড়াও golfing থ্রেড জন্য C # টিপস আপনার স্বার্থ হতে পারে।
অলয়েসডজি মনিকাকে


1

জাভাস্ক্রিপ্ট, 210 বাইট

function p(a,b){d='.';e=d+d;s='/';t='split';u='splice';r=(b[0]===s?[]:a[t](s)).concat(b[t](s));for(i=0;i<r.length;r[i]===e&&r[u](i?i-1:i,i?2:1)?(i&&i--):i++)(!r[i]||r[i]===d)&&r[u](i,1)&&i--;return s+r.join(s)}

এখানে পরীক্ষার স্যুট

সেমিকোলনের পরিবর্তে লাইনব্রেক সহ:

function p(a,b) {
    d='.'
    e=d+d
    s='/'
    t='split'
    u='splice'

    r=(b[0]===s?[]:a[t](s)).concat(b[t](s))

    for(i=0;i<r.length;r[i]===e&&r[u](i?i-1:i,i?2:1)?(i&&i--):i++)
        (!r[i]||r[i]===d)&&r[u](i,1)&&i--

    return s+r.join(s)
}

0

জাভা 7, 83 বাইট

String p(String a,String b){return Paths.get(a).resolve(b).normalize().toString();}

normalizeআপেক্ষিক রেফারেন্স মোকাবেলা করা প্রয়োজন। addদ্বিতীয় পথটি শুরু করতে হ্যান্ডেল করতে ব্যবহৃত হয় /যা Paths.get(a, b)নির্দিষ্ট হিসাবে হ্যান্ডেল করে না।


হ্যালো, এবং পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি ভাল প্রথম পোস্ট!
নন ইনি এখানে

0

বাশ, 38 বাইট

[[ $2 = /* ]]||p=$1
realpath -sm $p/$2

মূল সুবিধার প্রয়োজন হয় না এবং বিদ্যমান বা অ-বিদ্যমান ফাইল, ডিরেক্টরি বা প্রতীকী লিঙ্কগুলি সম্পর্কে কোনও অনুমান করে না।

আইডিয়নে এটি পরীক্ষা করুন ।

কিভাবে এটা কাজ করে

[[ $2 = /* ]]দ্বিতীয় কমান্ড-লাইন যুক্তিটি শুরু হলে পরীক্ষা করে /

যদি এটি না হয়, পাথ আপেক্ষিক এবং প্রথম কমান্ড-লাইন আর্গুমেন্টে p=$1পরিবর্তনশীল পি সেট করে ।

এই পদ্ধতি $p/$2হল /$2যদি $2একটি সুনির্দিষ্ট পাথ এবং $1/$2যদি এটি একটি realtive অন্যতম।

অবশেষে, realpath -sm $p/$2ক্যানোনিকাল পরম পাথ মুদ্রণ করে $p/$2-sসুইচ তোলে realpath সিম্বলিক লিংক উপেক্ষা এবং -mসুইচ অনুপস্থিত উপাদান।


0

রুবি, 16 বাইট

আপাতদৃষ্টিতে স্ট্যান্ডার্ড লাইব্রেরি থেকে কোনও পদ্ধতি ব্যবহারের অনুমতি রয়েছে:

File.expand_path

Repl.itপরীক্ষার স্যুটটি দেখুন ।


ভেরিয়েবলগুলির মাধ্যমে ইনপুট অনুমোদিত নয়, তবে ফাংশন জমা দেওয়ার অর্থ হ'ল এর অর্থ আপনার এটি সংক্ষিপ্ত করা উচিত File.expand_path:)
নাথান মেরিল

আমি এটি পরীক্ষার স্যুটটির বিপরীতে এটি পরীক্ষার প্রস্তাব দিই যাতে এটি পরীক্ষা করা সমস্ত ক্ষেত্রে সঠিকভাবে কাজ করে।
নাথান মেরিল

@ নাথানমারিল আমি করেছি, তবে আমি এগিয়ে যাব এবং repl.it- এ কিছু আঁকিব।
জর্ডান

পরীক্ষার স্যুট লিঙ্কটি অন্তর্ভুক্ত করার জন্য সম্পাদিত।
জর্ডান

0

GNU সেড , 81 59 + 1 = 60 বাইট

-rপতাকা জন্য +1 বাইট । STDIN এ ইনপুটটি একক স্থান দ্বারা পৃথক হওয়ার প্রত্যাশা করে।

s:.+ /::
s:/? :/:
:
s:/$|[^/]+/+\.\.|\.(/|$):\1:
t
s:^/*:/:

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

s:.+ /::  # If the second argument starts with a slash, drop the first argument
s:/? :/:  # Join the first and second arguments with a slash, dropping duplicate slashes
:
  s:/$|[^/]+/+\.\.|\.(/|$):\1:  # Drop trailing slashes, resolve double and single dots
  t                             # If the above substitution was made, branch to :
s:^/*:/:  # Ensure output begins with a single slash

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.