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/x
con/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
ftplugin
es 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.
N
hacesed
coincidir 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
sed
dos 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
exec
y las operaciones de cadena?map(input,' ')
funcionar para `(input (), input ())? (No puedo probarlo yo mismo)Rubí - 89
Uso:
fuente
/foo/bar/foo/bar
y/foo/qux/foo/bar
.JavaScript - 155
Analiza cualquier formato de ruta pero sale con
/
separador.fuente
PHP,
158151Sin golf:
fuente
cd
forme uno a otro :)Groovy - 144 caracteres
Una solución:
salida de ejemplo:
sin golf:
fuente