আপেক্ষিক পথটি মুদ্রণ করুন


15

বিবরণ

একটি উত্স পাথ এবং একটি গন্তব্য পাথ দেওয়া, উত্সের সাথে শ্রদ্ধার সাথে গন্তব্যের আপেক্ষিক পাথ আউটপুট।

বিধি

  1. ইনপুট স্টিডিন থেকে বা প্রোগ্রাম / ফাংশনে আর্গুমেন্ট হিসাবে আসতে পারে।

  2. উভয় উইন্ডোজ এবং ইউনিক্স স্টাইলের পাথ সমর্থন করা উচিত।

  3. আউটপুট পাথটি ব্যবহার করতে পারে /এবং / অথবা \পাথ বিভাজকের জন্য (আপনার পছন্দ এবং উভয়ের সংমিশ্রণ ঠিক আছে)।

  4. আপনি ধরে নিতে পারেন কোনও আপেক্ষিক পথ সম্ভব possible

  5. আপেক্ষিক পাথগুলি গণনার জন্য তৈরি বহিরাগত প্রোগ্রামগুলি, অন্তর্নির্মিত বা লাইব্রেরি ফাংশনগুলির ব্যবহার নিষিদ্ধ (উদাহরণস্বরূপ পাইথনের os.path.relpath)

  6. এটি

    সম্পাদনা করুন: মন্তব্য থেকে নতুন নিয়ম।

  7. আপেক্ষিক পাথ অবশ্যই সংক্ষিপ্ততম আপেক্ষিক পথ হতে হবে।

  8. ধরুন গন্তব্য পথটি উত্স পথ থেকে পৃথক।

উদাহরণ 1

# In
/usr/share/geany/colorschemes
/usr/share/vim/vim73/ftplugin

# Out
../../vim/vim73/ftplugin

উদাহরণ 2

# In
C:\Windows\System32\drivers
C:\Windows\System32\WindowsPowerShell\v1.0

# Out
..\WindowsPowerShell\v1.0

নিয়ম # 3 সম্পর্কিত - একটি মিশ্রণ ঠিক আছে? যেমন ../../vim\vim73\ftplugin
ডানকান জোন্স

1
আমাদের কি সবচেয়ে সংক্ষিপ্ত আপেক্ষিক পথটি ফিরতে হবে বা কোনও পথ নির্ধারণ করা ঠিক আছে?
হাওয়ার্ড

@ ডানকান হ্যাঁ, একটি মিশ্রণ ঠিক আছে।
রিন্যান্ট

1
@ জোয়ার্ড, এটি অবশ্যই সবচেয়ে সংক্ষিপ্ত আপেক্ষিক পথ হবে।
রিন্যান্ট

প্রথম উদাহরণটি হওয়া উচিত নয় ../vim/vim73/ftplugin?
মার্টিজন

উত্তর:


2

সিজেম, 46 বাইট

ll]{'\/'/f/:~}/W{)__3$=4$@==}g@,1$-"../"*o>'/*

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

উদাহরণ

$ echo '/usr/share/geany/colorschemes
> /usr/share/vim/vim73/ftplugin' | cjam path.cjam; echo
../../vim/vim73/ftplugin
$ echo 'C:\Windows\System32\drivers
> C:\Windows\System32\WindowsPowerShell\v1.0' | cjam path.cjam; echo
../WindowsPowerShell/v1.0

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

ll]         " Read two lines from STDIN and wrap them in an array.                       ";
{           " For each line:                                                             ";
  '\/       " Split by “\”.                                                              ";
  '/f/      " Split each chunk by “/”.                                                   ";
  :~        " Flatten the array of chunks.                                               ";
}/          "                                                                            ";
W           " Push -1 (accumulator).                                                     ";
{           "                                                                            ";
  )__       " Increment and duplicate twice.                                             ";
  3$=       " Extract the corresponding chunk from the first line.                       ";
  4$@=      " Extract the corresponding chunk from the second line.                      ";
  =         " If the are equal,                                                          ";
}g          " repeat the loop.                                                           ";
@,          " Rotate the array of chunks of the first line on top and get its length.    ";
1$-         " Subtract the value of the accumulator.                                     ";
"../"*o     " Print the string “../” repeated that many times.                           ";
>           " Remove all chunks with index less than the accumulator of the second line. ";
'/*         " Join the chunks with “/”.                                                  ";

1
এটি একটি বাগ আছে। ব্যবহার করে দেখুন /aa/xসঙ্গে /ab/y
জিমি 23013

@ ব্যবহারকারী23013: স্থির।
ডেনিস

2

বাশ + কোর্টিলস, 116

বলটি রোলিংয়ের জন্য এখানে একটি শেল স্ক্রিপ্ট রয়েছে। খুব নিশ্চিত যে এর উত্তরগুলি আরও ছোট হবে:

