Parfois, un long chemin absolu, par exemple un paramètre de ligne de commande vers un outil Linux, peut être raccourci, en utilisant le répertoire de travail actuel comme référence:
$ pwd
/home/heh
$ cat /home/heh/mydir/myfile
my stuff
$ cat mydir/myfile
my stuff
Dans ce défi, vous devez créer une fonction ou un programme qui reçoit deux paramètres:
- Chemin absolu, en utilisant le format linux (commence par
/
) - Répertoire courant, utilisant le même format
La sortie est la plus courte des valeurs suivantes:
- Entrée 1 inchangée
- Chemin relatif qui fait référence au même fichier / répertoire que le chemin absolu
Points fins:
- Si votre système d'exploitation est compatible avec Linux, vous pouvez utiliser le répertoire actuel du système au lieu de le recevoir en entrée
- Vous pouvez supposer que les entrées contiennent uniquement des caractères alphanumériques (et des séparateurs de chemin)
- Vous pouvez supposer que le chemin absolu d'entrée n'a pas de séparateur de chemin
/
à la fin - Vous pouvez supposer que le répertoire courant d'entrée a un séparateur de chemin
/
à la fin - Vous ne pouvez pas supposer que le chemin absolu fait référence à un fichier existant, ou que n'importe quelle partie de celui-ci est un répertoire accessible; cependant, le répertoire courant peut être considéré comme valide
- Vous pouvez supposer qu'il n'y a aucun lien symbolique n'importe où près de l'un ou l'autre chemin - parce que je ne veux pas avoir besoin d'une manière spéciale de traiter les liens symboliques
- Pas besoin de prendre en charge le cas où l'une des entrées est le répertoire racine
- "Le répertoire courant" doit être affiché en tant que
.
(une chaîne vide n'est pas valide)
Cas de test (entrée1, entrée2, sortie):
/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
la source
la source
/
à la fin". Cependant, dans vos exemples, ce n'est pas le cas./home/test /home/user/mydir/myfile /home/test
et/a/b /a/b/d/e /a/b
Réponses:
Julia 0,5 , 32 octets
Cela utilise le répertoire de travail actuel comme base et ne peut pas être testé sur TIO pour le moment.
Exemple d'exécution
Avertissement: cela modifiera votre système de fichiers.
Version alternative, 35 octets (dyadique)
Cela prend le répertoire de base en entrée, il peut donc être testé sans modifier le système de fichiers.
Essayez-le en ligne!
la source
Base.-
erreurs sauf importation explicite, non?-
avant de le redéfinir. En 0.4, il affiche un avertissement si vous l'utilisez avant la redéfinition ou non.JavaScript (ES6),
107106 octetsPrend le chemin absolu
a
et le chemin actuelc
dans la syntaxe de curry(a)(c)
.Cas de test
Afficher l'extrait de code
la source
[a.length]
! Puis-je l'emprunter pour améliorer ma réponse Node.js?Rétine ,
858382 octets1 octet enregistré grâce à @MartinEnder
Essayez-le en ligne!
la source
ES6 (Node.js REPL),
56,54,46, 45 octets[f.length]
astuce à la réponse de @ Arnauld , -6 octetsGolfé
Tester
la source
Python 2,
135144 octetsEssayez-le en ligne!
Un peu long, mais je voulais faire une solution sans fonctions de chemin d'accès intégrées.
Edit: 9 octets ajoutés pour tenir compte du cas de test fourni par Nathan Merrill
la source
Zsh + realpath, 58 octets
Essayez-le en ligne!
Version bash, 62 octets
Essayez-le en ligne!
la source
Python 3 - 53 octets
En utilisant
os.path
:Programme complet (61 octets):
la source
PHP, 204 octets
Cas de test
Étendu
Si une sortie à la
../../
placeof ../..
est autorisée , elle peut être raccourcissent 175 Octetsla source
C # - 66 octets
Utiliser un intégré .NET et forcer à être un chemin valide:
Où
f
,t
et la sortie sontstring
.Essayez-le en ligne!
la source