একটি পরম পথ ছোট করুন ten


17

কখনও কখনও একটি দীর্ঘ পরম পথ, যেমন একটি লিনাক্স সরঞ্জামের একটি কমান্ড-লাইন প্যারামিটার, সংক্ষিপ্ত করা যেতে পারে, বর্তমান কার্যনির্বাহী ডিরেক্টরিটি রেফারেন্স হিসাবে ব্যবহার করে:

$ pwd
/home/heh

$ cat /home/heh/mydir/myfile
my stuff

$ cat mydir/myfile
my stuff

এই চ্যালেঞ্জে আপনার একটি ফাংশন বা এমন একটি প্রোগ্রাম করা উচিত যা দুটি পরামিতি গ্রহণ করে:

  1. সম্পূর্ণ পাথ, লিনাক্স ফর্ম্যাটটি ব্যবহার করে (শুরু হয় /)
  2. বর্তমান ডিরেক্টরি, একই ফর্ম্যাট ব্যবহার করে

আউটপুট নিম্নলিখিতগুলির সংক্ষিপ্ত:

  • ইনপুট 1 অপরিবর্তিত
  • আপেক্ষিক পথ যা পরম পাথ হিসাবে একই ফাইল / ডিরেক্টরিকে বোঝায়

সূক্ষ্ম পয়েন্ট:

  • যদি আপনার অপারেটিং সিস্টেমটি লিনাক্সের সাথে সামঞ্জস্যপূর্ণ হয় তবে আপনি সিস্টেমের বর্তমান ডিরেক্টরিটিকে ইনপুট হিসাবে গ্রহণ না করে ব্যবহার করতে পারেন
  • আপনি ধরে নিতে পারেন ইনপুটগুলিতে কেবলমাত্র বর্ণমালা (এবং পথ বিভাজক) রয়েছে
  • আপনি ধরে নিতে পারেন ইনপুট পরম পাথের /শেষে পাথ বিভাজক নেই
  • আপনি ধরে নিতে পারেন ইনপুট বর্তমান ডিরেক্টরিটির /শেষে একটি পাথ বিভাজক রয়েছে
  • আপনি ধরে নিতে পারবেন না যে পরম পথটি একটি বিদ্যমান ফাইলকে বোঝায় বা এর কোনও অংশই একটি অ্যাক্সেসযোগ্য ডিরেক্টরি; তবে, বর্তমান ডিরেক্টরিটি বৈধ বলে ধরে নেওয়া যেতে পারে
  • আপনি ধরে নিতে পারেন যে কোনও পাথের কাছাকাছি কোথাও কোনও সিমলিংক নেই - কারণ আমি সিমলিংকের সাথে সম্পর্কিত কোনও বিশেষ পদ্ধতির প্রয়োজন চাই না
  • ইনপুটগুলির যে কোনওটি হ'ল রুট ডিরেক্টরি যেখানে মামলাটি সমর্থন করার দরকার নেই
  • "বর্তমান ডিরেক্টরি" আউটপুট হিসাবে হওয়া উচিত .(একটি খালি স্ট্রিং বৈধ নয়)

পরীক্ষার কেস (ইনপুট 1, ইনপুট 2, আউটপুট):

/home/user/mydir/myfile
/home/user
mydir/myfile

/var/users/admin/secret/passwd
/var/users/joe/hack
../../admin/secret/passwd

/home/user/myfile
/tmp/someplace
/home/user/myfile

/dir1/dir2
/dir1/dir2/dir3/dir4
../..

/dir1/dir2
/dir1/dir2
.

1
"আপনি ধরে নিতে পারেন ইনপুট বর্তমান ডিরেক্টরিটির /শেষে একটি পাথ বিভাজক রয়েছে"। তবে, আপনার উদাহরণগুলিতে, এটি ক্ষেত্রে নয় is
শেগি

1
আমি এটি এইভাবে পছন্দ করি তবে কিছু লোক এটি অন্যভাবে পছন্দ করে
অন্যভাবে অ্যানাটোলিগ


