Für diese Herausforderung erhalten Sie einen absoluten Pfad und einen "neuen" Pfad (der absolut oder relativ sein kann), und Sie müssen den endgültigen Pfad zurückgeben.
Zum Beispiel, wenn Ihr aktuelles Verzeichnis war /var/tmp/test
:
my_dir
oder my_dir/
sollte zurückkehren/var/tmp/test/my_dir
../../my_dir
sollte zurückkehren /var/my_dir
/my_dir/./
sollte zurückkehren /my_dir
../../../../../
sollte zurückkehren /
Um pedantischer zu sein:
- Ein Verzeichnis ist eine nicht leere Zeichenfolge , bestehend aus alphanumerischen Zeichen und die Symbole
-
,_
, oder.
- Ein Pfad ist eine Liste von 0 oder mehr Verzeichnissen , die mit getrennt werden
/
. Ein absoluter Pfad beginnt mit a/
, ein relativer Pfad nicht. Pfade können ein Ende enthalten/
.
Sie müssen den zweiten Pfad unter Angabe des ersten Pfads "auflösen".
Der Lösungsprozess ist:
- Testen Sie, ob der zweite Pfad relativ ist. Wenn ja, fügen Sie die Verzeichnisse des absoluten Pfads an den Anfang des zweiten Pfads ein.
- Wenn eines der Verzeichnisse vorhanden ist
..
, entfernen Sie es und das vorhergehende Verzeichnis. Wenn es das erste Verzeichnis ist, entfernen Sie es einfach. - Wenn eines der Verzeichnisse vorhanden ist
.
, entfernen Sie es. - Geben Sie den endgültigen absoluten Pfad aus. Sie sollten kein Ende ausgeben
/
.
Sie müssen nicht mit falschen Eingaben umgehen. Die Befehle sollten funktionieren, unabhängig davon, ob die übergebenen Verzeichnisse tatsächlich auf Ihrem Computer vorhanden sind. Sie können davon ausgehen, dass alles ein Verzeichnis ist, auch wenn es eine Erweiterung hat.
Testfälle
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"
"/." "" -> "/"
Dies ist ein Code-Golf , also machen Sie Ihre Einsendungen so kurz wie möglich in Ihrer Lieblingssprache!
quelle
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(oder so)?Antworten:
Retina , 44 Bytes
Es wird erwartet, dass die Eingabe die zwei Pfade sind, die durch ein einzelnes Leerzeichen getrennt sind.
Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
quelle
Python, 53 Bytes
quelle
Batch,
282281279276 BytesÄrgerlicherweise mögen Batch-Ausdrücke im Allgemeinen keine leeren Variablen. Bearbeiten: 1 Byte dank @ CᴏɴᴏʀO'Bʀɪᴇɴ und 2 Byte dank @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ gespeichert (und eine Reihe von Bytes auch bei anderen Antworten, obwohl leider nicht im Abspann).
quelle
call
und entfernen : x`, nein?Python 2,
265260254 Bytesquelle
Python,
142137 Bytesquelle
Bash, 41 Bytes
Dieses Bash-Skript hat den Nebeneffekt, dass Verzeichnisse erstellt werden, wenn sie nicht vorhanden sind. Es sollte jedoch die Anforderungen erfüllen. Vielen Dank an Karl und Neil für eure Verbesserungen.
Verwendung: bash getpath.sh "absolute" "new"
Wenn Ihnen das stderr nicht gefällt, wenn das zweite Argument eine leere Zeichenfolge ist, können Sie es wie folgt testen (48 Byte):
Vorheriger 30-Byte-Versuch (es müssen Verzeichnisse vorhanden sein):
cd $ 1; [$ 2] && cd $ 2; echopwd
quelle
mkdir -p
sicherstellen, dass sie existieren.C # 43 Bytes
1 Byte dank @aloisdg gespeichert
Path.Combine
fasst die Argumente zusammen undPath.GetFullPath
löst das..\
s aufquelle
main
und eine Klasse oder ändern Sie es in ein lanbda:a,b->
...,
:(x, y)
=>(x,y)
Knoten REPL,
8 -12 BytesZum Glück müssen Sie
require()
in der REPL keine Standardmodule verwenden.Test Suite
https://repl.it/Cclo/1
(Wenn die Ausgabe am Ende ist
true
, stimmt sie überein)quelle
Javascript, 210 Bytes
Hier ist die Testsuite
Mit Zeilenumbrüchen anstelle von Semikolons:
quelle
Java 7, 83 Bytes
normalize
wird benötigt, um mit relativen Referenzen umzugehen.add
wird verwendet, um den zweiten Pfad zu behandeln/
, derPaths.get(a, b)
nicht wie angegeben behandelt wird.quelle
Bash, 38 Bytes
Erfordert keine Root-Rechte und macht keine Annahmen über vorhandene oder nicht vorhandene Dateien, Verzeichnisse oder symbolische Links.
Teste es auf Ideone .
Wie es funktioniert
[[ $2 = /* ]]
testet, ob das zweite Befehlszeilenargument mit beginnt/
.Ist dies nicht der Fall, ist der Pfad relativ und
p=$1
setzt die Variable p auf das erste Befehlszeilenargument.Auf diese Weise
$p/$2
ist/$2
if$2
ein absoluter und$1/$2
ein realistischer Pfad.Zum Schluss wird
realpath -sm $p/$2
der kanonische absolute Pfad von gedruckt$p/$2
. Der-s
Schalter veranlasst Realpath , symbolische Verknüpfungen zu ignorieren, und dem-m
Schalter fehlen Komponenten.quelle
Ruby, 16 Bytes
Da anscheinend die Verwendung einer Methode aus der Standardbibliothek erlaubt ist:
Sehen Sie sich die Test - Suite auf repl.it .
quelle
File.expand_path
GNU sed ,
8159 + 1 = 60 Bytes+1 Byte für
-r
Flag. Erwartet, dass die Eingabe in STDIN durch ein einzelnes Leerzeichen getrennt wird.Probieren Sie es online!
Erläuterung
quelle
Zsh , 15 Bytes
Der
:a
Modifikator macht genau das.Probieren Sie es online!
quelle