A veces, se puede acortar una ruta absoluta larga, por ejemplo, un parámetro de línea de comando a una herramienta de Linux, utilizando el directorio de trabajo actual como referencia:
$ pwd
/home/heh
$ cat /home/heh/mydir/myfile
my stuff
$ cat mydir/myfile
my stuff
En este desafío, debe hacer una función o un programa que reciba dos parámetros:
- Ruta absoluta, utilizando el formato de Linux (comienza con
/
) - Directorio actual, usando el mismo formato
La salida es la más corta de las siguientes:
- Entrada 1 sin cambios
- Ruta relativa que se refiere al mismo archivo / directorio que la ruta absoluta
Puntos finos:
- Si su sistema operativo es compatible con Linux, puede usar el directorio actual del sistema en lugar de recibirlo como entrada
- Puede suponer que las entradas contienen solo caracteres alfanuméricos (y separadores de ruta)
- Puede suponer que la ruta absoluta de entrada no tiene un separador de ruta
/
al final - Puede suponer que el directorio actual de entrada tiene un separador de ruta
/
al final - No puede suponer que la ruta absoluta se refiere a un archivo existente, o que cualquier parte de este es un directorio accesible; sin embargo, el directorio actual se puede suponer válido
- Puede suponer que no hay enlaces simbólicos en ninguna parte cerca de ninguna ruta, porque no quiero requerir ninguna forma especial de tratar con enlaces simbólicos
- No es necesario admitir el caso donde cualquiera de las entradas es el directorio raíz
- "El directorio actual" debe aparecer como
.
(una cadena vacía no es válida)
Casos de prueba (entrada1, entrada2, salida):
/home/user/mydir/myfile
/home/user
mydir/myfile
/var/users/admin/secret/passwd
/var/users/joe/hack
../../admin/secret/passwd
/home/user/myfile
/tmp/someplace
/home/user/myfile
/dir1/dir2
/dir1/dir2/dir3/dir4
../..
/dir1/dir2
/dir1/dir2
.
code-golf
string
file-system
anatolyg
fuente
fuente
/
al final". Sin embargo, en sus ejemplos, este no es el caso./home/test /home/user/mydir/myfile /home/test
y/a/b /a/b/d/e /a/b
Respuestas:
Julia 0.5 , 32 bytes
Esto utiliza el directorio de trabajo actual como base y no se puede probar en TIO en este momento.
Ejecución de ejemplo
Advertencia: Esto alterará su sistema de archivos.
Versión alternativa, 35 bytes (diádica)
Esto toma el directorio base como entrada, por lo que puede probarse sin modificar el sistema de archivos.
Pruébalo en línea!
fuente
Base.-
errores a menos que se importe explícitamente, ¿no?-
antes de redefinirlo. En 0.4, imprime una advertencia si lo usa antes de la redefinición o no.JavaScript (ES6),
107106 bytesToma la ruta absoluta
a
y la ruta actualc
en la sintaxis de curry(a)(c)
.Casos de prueba
Mostrar fragmento de código
fuente
[a.length]
! ¿Puedo pedirlo prestado para mejorar mi respuesta de Node.js?Retina ,
858382 bytes1 byte guardado gracias a @MartinEnder
Pruébalo en línea!
fuente
ES6 (Node.js REPL),
56,54,46, 45 bytes[f.length]
truco de la respuesta de @ Arnauld , -6 bytesGolfed
Prueba
fuente
Python 2,
135144 bytesPruébalo en línea!
Algo largo, pero quería hacer una solución sin funciones de ruta incorporadas.
Editar: 9 bytes agregados a la cuenta para el caso de prueba proporcionado por Nathan Merrill
fuente
Zsh + realpath, 58 bytes
Pruébalo en línea!
Versión bash, 62 bytes
Pruébalo en línea!
fuente
Python 3 - 53 bytes
Utilizando
os.path
:Programa completo (61 bytes):
fuente
PHP, 204 bytes
Casos de prueba
Expandido
Si una salida
../../
en lugarof ../..
se deja que se puede acortar a 175 Bytesfuente
C # - 66 bytes
Usando un .NET incorporado y forzando a ser una ruta válida:
Donde
f
,t
y la salida sonstring
.Pruébalo en línea!
fuente