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_dir
o 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
call
y: 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; echopwd
fuente
mkdir -p
asegurarte de que existan.C #, 43 bytes
Guardado 1 byte gracias a @aloisdg
Path.Combine
pone los argumentos juntos yPath.GetFullPath
resuelve el..\
sfuente
main
y 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
normalize
es necesario para tratar referencias relativas.add
se 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=$1
establece la variable p en el primer argumento de línea de comandos.De esta manera
$p/$2
es/$2
si$2
es un camino absoluto y$1/$2
si es real.Finalmente,
realpath -sm $p/$2
imprime el camino absoluto canónico de$p/$2
. El-s
conmutador hace que RealPath ignore los enlaces simbólicos, y al-m
conmutador 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
-r
bandera. Espera entrada en STDIN separa por un solo espacio.Pruébalo en línea!
Explicación
fuente
Zsh , 15 bytes
los
:a
modificador hace exactamente esto.Pruébalo en línea!
fuente