Для этого испытания вам будет предоставлен абсолютный путь и «новый» путь (который может быть абсолютным или относительным), и вам нужно будет вернуть окончательный путь.
Например, если ваш текущий каталог был /var/tmp/test
:
my_dir
или my_dir/
должен вернуться/var/tmp/test/my_dir
../../my_dir
должен вернуться /var/my_dir
/my_dir/./
должен вернуться /my_dir
../../../../../
должен вернуться /
Чтобы быть более педантичным:
- Каталог является непустая строка , состоящая из буквенно - цифровых символов и символов
-
,_
или.
- Путь - это список из 0 или более каталогов , разделенных с помощью
/
. Абсолютный путь начинается с a/
, относительный путь - нет. Пути могут включать окончание/
.
Вам необходимо «разрешить» второй путь, учитывая первый путь.
Процесс разрешения:
- Проверьте, является ли второй путь относительным. Если это так, вставьте каталоги абсолютного пути в начало второго пути.
- Если какой-либо из каталогов есть
..
, то удалите его и предыдущий каталог. Если это первый каталог, просто удалите его. - Если какой-либо из каталогов есть
.
, то удалите его. - Выведите окончательный абсолютный путь. Вы не должны выводить окончание
/
.
Вам не нужно обрабатывать неправильный ввод. Команды должны работать независимо от того, существуют ли фактически переданные каталоги на вашем компьютере. Вы можете предположить, что все является каталогом, даже если он имеет расширение.
Контрольные примеры
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"
"/." "" -> "/"
Это код-гольф , поэтому делайте ваши заявки как можно короче на вашем любимом языке!
источник
mkdir $patha; cd $patha; mkdir $pathb; cd $pathb; echo `abspath`
(или что-то)?Ответы:
Сетчатка , 44 байта
Ожидается, что входными данными будут два пути, разделенные одним пробелом.
Попробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)
источник
Python, 53 байта
источник
Пакет,
282281279276 байтДосадно, что пакетные выражения обычно не любят пустые переменные. Редактировать: 1 байт благодаря @ CᴏɴᴏʀO'Bʀɪᴇɴ и 2 байта благодаря @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ (и куча байтов на других ответах, хотя, увы, не зачислены).
источник
call
и: x`, нет?Python 2,
265,260,254 байтаисточник
Python,
142137 байтисточник
Баш, 41 байт
Этот скрипт bash имеет побочный эффект создания каталогов, если они не существуют, но он должен соответствовать требованиям. Спасибо Карлу и Нилу за ваши улучшения.
Использование: bash getpath.sh "absolute" "new"
Если вам не нравится stderr, когда второй аргумент является пустой строкой, вы можете проверить его следующим образом (48 байт):
Предыдущая 30-байтовая попытка (требуется наличие каталогов):
cd $ 1; [$ 2] && cd $ 2; echopwd
источник
mkdir -p
бы убедиться, что они существуют.C #, 43 байта
Сохранено 1 байт благодаря @aloisdg
Path.Combine
Переводит аргументы вместе, иPath.GetFullPath
решает , что..\
ыисточник
main
включите и класс, либо измените его на lanbda:a,b->
...,
:(x, y)
=>(x,y)
Узел REPL,
812 байтК счастью, вам не нужны
require()
стандартные модули в REPL.Тестирование
https://repl.it/Cclo/1
(Если вывод в конце есть
true
, он совпадает)источник
Javascript, 210 байт
Вот тестовый набор
С переносами строк вместо точек с запятой:
источник
Java 7, 83 байта
normalize
необходимо иметь дело с относительными ссылками.add
используется для обработки второго пути, начинающегося с/
, которыйPaths.get(a, b)
не будет обрабатываться как указано.источник
Баш, 38 байт
Не требует прав суперпользователя и не делает никаких предположений о существующих или несуществующих файлах, каталогах или символических ссылках.
Проверьте это на Ideone .
Как это устроено
[[ $2 = /* ]]
тесты , если второй аргумент командной строки начинается с/
.Если это не так, путь является относительным и
p=$1
устанавливает переменную p в качестве первого аргумента командной строки.Этот путь
$p/$2
,/$2
если$2
это абсолютный путь, и$1/$2
если он реальный.Наконец,
realpath -sm $p/$2
печатает канонический абсолютный путь$p/$2
. В-s
коммутаторе марка Realpath игнорирует символические ссылки, а также-m
переключатель отсутствует компоненты.источник
Рубин, 16 байт
Поскольку, очевидно, использование метода из стандартной библиотеки разрешено:
Смотрите набор тестов на repl.it .
источник
File.expand_path
:)GNU sed ,
8159 + 1 = 60 байт+1 байт за
-r
флаг. Ожидается, что ввод в STDIN отделяется одним пробелом.Попробуйте онлайн!
объяснение
источник
Зш , 15 байт
:a
Модификатор делает именно это.Попробуйте онлайн!
источник