Скасувати скорочення посилань Google


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/


@HelkaHomba виправлено
Павло

3
Погода або північ, щоб вивести провідне, www.має значення. Це просто у більшості випадків той самий сервер, на який він посилається. Спробуйте, наприклад, http://pks.mpg.deі http://www.pks.mpg.de. Перше неможливо вирішити, тоді як останнє може.
Голар Рамблар

@StephenS Готово, дякую за пропозицію.
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://введення необхідний протокол (наприклад ), і очікується, що він буде в лапках.


1
requestsне вбудований, тому його потрібно додати до заголовка мови.
числоманіяк

1
Використовуйте lambdaвираз для -3 байт
ovs

1
@numbermaniac Whoops, ви маєте рацію, я настільки звикаю до запитів, що я забуваю, що це сторонні ліб.
Мего

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.*, на якому відображаються лише частини, що відповідають заданому регулярному вираженню, тобто рядок https з подальшим будь-яким числом символів до кінця рядка.


Як це працює?
Арджун

Я додав пояснення.
Денніс

Хе-хе, добре пояснено! Таким чином я скоро навчусь баш :-D

Це виконує розширення підстановки, 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*

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.