No Programming, No Life

プログラミング関連の話題や雑記

お題:フルパスから相対パスを求める

プログラミングお題の一覧はこちら

※みなさんもこのお題をお気に入りの言語で解いてみて下さい。解いたらこの記事にトラックバックをお願いします。

説明

二つのフルパスを受け取り、一つ目のパスから二つ目のパスへの相対パスを返す関数を実装せよ。

条件)
・パス区切り文字は / のみサポートする。
・結果パスは カレントディレクトリを表す ./ もしくは、一つ親のディレクトリを表す ../ から始める。
・パスが / で終わる場合ディレクトリとする。
・パスが / で終わらない場合ファイルとする。
・フルパスは / から始め、それ以外の場合エラーとする。
・空のパス(空文字列、null、nilなど)が渡された場合、エラーとする。
・パスに / が連続した場合、一つの / と見なす。(例: ///aaa///bbb///ccc.txt  => /a/b/c.txt)
・パス区切り文字以外でファイル名として使用不可能な文字(参照:http://goo.gl/R0LqY)が含まれている場合、エラーとする。

例1) 同じディレクトリにあるファイル
パス1:/aaa/bbb/from.txt
パス2:/aaa/bbb/to.txt
結果 :./to.txt

例2) 親ディレクトリにあるファイル
パス1:/aaa/bbb/from.txt
パス2:/aaa/to.txt
結果 :../to.txt

例3) 子ディレクトリにあるファイル
パス1:/aaa/bbb/from.txt
パス2:/aaa/bbb/ccc/to.txt
結果 :./ccc/to.txt

例4) 親の子の子にあるファイル
パス1:/aaa/bbb/from.txt
パス2:/aaa/ccc/ddd/to.txt
結果 :../ccc/ddd/to.txt

例5) ルート越え
パス1:/aaa/bbb/from.txt
パス2:/ddd/ccc/to.txt
結果 :../../ddd/ccc/to.txt

例6) ディレクトリからファイル
パス1:/aaa/bbb/
パス2:/aaa/ddd/to
結果 :../ddd/to

例7) ファイルからディレクトリ
パス1:/aaa/bbb/from
パス2:/aaa/ccc/
結果 :../ccc/

例8) ディレクトリからディレクトリ
パス1:/aaa/bbb/
パス2:/aaa/ccc/
結果 :../ccc/

例9) 同じパス
パス1:/aaa/bbb/ccc.txt
パス2:/aaa/bbb/ccc.txt
結果 :./ccc.txt

例10) 空
パス1:空
パス2:/bbb/to.txt
結果 :エラー

例11) 使用不可能な文字
パス1:/aaa/g*
パス2:/bbb/to.txt
結果 :エラー

例13) / 以外で始まる場合はエラー
パス1:aaa/bbb/from.txt
パス2:./bbb/to.txt
結果 :エラー

例14) 複数の / は / 一つ
パス1://aaa///bbb////from.txt
パス2://///aaa//////bbb///////to.txt
結果 :./to.txt

更新履歴