Para esse desafio, você receberá um caminho absoluto e um "novo" (que pode ser absoluto ou relativo) e precisará retornar o caminho final.
Por exemplo, se seu diretório atual fosse /var/tmp/test
:
my_dir
ou my_dir/
deveria retornar/var/tmp/test/my_dir
../../my_dir
deve retornar /var/my_dir
/my_dir/./
deve retornar /my_dir
../../../../../
deve retornar /
Para ser mais pedante:
- Um diretório é uma string não-vazia que consiste de caracteres alfanuméricos e os símbolos
-
,_
ou.
- Um caminho é uma lista de 0 ou mais diretórios , separados usando
/
. Um caminho absoluto começa com a/
, um caminho relativo não. Os caminhos podem incluir um final/
.
Você precisa "resolver" o segundo caminho, dado o primeiro caminho.
O processo de resolução é:
- Teste se o segundo caminho é relativo. Nesse caso, insira os diretórios do caminho absoluto no início do segundo caminho.
- Se algum dos diretórios for
..
, remova-o e o diretório anterior. Se for o primeiro diretório, basta removê-lo. - Se algum dos diretórios estiver
.
, remova-o. - Saída o caminho absoluto final. Você não deve produzir um final
/
.
Você não precisa lidar com entradas incorretas. Os comandos devem funcionar, independentemente de os diretórios transmitidos existirem na sua máquina. Você pode assumir que tudo é um diretório, mesmo que tenha uma extensão.
Casos de teste
Absolute New Output
"/a/b/c" "d" -> "/a/b/c/d"
"/a/b/c/" "d" -> "/a/b/c/d"
"/a/b/c/" "d/" -> "/a/b/c/d"
"/a/b/c" "/d" -> "/d"
"/a/b/c" "/d/" -> "/d"
"/../a/b/c/" "d" -> "/a/b/c/d"
"/a/../b/c/" "d" -> "/b/c/d"
"/a/b/../c" "d" -> "/a/c/d"
"/a/b/c/.." "d" -> "/a/b/d"
"/a/b/c/" ".." -> "/a/b"
"/a/b/c" "../d" -> "/a/b/d"
"/a/b/c" "/../d" -> "/d"
"/a/b/c" "" -> "/a/b/c"
"/a/b/c" "." -> "/a/b/c"
"/a/b/c" "./d" -> "/a/b/c/d"
"/a/b/c" "/./d" -> "/d"
"/a/b/c" "d.txt" -> "/a/b/c/d.txt"
"/a/b/c" "d." -> "/a/b/c/d."
"/a/b/c" ".txt" -> "/a/b/c/.txt"
"/a/b/c" ".txt/d" -> "/a/b/c/.txt/d"
"/a/b/." "./././." -> "/a/b"
"/direc" "tory" -> "/direc/tory"
"/a-_.b/" "__._-." -> "/a-_.b/__._-."
"/a/b" "../.." -> "/"
"/a/b" "../../.."-> "/"
"/a" "../../.."-> "/"
"/" "" -> "/"
"/" "a" -> "/a"
"/.." "a" -> "/a"
"/." "" -> "/"
Este é um código de golfe , então faça seus envios o mais curto possível no seu idioma favorito!
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(ou algo assim)?