17
Sometimes a long absolute path, in e.g. a command-line parameter to a linux tool, can be shortened, using current working directory as reference:
$ pwd
/home/heh
$ cat /home/heh/mydir/myfile
my stuff
$ cat mydir/myfile
my stuff
In this challenge, you should make a function or a program that receives two parameters:
- Absolute path, using the linux format (starts with
/
) - Current directory, using the same format
The output is the shorter of the following:
- Input 1 unchanged
- Relative path that refers to the same file/directory as the absolute path
Fine points:
- If your operating system is compatible with linux, you can use the system's current directory instead of receiving it as input
- You can assume the inputs contain only alphanumeric characters (and path separators)
- You can assume the input absolute path doesn't have a path separator
/
at the end - You can assume the input current directory has a path separator
/
at the end - You cannot assume that the absolute path refers to an existing file, or that any part of it is an accessible directory; however, the current directory can be assumed valid
- You can assume there are no symlinks anywhere near either path - because I don't want to require any special way of dealing with symlinks
- No need to support the case where either of the inputs is the root directory
- "The current directory" should be output as
.
(an empty string is not valid)
Test cases (input1, input2, output):
/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"You can assume the input current directory has a path separator
/
at the end". However, in your examples, this is not the case. – Shaggy – 2017-04-19T16:30:59.5031I like it this way, but some people like it the other way – anatolyg – 2017-04-19T16:33:01.207
Closely related. – AdmBorkBork – 2017-04-19T17:01:52.257
What should happen if absolute and relative path have the same length? – Dennis – 2017-04-19T19:00:49.857
If same length, either output is good. – anatolyg – 2017-04-19T19:12:38.260
You cannot assume that the absolute path refers to an existing file and you can use the system's current directory instead of receiving it as input seem to contradict each other. – Dennis – 2017-04-19T19:32:28.807
Do we have to deal with symlinks? Can we if it's shorter. – Dennis – 2017-04-19T19:40:27.020
@Dennis The absolute path (input 1) may refer to a non-existent file, while the current directory (input 2) is always valid. I guess I'll add the latter to the list of possible assumptions. – anatolyg – 2017-04-19T19:45:25.107
Regarding symlinks - I don't want to decide either way. If there are symlinks, any behavior is acceptable. – anatolyg – 2017-04-19T19:47:02.380
Do the inputs need to be strings? – Tutleman – 2017-04-19T20:26:01.163
Can we make any assumptions on the current directory content ? E.g. to assume it will be empty ? – zeppelin – 2017-04-19T20:32:22.843
@Tutleman I think anything else than strings would be too cheesy. However, if the "get current directory" function returns something other than string (some kind of "filesystem path object"), you can use this format for current directory. – anatolyg – 2017-04-19T20:44:35.540
@zeppelin Of course, no! – anatolyg – 2017-04-19T20:45:56.433
I now want someone to write a program that anytime someone uses an absolute path that could be shorter, echos to the command line,
"You know...you could have typed this [short path] instead."
Just because computers can always be just a little bit more passive-aggressive. – Draco18s no longer trusts SE – 2017-04-20T15:25:29.1101This is missing some critical test cases:
/home/test /home/user/mydir/myfile /home/test
and/a/b /a/b/d/e /a/b
– Nathan Merrill – 2017-04-20T16:38:14.687What do you mean by shorter? – ngenisis – 2017-04-20T23:04:30.150