Pour ce défi, vous recevrez un chemin absolu et un "nouveau" chemin (qui peut être absolu ou relatif), et vous devrez retourner le chemin final.
Par exemple, si votre répertoire actuel était /var/tmp/test
:
my_dir
ou my_dir/
devrait revenir/var/tmp/test/my_dir
../../my_dir
devrait revenir /var/my_dir
/my_dir/./
devrait revenir /my_dir
../../../../../
devrait revenir /
Pour être plus pédant:
- Un répertoire est une chaîne non vide constitué de caractères alphanumériques et des symboles
-
,_
ou.
- Un chemin est une liste de 0 ou plusieurs répertoires , séparés par
/
. Un chemin absolu commence par a/
, pas un chemin relatif. Les chemins peuvent inclure une fin/
.
Vous devez "résoudre" le deuxième chemin, étant donné le premier chemin.
Le processus de résolution est le suivant:
- Testez si le deuxième chemin est relatif. Si tel est le cas, insérez les répertoires du chemin absolu au début du deuxième chemin.
- Si l'un des répertoires l'est
..
, supprimez-le ainsi que le répertoire précédent. S'il s'agit du premier répertoire, supprimez-le simplement. - Si l'un des répertoires l'est
.
, supprimez-le. - Sortez le chemin absolu final. Vous ne devez pas produire de fin
/
.
Vous n'avez pas besoin de gérer une entrée incorrecte. Les commandes devraient fonctionner, que les répertoires transmis existent ou non sur votre machine. Vous pouvez supposer que tout est un répertoire, même s'il a une extension.
Cas de test
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"
"/." "" -> "/"
Ceci est un code-golf , alors faites vos soumissions aussi courtes que possible dans votre langue préférée!
la source
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(ou quelque chose)?Réponses:
Rétine , 44 octets
L'entrée devrait être les deux chemins séparés par un seul espace.
Essayez-le en ligne! (La première ligne active une suite de tests séparés par un saut de ligne.)
la source
Python, 53 octets
la source
Lot,
282281279276 octetsLes expressions batch ennuyeuses n'aiment généralement pas les variables vides. Edit: 1 octet enregistré grâce à @ CᴏɴᴏʀO'Bʀɪᴇɴ et 2 octets grâce à @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ (et un tas d'octets sur d'autres réponses aussi, bien que hélas non crédité).
la source
call
et: x`, non?Python 2,
265260254 octetsla source
Python,
142137 octetsla source
Bash, 41 octets
Ce script bash a pour effet secondaire de créer des répertoires s'ils n'existent pas, mais il devrait répondre aux exigences. Merci Karl et Neil pour vos améliorations.
Utilisation: bash getpath.sh "absolu" "nouveau"
Si vous n'aimez pas le stderr lorsque le deuxième argument est une chaîne vide, vous pouvez le tester comme suit (48 octets):
Tentative précédente de 30 octets (nécessite l'existence de répertoires):
cd $ 1; [$ 2] && cd $ 2; echopwd
la source
mkdir -p
vous assurer qu'ils existent.C #, 43 octets
1 octet enregistré grâce à @aloisdg
Path.Combine
met les arguments ensemble, etPath.GetFullPath
résout le..\
sla source
main
et une classe, ou changez-le en lanbda:a,b->
...,
:(x, y)
=>(x,y)
Node REPL,
812 octetsHeureusement, vous n'avez pas besoin de
require()
modules standard dans le REPL.Suite de tests
https://repl.it/Cclo/1
(Si la sortie à la fin est
true
, elle correspond)la source
Javascript, 210 octets
Voici la suite de tests
Avec des sauts de ligne au lieu de points-virgules:
la source
Java 7, 83 octets
normalize
est nécessaire pour traiter les références relatives.add
est utilisé pour gérer le deuxième chemin commençant par/
, quiPaths.get(a, b)
ne sera pas géré comme spécifié.la source
Bash, 38 octets
Ne nécessite pas de privilèges root et ne fait aucune supposition sur les fichiers, répertoires ou liens symboliques existants ou non.
Testez-le sur Ideone .
Comment ça fonctionne
[[ $2 = /* ]]
teste si le deuxième argument de ligne de commande commence par/
.Si ce n'est pas le cas, le chemin est relatif et
p=$1
définit la variable p sur le premier argument de ligne de commande.De cette façon
$p/$2
est le/$2
cas$2
est un chemin absolu et$1/$2
si elle est un realtive.Enfin,
realpath -sm $p/$2
imprime le chemin absolu canonique de$p/$2
. Le-s
commutateur fait que realpath ignore les liens symboliques et les-m
composants manquants du commutateur.la source
Ruby, 16 octets
Puisqu'apparemment, l'utilisation d' une méthode de la bibliothèque standard est autorisée:
Voir la suite au repl.it test .
la source
File.expand_path
:)GNU sed ,
8159 + 1 = 60 octets+1 octet pour le
-r
drapeau. Attend l'entrée sur STDIN sépare par un seul espace.Essayez-le en ligne!
Explication
la source
Zsh , 15 octets
Le
:a
modificateur fait exactement cela.Essayez-le en ligne!
la source