Descripción
Dada una ruta de origen y una ruta de destino, genera la ruta relativa al destino con respecto a la fuente.
Reglas
La entrada puede provenir de stdin o como argumentos para el programa / función.
Tanto las rutas de estilo Windows como Unix deben ser compatibles.
La ruta de salida puede usar
/y / o\para el separador de ruta (su elección y combinación de ambas está bien).Puede suponer que es posible una ruta relativa.
El uso de programas externos, funciones incorporadas o de biblioteca hechas para calcular rutas relativas está prohibido (por ejemplo, Python
os.path.relpath)Esto es código golf
Editar: nueva regla de los comentarios.
La ruta relativa debe ser la ruta relativa más corta posible.
Suponga que la ruta de destino es diferente de la ruta de origen.
Ejemplo 1
# In
/usr/share/geany/colorschemes
/usr/share/vim/vim73/ftplugin
# Out
../../vim/vim73/ftplugin
Ejemplo 2
# In
C:\Windows\System32\drivers
C:\Windows\System32\WindowsPowerShell\v1.0
# Out
..\WindowsPowerShell\v1.0

../../vim\vim73\ftplugin.../vim/vim73/ftplugin?Respuestas:
CJam, 46 bytes
Pruébalo en línea.
Ejemplos
Cómo funciona
fuente
/aa/xcon/ab/y.Bash + coreutils, 116
Aquí hay un script de shell para que la pelota ruede. Estoy bastante seguro de que habrá respuestas más cortas:
Salida:
Tenga en cuenta que no hay forma de que el script indique si la cadena
ftplugines un archivo o un directorio. Puede proporcionar explícitamente un directorio agregándolo con un/como en el ejemplo anterior.No manejará rutas que contengan espacios en blanco u otros personajes divertidos. No estoy seguro si eso es un requisito o no. Solo se necesitarían algunas citas adicionales.
fuente
Javascript (E6) 104
Editar alerta agregada para salida
Sin golf
Prueba
fuente
Rubí> = 1.9, 89
94caracteresEntrada a través de argumentos de línea de comando. Funciona para rutas de estilo UNIX y Windows, incluidas rutas con nombres de carpeta repetidos:
fuente
J - 63 char
Una función que toma la ruta anterior a la izquierda y la nueva ruta a la derecha.
Esta solución viene en tres partes, parecidas
post@loop&pre~. Explicado por explosión:Tenga en cuenta que agregamos una guía
/a cada ruta antes de dividirla, de modo que manejemos las rutas al estilo de Windows al convertirlasC:en una "carpeta". Esto da como resultado una carpeta vacía al comienzo de las rutas de estilo Unix, pero que siempre se elimina con el bucle.Véalo en acción:
También puede hacerlo por uno mismo en tryj.tk .
fuente
Bash,
6966No publiqué este porque pensé que alguien debía poder hacerlo mucho mejor. Pero aparentemente no es tan fácil.
Nhacesedcoincidir dos líneas juntas. La primera expresión elimina el prefijo común que termina con/o\. La segunda expresión reemplaza los nombres de directorio con..en la primera línea. Finalmente concatena las dos líneas con el separador.Gracias a Hasturkun por 3 personajes.
fuente
seddos veces, puede hacerlo con un solo script.N. Tal vez puedas editar esta respuesta si sabes cómo.C,
119106fuente
p(char*s,char*d){for(;*s;)*s++-*d?*s-47||printf("../"):d++;puts(d);}68 caracteres sin barra invertidaPitón 3, 120
Ejemplo:
fuente
execy las operaciones de cadena?map(input,' ')funcionar para `(input (), input ())? (No puedo probarlo yo mismo)Rubí - 89
Uso:
fuente
/foo/bar/foo/bary/foo/qux/foo/bar.JavaScript - 155
Analiza cualquier formato de ruta pero sale con
/separador.fuente
PHP,
158151Sin golf:
fuente
cdforme uno a otro :)Groovy - 144 caracteres
Una solución:
salida de ejemplo:
sin golf:
fuente