পরম ও আপেক্ষিক পাথের দৈর্ঘ্য একই হলে কী হবে?
ডেনিস

1
এটিতে কিছু সমালোচনামূলক পরীক্ষার মামলা অনুপস্থিত: /home/test /home/user/mydir/myfile /home/testএবং/a/b /a/b/d/e /a/b
নাথান মেরিল

উত্তর:


7

জুলিয়া 0.5 , 32 বাইট

!,~=relpath,endof
t->~t<~!t?t:!t

এটি বর্তমান কর্মক্ষম ডিরেক্টরিটি বেস হিসাবে ব্যবহার করে এবং এই মুহুর্তে টিআইওতে পরীক্ষা করা যাবে না।

উদাহরণ রান

সতর্কতা: এটি আপনার ফাইল সিস্টেমকে পরিবর্তন করবে।

$ sudo julia --quiet
julia> function test(target,base)
       mkpath(base)
       cd(base)
       shorten(target)
       end
test (generic function with 1 method)
julia> !,~=relpath,endof
(relpath,endof)

julia> shorten = t->~t<~!t?t:!t
(::#1) (generic function with 1 method)

julia> test("/home/user/mydir/myfile","/home/user")
"mydir/myfile"

julia> test("/var/users/admin/secret/passwd","/var/users/joe/hack")
"../../admin/secret/passwd"

julia> test("/home/user/myfile","/tmp/someplace")
"/home/user/myfile"

julia> test("/dir1/dir2","/dir1/dir2/dir3/dir4")
"../.."

julia> test("/dir1/dir2","/dir1/dir2")
"."

বিকল্প সংস্করণ, 35 বাইট (dyadic)

^,~=relpath,endof
t-b=~t<~t^b?t:t^b

এটি বেস ডিরেক্টরিটি ইনপুট হিসাবে গ্রহণ করে, সুতরাং এটি ফাইল সিস্টেমটি পরিবর্তন না করে পরীক্ষা করা যায়।

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


Base.-সুস্পষ্টভাবে আমদানি না করে ত্রুটিগুলি পুনরায় সংজ্ঞায়িত করবে , না?
জুলিয়ান ওল্ফ

0.5 তে, এটি ত্রুটি হতে পারে তবে আপনি যদি -এটির নতুন সংজ্ঞা দেওয়ার আগে ব্যবহার করেন। 0.4-এ, আপনি এটি পুনঃনির্ধারণের আগে ব্যবহার করেন কিনা তা একটি সতর্কতা ছাপায় ints
ডেনিস

9

জাভাস্ক্রিপ্ট (ES6), 107 106 বাইট

সিনট্যাক্সের কারিঙে পরম পথ aএবং বর্তমান পথ নেয়c(a)(c)

a=>c=>(A=a.split`/`,s='',c.split`/`.map(d=>!s&A[0]==d?A.shift():s+='../'),s+=A.join`/`)[a.length]?a:s||'.'

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


সাথে খুব সুন্দর কৌশল [a.length]! আমার নোড.জেএস এর উত্তর উন্নত করতে কি আমি এটি ধার করতে পারি?
জেপেলিন

@zeppelin শিওর এটার জন্য যাও!
আর্নাউল্ড


5

ES6 (Node.js REPL), 56, 54, 46, 45 বাইট

  • "" এর পরিবর্তে খালি স্ট্রিং ব্যবহার করুন। বর্তমান ডিরেক্টরিটি বোঝাতে (ইনপুটটিতে), -1 বাইট
  • [f.length]@ আরনাউল্ডের উত্তর , -6 বাইট থেকে কৌশলটি ধার করা হয়েছে
  • সুস্পষ্ট ডিরেক্টরি প্যারামিটার -2 বাইটের পরিবর্তে বর্তমান ডিরেক্টরিটি ব্যবহার করুন
  • অপ্রয়োজনীয় বন্ধনী, -২ বাইট সরানো হয়েছে

Golfed

f=>(r=path.relative("",f))[f.length]?f:r||"."

পরীক্ষা

> F=f=>(r=path.relative("",f))[f.length]?f:r||"."
[Function: F]

> F("/home/user/mydir/myfile")
'mydir/myfile'

> F("/var/users/admin/secret/passwd")
'../../admin/secret/passwd'

> F("/home/user/myfile")
'/home/user/myfile'

> F("/dir1/dir2")
'../..'

> F("/dir1/dir2")
'.'

আমরা কি নোড.জেএস ফাংশনগুলিকে অনুমতি দিই না?
ডাউনগোট

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

4

পাইথন 2, 135 144 বাইট

i=0
a,c=input()
b,d=a.split('/')*(a!=c),c.split('/')
while b[:i+1]==d[:i+1]:i+=1
print'.'[i:]or min('/'.join(['..']*len(d[i:])+b[i:]),a,key=len)

অনলাইনে চেষ্টা করে দেখুন!

বেশ লম্বা, তবে আমি বিল্ট-ইন পথের কাজগুলি ছাড়াই একটি সমাধান করতে চেয়েছিলাম।

সম্পাদনা করুন: নাথান মেরিল সরবরাহ করেছেন পরীক্ষার ক্ষেত্রে 9 বাইট অ্যাকাউন্টে যুক্ত হয়েছে


3

Zsh + রিয়েলপথ, 58 বাইট

r=`realpath -m --relative-to=$*`
(($#2<$#r))&&r=$2
echo $r

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

বাশ সংস্করণ, 62 বাইট

r=`realpath -m --relative-to=$*`
((${#2}<${#r}))&&r=$2
echo $r

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


কেন এটি দুটি ভিন্ন উত্তরে পোস্ট করা হচ্ছে না? প্রতিটি ভাষার গুরুত্ব!
গ্যাবর্স

2

পাইথন 3 - 53 বাইট

ব্যবহার os.path:

import os
lambda x:min(x,os.path.relpath(x),key=len)

সম্পূর্ণ প্রোগ্রাম (61 বাইট):

import os
x=input();print(min(x,os.path.relpath(x),key=len))

ওও, ভাল পয়েন্ট (গুলি)। পাইথনের নেতৃত্বে এখন, হ্যাঁ!
matsjoyce

@ অ্যানাটলিগ হা, আমি জানতাম আমি কমপক্ষে একটি পরীক্ষার মামলা মিস করবো ... 😒 সব এখন ঠিক।
মাতসয়জাই

1

পিএইচপি, 204 বাইট

[,$l,$p]=$argv;$z=($d=array_diff_assoc)($y=($w=explode)("/",$p),$x=$w("/",$l));$m=str_pad("",3*count($z)-1,"../");$j=join("/",$r=$d($x,$y));echo$l!=$p?strlen($u=$m&&$j?"$m/$j":$m.$j)<strlen($l)?$u:$l:".";

Testcases

সম্প্রসারিত

[,$l,$p]=$argv;
$z=($d=array_diff_assoc)($y=($w=explode)("/",$p),$x=$w("/",$l));
$m=str_pad("",3*count($z)-1,"../");
$j=join("/",$r=$d($x,$y));
echo$l!=$p
    ?strlen($u=$m&&$j?"$m/$j":$m.$j)<strlen($l)
      ?$u
      :$l
    :".";

যদি এর ../../পরিবর্তে কোনও আউটপুট of ../..অনুমোদিত হয় তবে এটি সংক্ষিপ্ত করে 175 বাইট করা যেতে পারে

[,$l,$p]=$argv;$z=($d=array_diff_assoc)($y=($w=explode)("/",$p),$x=$w("/",$l));echo$l!=$p?strlen($m=str_pad("",3*count($z),"../").join("/",$r=$d($x,$y)))<strlen($l)?$m:$l:".";

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