Описание
Учитывая исходный путь и путь назначения, выведите относительный путь к месту назначения относительно источника.
правила
Входные данные могут поступать из стандартного ввода или в качестве аргументов для программы / функции.
Должны поддерживаться пути как в Windows, так и в стиле Unix.
Выходной путь может использовать
/
и / или\
для разделителя пути (ваш выбор и комбинация обоих в порядке).Вы можете предположить, что возможен относительный путь.
Использование внешних программ, встроенных или библиотечных функций, предназначенных для вычисления относительных путей, запрещено (например, Python
os.path.relpath
).Это код-гольф
Изменить: новое правило из комментариев.
Относительный путь должен быть кратчайшим относительным путем.
Предположим, что путь назначения отличается от исходного пути.
Пример 1
# In
/usr/share/geany/colorschemes
/usr/share/vim/vim73/ftplugin
# Out
../../vim/vim73/ftplugin
Пример 2
# In
C:\Windows\System32\drivers
C:\Windows\System32\WindowsPowerShell\v1.0
# Out
..\WindowsPowerShell\v1.0
../../vim\vim73\ftplugin
.../vim/vim73/ftplugin
?Ответы:
CJam, 46 байтов
Попробуйте онлайн.
Примеры
Как это устроено
источник
/aa/x
с/ab/y
.Баш + кореутилс, 116
Вот сценарий оболочки, чтобы заставить мяч катиться. Уверен, что будут более короткие ответы:
Выход:
Обратите внимание, что сценарий не может определить, является ли строка
ftplugin
файлом или каталогом. Вы можете явно предоставить каталог, добавив его с помощью,/
как в примере выше.Не будет обрабатывать пути, содержащие пробелы или другие забавные символы. Не уверен, если это требование или нет. Всего несколько дополнительных цитат.
источник
Javascript (E6) 104
Редактировать Добавлено оповещение для вывода
Ungolfed
Тестовое задание
источник
Ruby> = 1,9, 89
94персонажиВвод через аргументы командной строки. Работает для путей в стиле UNIX и Windows, включая пути с повторяющимися именами папок:
источник
J - 63 символа
Функция, берущая старый путь слева и новый путь справа.
Это решение состоит из трех частей, похоже
post@loop&pre~
. Объяснил взрывом:Обратите внимание, что мы добавляем ведущий
/
к каждому пути перед разбиением, чтобы обрабатывать пути в стиле Windows, превращая ихC:
в «папку». Это приводит к пустой папке в начале путей в стиле Unix, но она всегда удаляется циклом.Посмотрите это в действии:
Вы также можете попробовать сами на tryj.tk .
источник
Баш,
6966Я не опубликовал это, потому что я думал, что кто-то должен быть в состоянии сделать это намного лучше. Но, видимо, это не так просто.
N
делаетsed
соответствие двух строк вместе. Первое выражение удаляет общий префикс, заканчивающийся на/
или\
. Второе выражение заменяет имена каталогов..
в первой строке. Наконец, он объединяет две строки с разделителем.Спасибо Hasturkun за 3 персонажа.
источник
sed
дважды, вы можете сделать это одним скриптом.N
. Может быть, вы можете редактировать этот ответ, если вы знаете, как.С
119106источник
p(char*s,char*d){for(;*s;)*s++-*d?*s-47||printf("../"):d++;puts(d);}
68 символов без обратной косой чертыПитон 3, 120
Пример:
источник
exec
и строковых операций?map(input,' ')
работать для `(input (), input ())? (Я не могу проверить это сам)Рубин - 89
Использование:
источник
/foo/bar/foo/bar
и/foo/qux/foo/bar
.JavaScript - 155
Анализирует любой формат пути, но выводит с
/
разделителем.источник
PHP,
158151Ungolfed:
источник
cd
формировать одно в другое :)Groovy - 144 символа
Одно из решений:
пример вывода:
ungolfed:
источник