Unshorten Google Links

10

Вызов

Получив действительную goo.glсокращенную ссылку, выведите исходный URL.

пример

goo.gl/qIwi3Nдал бы что-то вроде https://codegolf.stackexchange.com/. Для ввода вы можете выбрать иметь https?://в начале, вы можете иметь www.до goo.gl, и вы также можете избавиться от, goo.glесли вы хотите только конец URL. Косая черта в конце необязательна для ввода и вывода. Таким образом, ваш ввод будет соответствовать регулярному выражению (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Для вывода вы можете выбрать, выводить или нет, выводить https?://или нет www., а также выводить косую черту или нет. Однако вы должны соответствовать форматированию ввода-вывода .

Я скажу, что вам не нужно согласовываться с « httpsпротив» httpдля выходных данных (но вы должны быть согласованными для входных данных), если вы согласны с тем, включаете ли вы всю https?://часть или нет .

Тестовые случаи

Они написаны без https://, нет www., без косой черты на входе; да https://, нет www., и да косая черта в выводе.

input -> output
goo.gl/HaE8Au -> https://codegolf.stackexchange.com/
goo.gl/IfZMwe -> https://stackoverflow.com/
goo.gl/JUdmxL -> https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

Предположения

  • Вы можете предположить, что сокращенная ссылка не будет указывать на другую сокращенную ссылку и что целевой сайт вернет код состояния 2xxили 4xx(без перенаправлений).

Вы можете перейти сюда и ввести URL-адрес, чтобы применить обратную операцию: https://goo.gl/

HyperNeutrino
источник
@HelkaHomba исправлено
Павел
3
Погода или notr для вывода ведущих www.имеет значение. Это просто в большинстве случаев тот же сервер, к которому он относится. Попробуйте например http://pks.mpg.deи http://www.pks.mpg.de. Первый не может быть решен, в то время как последний может.
Голар Рамблар
@ StefhenS Готово, спасибо за предложение.
HyperNeutrino

Ответы:

11

CJam , 7 байтов

lg'"/5=

Тестовый забег

$ alias cjam
alias cjam='java -jar ~/.local/share/cjam-0.6.5.jar'
$ cjam unshorten.cjam <<< goo.gl/HaE8Au; echo
https://codegolf.stackexchange.com/
$ cjam unshorten.cjam <<< goo.gl/IfZMwe; echo
https://stackoverflow.com/
$ cjam unshorten.cjam <<< goo.gl/JUdmxL; echo
https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

Как это работает

lgчитает строку из STDIN и делает запрос GET к этому URL. Сокращенный URL-адрес вызывает перенаправление 301, которое CJam не выполняет. Для первого теста, это подталкивает

<HTML>
<HEAD>
<TITLE>Moved Permanently</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Permanently</H1>
The document has moved <A HREF="https://codegolf.stackexchange.com/">here</A>.
</BODY>
</HTML>

в стеке. Наконец, '"/разделяется на двойные кавычки и 5=получает шестой кусок. Вывод неявный.

Деннис
источник
1
Я пробовал 05AB1E и Pyth, они оба следуют 301 :(
Эрик Аутгольфер
3

Python 2 + запросы, 44 байта

from requests import*
print get(input()).url

requests.get(URL)выдает запрос GET на указанный URL. Поле объекта ответа urlсодержит окончательный URL после любых перенаправлений. Протокол (например http://) требуется для ввода, и ожидается, что ввод будет в кавычках.

Mego
источник
1
requestsне является встроенным, поэтому его необходимо добавить в заголовок языка.
Numbermaniac
1
Используйте lambdaвыражение для -3 байт
овс
1
@numbermaniac Ой, вы правы, я так привык к запросам, что забыл, что это сторонняя библиотека.
Мего
2

Баш , 28 24 байта

curl -I $1|grep -oehtt.*

Вывод заканчивается переводом строки в стиле Windows, что, я полагаю, приемлемо.

Тестовый забег

$ bash unshorten.sh 2>&- goo.gl/HaE8Au
https://codegolf.stackexchange.com/
$ bash unshorten.sh 2>&- goo.gl/IfZMwe
https://stackoverflow.com/
$ bash unshorten.sh 2>&- goo.gl/JUdmxL
https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

Как это работает

curl -Iотправляет запрос HEAD, поэтому он выбирает только заголовки HTTP указанного URL. Для первого теста, он печатает

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Date: Sat, 13 May 2017 05:51:48 GMT
Location: https://codegolf.stackexchange.com/
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

или похожие. Выходные данные передаются по конвейеру grep -oehtt.*, который отображает только те части, которые соответствуют указанному регулярному выражению, т. Е. Строка htt, за которой следует любое количество символов до конца строки.

Деннис
источник
Как это работает?
Арджун
Я добавил объяснение.
Деннис
Хе-хе, хорошо объяснил! Таким образом, я скоро
Это выполняет расширение по шаблону, htt.*поэтому предполагается, что в текущем каталоге не существует файлов, соответствующих ему. Для большинства регулярных выражений я бы согласился на этом сайте, что вероятность совпадения файла достаточно мала, и это нормально, но в этом случае я сам так не думаю. Исходный код ядра Linux включает, например, файлы с именами htt.cи htt.h. Изменение его на grep -oehtt.*не увеличивает число байтов, но значительно снижает вероятность возникновения проблем.
HVd
@hvd Я обычно предполагаю, что программа запускается в пустой директории, но -oehtt.*это хороший способ сделать ее более надежной.
Денис
2

PHP, 36 байт

Ввод с https://

<?=substr(get_headers($argn)[7],10);

get_headers

25 байт, если Location: в начале не должны быть удалены

<?=get_headers($argn)[7];

если Google меняет заголовок HTTP, здесь более безопасная версия

preg_match("#Location: \K.*#",join("\n",get_headers($argn)),$t);echo$t[0];
Йорг Хюльсерманн
источник
1

Python 2 , 43 байта

Не имеет зависимостей и в настоящее время короче, чем другой ответ Python. пожимают плечами вход должен соответствоватьhttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*
totallyhuman
источник
0

NodeJS, 60 байт

u=>require("http").get(u,r=>console.log(r.headers.location))

Ввод в формате http://goo.gl/<id>.

Джастин Маринер
источник