Za to wyzwanie otrzymasz ścieżkę bezwzględną i „nową” ścieżkę (która może być absolutna lub względna) i musisz zwrócić ostatnią ścieżkę.
Na przykład jeśli bieżący katalog to /var/tmp/test
:
my_dir
lub my_dir/
powinien wrócić/var/tmp/test/my_dir
../../my_dir
powinien wrócić /var/my_dir
/my_dir/./
powinien wrócić /my_dir
../../../../../
powinien wrócić /
Aby być bardziej pedantycznym:
- Katalog jest niepusty łańcuch składający się ze znaków alfanumerycznych i symboli
-
,_
lub.
- Ścieżka to lista 0 lub więcej katalogów oddzielonych za pomocą
/
. Ścieżka bezwzględna zaczyna się od/
, ścieżka względna nie. Ścieżki mogą zawierać zakończenie/
.
Musisz „rozwiązać” drugą ścieżkę, biorąc pod uwagę pierwszą ścieżkę.
Proces rozstrzygania jest:
- Sprawdź, czy druga ścieżka jest względna. Jeśli tak, wstaw katalogi ścieżki bezwzględnej na początek drugiej ścieżki.
- Jeśli którykolwiek z katalogów jest
..
, usuń go i poprzedni katalog. Jeśli jest to pierwszy katalog, po prostu go usuń. - Jeśli którykolwiek z katalogów jest
.
, usuń go. - Wyjście końcowej ścieżki bezwzględnej. Nie powinieneś wypisywać zakończenia
/
.
Nie musisz obsługiwać nieprawidłowych danych wejściowych. Polecenia powinny działać, niezależnie od tego, czy przekazane katalogi faktycznie istnieją na twoim komputerze. Możesz założyć, że wszystko jest katalogiem, nawet jeśli ma rozszerzenie.
Przypadki testowe
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"
"/." "" -> "/"
To jest golf golfowy , dlatego postaraj się , aby Twoje zgłoszenia były jak najkrótsze w swoim ulubionym języku!
źródło
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(lub coś w tym rodzaju)?Odpowiedzi:
Siatkówka , 44 bajty
Dane wejściowe powinny być dwiema ścieżkami oddzielonymi pojedynczą spacją.
Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
źródło
Python, 53 bajty
źródło
Partia,
282281279276 bajtówIrytujące wyrażenia wsadowe na ogół nie lubią pustych zmiennych. Edycja: Zapisano 1 bajt dzięki @ CᴏɴᴏʀO'Bʀɪᴇɴ i 2 bajty dzięki @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ (i kilka bajtów także na inne odpowiedzi, choć niestety niewymienione w czołówce).
źródło
call
i: x`, nie?Python 2,
265260254 bajtówźródło
Python,
142137 bajtówźródło
Bash, 41 bajtów
Ten skrypt bash ma efekt uboczny tworzenia katalogów, jeśli nie istnieją, ale powinien spełniać wymagania. Dzięki Karl i Neil za twoje ulepszenia.
Zastosowanie: bash getpath.sh „absolutny” „nowy”
Jeśli nie podoba ci się stderr, gdy drugi argument jest pustym łańcuchem, możesz go przetestować w następujący sposób (48 bajtów):
Poprzednia 30-bajtowa próba (wymaga istnienia katalogów):
cd $ 1; [$ 2] && cd $ 2; echopwd
źródło
mkdir -p
upewnić się, że one istnieją.C #, 43 bajty
Zapisano 1 bajt dzięki @aloisdg
Path.Combine
łączy argumenty iPath.GetFullPath
rozwiązuje..\
sźródło
main
dołącz i klasę, albo zmień go na lanbda:a,b->
...,
:(x, y)
=>(x,y)
Węzeł REPL,
812 bajtówNa szczęście nie musisz
require()
standardowych modułów w REPL.Pakiet testowy
https://repl.it/Cclo/1
(Jeśli wyjście jest na końcu
true
, to pasuje)źródło
JavaScript, 210 bajtów
Oto pakiet testowy
Z podziałami linii zamiast średników:
źródło
Java 7, 83 bajty
normalize
jest potrzebny do radzenia sobie z referencjami względnymi.add
służy do obsługi drugiej ścieżki zaczynającej się od/
, któraPaths.get(a, b)
nie będzie obsługiwać zgodnie z opisem.źródło
Bash, 38 bajtów
Nie wymaga uprawnień administratora i nie przyjmuje żadnych założeń dotyczących istniejących lub nieistniejących plików, katalogów lub dowiązań symbolicznych.
Przetestuj na Ideone .
Jak to działa
[[ $2 = /* ]]
sprawdza, czy zaczyna się drugi argument wiersza polecenia/
.Jeśli nie, ścieżka jest względna i
p=$1
ustawia zmienną p na pierwszy argument wiersza poleceń.Tak
$p/$2
jest,/$2
jeśli$2
jest to ścieżka bezwzględna i$1/$2
jeśli jest to ścieżka realna.Na koniec
realpath -sm $p/$2
drukuje kanoniczną ścieżkę bezwzględną$p/$2
. Do-s
przełącznika marki realpath ignorować łączy symbolicznych, i-m
elementy przełączające brakuje.źródło
Rubinowy, 16 bajtów
Ponieważ najwyraźniej stosowanie metody ze standardowej biblioteki jest dozwolone:
Patrz zestaw testowy na repl.it .
źródło
File.expand_path
:)GNU sed ,
8159 + 1 = 60 bajtów+1 bajt dla
-r
flagi. Oczekuje, że dane wejściowe na STDIN są oddzielone pojedynczą spacją.Wypróbuj online!
Wyjaśnienie
źródło
Zsh , 15 bajtów
:a
Modyfikator robi dokładnie to.Wypróbuj online!
źródło