Untuk tantangan ini, Anda akan diberikan jalur absolut, dan jalur "baru" (yang bisa absolut atau relatif), dan Anda harus mengembalikan jalur terakhir.
Misalnya, jika direktori Anda saat ini adalah /var/tmp/test
:
my_dir
atau my_dir/
harus kembali/var/tmp/test/my_dir
../../my_dir
harus kembali /var/my_dir
/my_dir/./
harus kembali /my_dir
../../../../../
harus kembali /
Untuk menjadi lebih bertele-tele:
- Sebuah direktori adalah string non-kosong yang terdiri dari karakter alfanumerik dan simbol-simbol
-
,_
atau.
- Path adalah daftar 0 atau lebih direktori , dipisahkan menggunakan
/
. Jalur absolut dimulai dengan a/
, jalur relatif tidak. Jalur dapat menyertakan akhiran/
.
Anda perlu "menyelesaikan" jalur kedua, mengingat jalur pertama.
Proses penyelesaiannya adalah:
- Uji apakah jalur kedua relatif. Jika demikian, maka masukkan direktori jalur absolut ke awal jalur kedua.
- Jika ada salah satu direktori
..
, maka hapus dan direktori sebelumnya. Jika ini adalah direktori pertama, cukup hapus saja. - Jika ada direktori
.
, maka hapus. - Keluarkan jalan absolut terakhir. Anda seharusnya tidak menghasilkan akhir
/
.
Anda tidak perlu menangani input yang salah. Perintah harus bekerja, apakah direktori yang dilewati benar-benar ada di mesin Anda. Anda dapat mengasumsikan bahwa semuanya adalah direktori, bahkan jika ia memiliki ekstensi.
Uji kasus
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"
"/." "" -> "/"
Ini adalah kode-golf , jadi buat kiriman Anda sesingkat mungkin dalam bahasa favorit Anda!
sumber
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(atau sesuatu)?Jawaban:
Retina , 44 byte
Input diharapkan menjadi dua jalur yang dipisahkan oleh ruang tunggal.
Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
sumber
Python, 53 byte
sumber
Batch,
282281279276 byteEkspresi Annoyingly Batch umumnya tidak suka variabel kosong. Sunting: Disimpan 1 byte berkat @ CᴏɴᴏʀO'Bʀɪᴇɴ dan 2 byte terima kasih ke @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ (dan banyak byte pada jawaban lain juga, meskipun sayangnya tidak terakreditasi).
sumber
call
dan: x`, tidak?Python 2,
265260254 bytesumber
Python,
142137 bytesumber
Bash, 41 byte
Skrip bash ini memiliki efek samping membuat direktori jika tidak ada, tetapi harus memenuhi persyaratan. Terima kasih Karl dan Neil untuk perbaikan Anda.
Penggunaan: bash getpath.sh "absolute" "baru"
Jika Anda tidak menyukai stderr ketika argumen kedua adalah string kosong, Anda dapat mengujinya sebagai berikut (48 byte):
Upaya 30 byte sebelumnya (membutuhkan direktori ada):
cd $ 1; [$ 2] && cd $ 2; echopwd
sumber
mkdir -p
memastikan mereka ada.C #, 43 byte
Disimpan 1 byte berkat @aloisdg
Path.Combine
menempatkan argumen bersama, danPath.GetFullPath
menyelesaikan..\
ssumber
main
dan kelas, atau mengubahnya menjadi lanbda:a,b->
...,
:(x, y)
=>(x,y)
Node REPL,
812 byteUntungnya Anda tidak harus memiliki
require()
modul standar dalam REPL.Test Suite
https://repl.it/Cclo/1
(Jika output pada akhirnya
true
, itu cocok)sumber
Javascript, 210 byte
Berikut ini adalah test suite
Dengan linebreak alih-alih titik koma:
sumber
Java 7, 83 byte
normalize
diperlukan untuk berurusan dengan referensi relatif.add
digunakan untuk menangani jalur kedua dimulai dengan/
, yangPaths.get(a, b)
tidak akan menangani seperti yang ditentukan.sumber
Bash, 38 byte
Tidak memerlukan hak akses root dan tidak membuat asumsi tentang file, direktori atau tautan simbolik yang ada atau tidak ada.
Uji di Ideone .
Bagaimana itu bekerja
[[ $2 = /* ]]
menguji apakah argumen baris perintah kedua dimulai dengan/
.Jika tidak, jalur relatif dan
p=$1
menetapkan variabel p ke argumen baris perintah pertama.Cara ini
$p/$2
adalah/$2
jika$2
jalur absolut dan$1/$2
jika jalan realtive.Akhirnya,
realpath -sm $p/$2
mencetak jalur absolut kanonik$p/$2
. The-s
beralih merek realpath mengabaikan link simbolik, dan-m
beralih hilang komponen.sumber
Ruby, 16 byte
Karena tampaknya menggunakan metode dari perpustakaan standar diperbolehkan:
Lihat test suite di repl.it .
sumber
File.expand_path
:)GNU sed ,
8159 + 1 = 60 byte+1 byte untuk
-r
bendera. Mengharapkan input pada STDIN terpisah oleh satu ruang.Cobalah online!
Penjelasan
sumber
Zsh , 15 byte
The
:a
pengubah tidak tepat ini.Cobalah online!
sumber