お題:フルパスから相対パスを求める
プログラミングお題の一覧はこちら
※みなさんもこのお題をお気に入りの言語で解いてみて下さい。解いたらこの記事にトラックバックをお願いします。
説明
二つのフルパスを受け取り、一つ目のパスから二つ目のパスへの相対パスを返す関数を実装せよ。 条件) ・パス区切り文字は / のみサポートする。 ・結果パスは カレントディレクトリを表す ./ もしくは、一つ親のディレクトリを表す ../ から始める。 ・パスが / で終わる場合ディレクトリとする。 ・パスが / で終わらない場合ファイルとする。 ・フルパスは / から始め、それ以外の場合エラーとする。 ・空のパス(空文字列、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
更新履歴
- 2011-08-19 条件)に「パスは / から始める、パスに / が連続した場合について」を追加しました。Thanks to id:hotokediary さん。「お題:フルパスから相対パスを求める」をjsでやってみた男 - 仏日記