n=`cmp <(echo $1) <(echo $2)|grep -Po "\d+(?=,)"`
printf -vs %`grep -o /<<<${1:n-1}|wc -l`s
echo ${s// /../}${2:n-1}

আউটপুট:

$ ./rel.sh /usr/share/geany/colorschemes /usr/share/vim/vim73/ftplugin
../vim/vim73/ftplugin
$ ./rel.sh /usr/share/geany/colorschemes/ /usr/share/vim/vim73/ftplugin/
../../vim/vim73/ftplugin/
$ ./rel.sh /usr/share/vim/vim73/ftplugin /usr/share/geany/colorschemes
../../geany/colorschemes
$ 

নোটটি স্ট্রিং ftpluginফাইল বা ডিরেক্টরি কিনা তা স্ক্রিপ্টের বলার উপায় নেই is আপনি /উপরের উদাহরণের মতো একটি ডিরেক্টরি যুক্ত করে স্পষ্টভাবে একটি ডিরেক্টরি সরবরাহ করতে পারেন ।

সাদা স্থান বা অন্যান্য মজার অক্ষরযুক্ত পাথগুলি পরিচালনা করবে না। নিশ্চিত যে এটি প্রয়োজন বা না হয়। মাত্র কয়েকটি অতিরিক্ত উদ্ধৃতি প্রয়োজন হবে।


2

জাভাস্ক্রিপ্ট (E6) 104

আউটপুট জন্য সতর্কতা যুক্ত করুন

R=(s,d)=>alert(s.split(x=/\/|\\/).map(a=>a==d[0]?d.shift()&&'':'../',d=d.split(x)).join('')+d.join('/'))

Ungolfed

R (s,d) => // a single espression is returned, no {} or () needed
  s.split(x=/\/|\\/) // split string at / or \, save regexp in X for later
  .map( // create a new array from s
     a => a == d[0] // check if current of s and d equals
          ? d.shift() && '' // map to '' and cut 1 element of d
          : '../', // else map to '../'
     d=d.split(x)) // second param of map is useless, so split d here
  .join('')+d.join('/') // join map and concat to rest of d adding separators

পরীক্ষা

R('C:\\Windows\\System32\\drivers','C:\\Windows\\System32\\WindowsPowerShell\\v1.0')

../WindowsPowerShell/v1.0

R('/usr/share/geany/colorschemes','/usr/share/vim/vim73/ftplugin')

../../vim/vim73/ftplugin


2

রুবি> = 1.9, 89 94 চরিত্র

$;=/\\|\//
a,b=$*.map &:split
puts"../"*(a.size-r=a.index{a[$.+=1]!=b[$.]}+1)+b[r..-1]*?/

কমান্ড লাইন আর্গুমেন্টের মাধ্যমে ইনপুট। UNIX- এবং উইন্ডোজ-স্টাইল পাথের জন্য কাজ করে, বারবার ফোল্ডারের নাম সহ পাথগুলি:

$ ruby relpath.rb /usr/share/geany/colorschemes /usr/share/vim/vim73/ftplugin
../../vim/vim73/ftplugin
$ ruby relpath.rb 'C:\Windows\System32\drivers' 'C:\Windows\System32\WindowsPowerShell\v1.0'
../WindowsPowerShell/v1.0
$ ruby relpath.rb /foo/bar/foo/bar /foo/qux/foo/bar
../../../qux/foo/bar

2

জে - 63 চর

বামদিকে পুরানো পথ এবং ডানদিকে নতুন পথ গ্রহণ করা একটি ক্রিয়া।

}.@;@(c=.c&}.`(,~(<'/..')"0)@.(~:&{.))&('/'<;.1@,'\/'&charsub)~

এই সমাধান, তিনটি অংশ আসে মত খুঁজছেন post@loop&pre~। বিস্ফোরণ দ্বারা ব্যাখ্যা:

post @ loop & pre ~   NB. the full golf
                  ~   NB. swap the arguments: new on left, old on right
            & pre     NB. apply pre to each argument
       loop           NB. run the recursive loop on both
post @                NB. apply post to the final result

'/'<;.1@,'\/'&charsub  NB. pre
         '\/'&charsub  NB. replace every \ char with /
'/'     ,              NB. prepend a / char
   <;.1@               NB. split string on the first char (/)

c=.c&}.`(,~(<'/..')"0)@.(~:&{.)  NB. loop
                      @.(~:&{.)  NB. if the top folders match:
    &}.                          NB.   chop off the top folders
   c                             NB.   recurse
       `                         NB. else:
           (<'/..')"0            NB.   change remaining old folders to /..
         ,~                      NB.   append to front of remaining new folders
c=.                              NB. call this loop c to recurse later

}.@;  NB. post
   ;  NB. turn the list of folders into a string
}.@   NB. chop off the / in the front

মনে রাখবেন যে /বিভক্ত হওয়ার আগে আমরা প্রতিটি পাথের নেতৃত্ব যুক্ত করি , যাতে আমরা C:একটি "ফোল্ডার" তৈরি করে উইন্ডোজ-স্টাইলের পাথগুলি পরিচালনা করি । এটি ইউনিক্স-শৈলীর পাথগুলির শুরুতে একটি খালি ফোল্ডারের ফলস্বরূপ, তবে এটি সর্বদা লুপ দ্বারা মুছে ফেলা হয়।

এটি কর্মে দেখুন:

   NB. you can use it without a name if you want, we will for brevity
   relpath =. }.@;@(c=.c&}.`(,~(<'/..')"0)@.(~:&{.))&('/'<;.1@,'\/'&charsub)~
   '/usr/share/geany/colorschemes' relpath '/usr/share/vim/vim73/ftplugin'
../../vim/vim73/ftplugin
   'C:\Windows\System32\drivers' relpath 'C:\Windows\System32\WindowsPowerShell\v1.0'
../WindowsPowerShell/v1.0

আপনি নিজে চেষ্টা করে দেখতে পারেন tryj.tk এ


2

বাশ, 69 66

আমি এটি পোস্ট করি নি কারণ আমি ভেবেছিলাম যে কেউ অবশ্যই এটি আরও ভালভাবে করতে সক্ষম হবে। তবে দৃশ্যত এটি এত সহজ নয়।

sed -r 'N;s/(.*[/\])(.*)\n\1/\2\n/'|sed '1s/[^/\]*/../g;N;s!\n!/!'

Nsedমিল দুটি মিলিয়ে তোলে । প্রথম এক্সপ্রেশন /বা এর সাথে শেষ হওয়া সাধারণ উপসর্গটি সরিয়ে দেয় \। দ্বিতীয় এক্সপ্রেশনটি ..প্রথম লাইনে ডিরেক্টরি নামগুলি প্রতিস্থাপন করে । অবশেষে এটি বিভাজকের সাথে দুটি রেখা একত্রিত করে।

3 টি চরিত্রের জন্য হস্তুরকুনকে ধন্যবাদ।


বেশ মজার তো! আপনি একটি ব্যাখ্যা যোগ করতে পারেন?
ডিজিটাল ট্রমা

1
পছন্দ করেছেন তবে মূলত এগুলি কেবল নিয়মিত প্রকাশ।
জিমি 23013

ধন্যবাদ! আমি পরের বারের সাথে খেলতে যাচ্ছি আমি টার্মিনালে
ডিজিটাল ট্রমা

আপনার সত্যিই sedদু'বার চালানোর দরকার নেই , আপনি এটি একটি একক স্ক্রিপ্টের সাহায্যে করতে পারেন।
হাস্তুরকুন

@ হস্তুরকুন তবে এটির সাথে কাজ করার কোনও উপায় আমি পাইনি N। আপনি যদি জানেন তবে আপনি এই উত্তরটি সম্পাদনা করতে পারেন।
জিমি 23013

1

সি, 119 106

void p(char*s,char* d){while(*s==*d){s++;d++;}s--;while(*s){if(*s==47||*s==92)printf("../");s++;}puts(d);}

p(char*s,char*d){for(;*s;)*s++-*d?*s-47||printf("../"):d++;puts(d);}68 অক্ষর
ডাব্লু

ধন্যবাদ! তবে বিধি 2 বলছে উভয়কেই সমর্থন করতে হবে। এটি আউটপুটে যেখানে আমি এক বা অন্যটিকে বেছে নিতে পারি (বিধি 3)।
কোভকি

1

পাইথন 3, 120

a,b=(i.split('\\/'['/'in i])for i in map(input,'  '))
while[]<a[:1]==b[:1]:del a[0],b[0]
print('../'*len(a)+'/'.join(b))

উদাহরণ:

$ python3 path.py
 /usr/share/geany/colorschemes
/usr/share/vim/vim73/ftplugin 
../../vim/vim73/ftplugin

লাইন 1 execএবং স্ট্রিং অপারেশনগুলির সাথে সংক্ষিপ্ততর উপায় থাকতে পারে ?
xnor

@ এক্সনর হয়তো, তবে আমি এটি দেখতে পাচ্ছি না।
grc

map(input,' ')`(ইনপুট (), ইনপুট ()) এর জন্য কাজ করতে পারে ? (আমি নিজে এটি পরীক্ষা করতে পারি না)
xnor

@ এক্সনোর হ্যাঁ যে ধন্যবাদ!
grc

1

রুবি - 89

r=/\/|\\/
s = ARGV[0].split r
d = ARGV[1].split r
puts ("../"*(s-d).size)+((d-s).join"/")

ব্যবহার:

ruby relative.rb working/directory destination/directory

3
এটি /foo/bar/foo/barএবং মত যুক্তির জন্য ব্যর্থ /foo/qux/foo/bar
ভেন্টোরো

এবং উইন্ডো স্টাইলের পাথগুলির জন্য ব্যর্থ হয়
edc65

@ edc65 বিধিগুলি দু'টি পথ ফর্ম্যাটকে সমর্থন করা প্রয়োজন বলে দেয় না, আপনি যে কোনও একটি করতে পারেন।
nderscore

@nderscore বিধি 2 উভয় উইন্ডোজ এবং ইউনিক্স স্টাইলের পাথ সমর্থন করা উচিত।
edc65

1
@ জ্যোস্টি: আচ্ছা, এটাই সৌন্দর্য, তাই না? সংক্ষিপ্ত এবং সঠিক উভয়ই এমন একটি সমাধান নিয়ে আসছেন । আমার অতীতে এমন ঘটনা ঘটেছিল যেখানে আমাকে অগ্রাহ্য করা প্রান্তের কারণে উত্তরটি পুরোপুরি সংশোধন করতে হয়েছিল। এখন, আমি এক্ষেত্রেও দোষটিকে আংশিকভাবে কাজটির উপরেও চাপিয়ে দিই, কারণ আমি বিশ্বাস করি পরীক্ষার ক্ষেত্রে একটি দৃ set় সেট প্রতিটি কাজের সাথে থাকা উচিত, তবে ভাল।
জোয়

0

জাভাস্ক্রিপ্ট - 155

function p(s,d){s=s.split(/\\|\//g);d=d.split(/\\|\//g);o=[];for(i=0;s[i]==d[i];i++);for(j=s.length-i;j--;)o[j]="..";return o.concat(d.slice(i)).join("/")}

উভয় পাথ ফর্ম্যাটটিকে পার্স করে তবে /বিভাজক দিয়ে আউটপুট ।

console.log(p("/usr/share/geany/colorschemes","/usr/share/vim/vim73/ftplugin"));
../../vim/vim73/ftplugin
console.log(p("/usr/share/geany/colorschemes/test/this","/usr/share/vim/vim73/ftplugin/this/is/a/test"));
../../../../vim/vim73/ftplugin/this/is/a/test
console.log(p("c:\\windows\\system32\\drivers\\etc\\host","c:\\windows\\system\\drivers\\etc\host"));
../../../../system/drivers/etchost

0

পিএইচপি, 158 151

function r($a,$b){$a=explode('/',$a);$b=explode('/',$b);foreach($a as $k=>$v){if($v==$b[$k])$b[$k]='..';else break;}unset($b[0]);echo implode('/',$b);}

Ungolfed:

function r($a,$b){
    $a=explode('/',$a);
    $b=explode('/',$b);
    foreach($a as $k=>$v){
        if($v==$b[$k])$b[$k]='..';
        else break; 
    }
    unset($b[0]);
    echo implode('/',$b);
}
// these lines are not included in count:
r('/test/test2/abc','/test/test3/abcd'); // ../test3/abcd
r('/test/test2/abc','/test/test2/abcd'); // ../../abcd

আপনার উত্তর সঠিক নয়। এই ডায়ারগুলি বানানোর চেষ্টা করুন এবং cdএকে অপরকে ফর্ম করুন :)
কোর 1024

0

গ্রোভি - 144 অক্ষর

একটি সমাধান:

x=args[0][1]!=':'?'/':'\\'
f={args[it].tokenize x}
s=f 0
d=f 1
n=0
while(s[n]==d[n++]);
u="..$x"*(s.size-(--n))
println "$u${d.drop(n).join x}"

উদাহরণ আউটপুট:

bash$ groovy P.groovy C:\\Windows\\System32\\drivers C:\\Windows\\System32\\WindowsPowerShell\\v1.0
..\WindowsPowerShell\v1.0

bash$ groovy P.groovy /usr/share/geany/colorschemes /usr/share/vim/vim73/ftplugin
../../vim/vim73/ftplugin

bash$ groovy P.groovy /foo/bar/foo/bar /foo/qux/foo/bar
../../../qux/foo/bar

ungolfed:

// fs = file seperator, / or \
fs = args[0][1]!=':'?'/':'\\'

s = args[0].tokenize fs
d = args[1].tokenize fs

// n = # of matching dirs from root + 1
n = 0
while (s[n] == d[n++]) ;

// up = the up-prefix. e.g. "../../..", for instance 
n--
up = "..${fs}" * (s.size-n)

println "$up${d.drop(n).join fs}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.