Para este desafío, se le dará una ruta absoluta y una ruta "nueva" (que puede ser absoluta o relativa), y deberá devolver la ruta final.
Por ejemplo, si su directorio actual era /var/tmp/test:
my_diro my_dir/ debería volver/var/tmp/test/my_dir
../../my_dir debería volver /var/my_dir
/my_dir/./ debería volver /my_dir
../../../../../ debería volver /
Para ser más pedante:
- Un directorio es una cadena no vacía que consiste en caracteres alfanuméricos y los símbolos
-,_o. - Una ruta es una lista de 0 o más directorios , separados mediante
/. Una ruta absoluta comienza con a/, una ruta relativa no. Los caminos pueden incluir un final/.
Necesita "resolver" la segunda ruta, dada la primera ruta.
El proceso de resolución es:
- Prueba si la segunda ruta es relativa. Si es así, inserte los directorios de la ruta absoluta al comienzo de la segunda ruta.
- Si alguno de los directorios lo es
.., elimínelo junto con el directorio anterior. Si es el primer directorio, simplemente elimínelo. - Si alguno de los directorios lo es
., elimínelo. - Salida de la ruta absoluta final. No debe generar un final
/.
No necesita manejar entradas incorrectas. Los comandos deberían funcionar, independientemente de si los directorios pasados existen o no en su máquina. Puede suponer que todo es un directorio, incluso si tiene una extensión.
Casos de prueba
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 es un código de golf , ¡así que haga sus envíos lo más cortos posible en su idioma favorito!
fuente

mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`(o algo)?Respuestas:
Retina , 44 bytes
Se espera que la entrada sean las dos rutas separadas por un solo espacio.
Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
fuente
Python, 53 bytes
fuente
Lote,
282281279276 bytesMolestamente, las expresiones por lotes generalmente no les gustan las variables vacías. Editar: guardado 1 byte gracias a @ CᴏɴᴏʀO'Bʀɪᴇɴ y 2 bytes gracias a @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ (y un montón de bytes en otras respuestas también, aunque desafortunadamente no acreditado).
fuente
cally: x`, ¿no?Python 2,
265260254 bytesfuente
Python,
142137bytesfuente
Bash, 41 bytes
Este script bash tiene el efecto secundario de crear directorios si no existen, pero debe cumplir con los requisitos. Gracias Karl y Neil por sus mejoras.
Uso: bash getpath.sh "absoluto" "nuevo"
Si no le gusta stderr cuando el segundo argumento es una cadena vacía, puede probarlo de la siguiente manera (48 bytes):
Intento anterior de 30 bytes (requiere que existan directorios):
cd $ 1; [$ 2] && cd $ 2; echopwdfuente
mkdir -pasegurarte de que existan.C #, 43 bytes
Guardado 1 byte gracias a @aloisdg
Path.Combinepone los argumentos juntos yPath.GetFullPathresuelve el..\sfuente
mainy una clase, o cambiarlo a un idioma:a,b->...,:(x, y)=>(x,y)Nodo REPL,
812 bytesAfortunadamente, no es necesario tener
require()módulos estándar en REPL.Banco de pruebas
https://repl.it/Cclo/1
(Si la salida al final es
true, coincide)fuente
Javascript, 210 bytes
Aquí está la suite de prueba
Con saltos de línea en lugar de punto y coma:
fuente
Java 7, 83 bytes
normalizees necesario para tratar referencias relativas.addse usa para manejar la segunda ruta que comienza con/, quePaths.get(a, b)no manejará como se especifica.fuente
Bash, 38 bytes
No requiere privilegios de root y no hace suposiciones sobre archivos, directorios o enlaces simbólicos existentes o no existentes.
Pruébalo en Ideone .
Cómo funciona
[[ $2 = /* ]]prueba si el segundo argumento de la línea de comandos comienza con/.Si no es así, la ruta es relativa y
p=$1establece la variable p en el primer argumento de línea de comandos.De esta manera
$p/$2es/$2si$2es un camino absoluto y$1/$2si es real.Finalmente,
realpath -sm $p/$2imprime el camino absoluto canónico de$p/$2. El-sconmutador hace que RealPath ignore los enlaces simbólicos, y al-mconmutador faltan componentes.fuente
Ruby, 16 bytes
Ya que aparentemente usa un método de la biblioteca estándar se permite :
Ver el conjunto de pruebas en repl.it .
fuente
File.expand_path:)GNU sed ,
8159 + 1 = 60 bytes+1 byte para
-rbandera. Espera entrada en STDIN separa por un solo espacio.Pruébalo en línea!
Explicación
fuente
Zsh , 15 bytes
los
:amodificador hace exactamente esto.Pruébalo en línea!
fuente