Unshorten Google Links

10

Wyzwanie

Podając prawidłowy goo.glskrócony link, wyślij oryginalny adres URL.

Przykład

goo.gl/qIwi3Ndałby coś takiego https://codegolf.stackexchange.com/. W przypadku danych wejściowych możesz wybrać opcję https?://na początku, możesz wybrać opcję www.przed goo.gl, a także możesz pozbyć się tego, goo.gljeśli chcesz tylko końca adresu URL. Ukośnik na końcu jest opcjonalny dla wejścia i wyjścia. Tak więc twoje dane wejściowe będą pasować do wyrażenia regularnego (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. W przypadku danych wyjściowych możesz wybrać, czy chcesz wypisać https?://, czy nie www., i czy wypisać ukośnik końcowy. Jednak trzeba być zgodne z formatowania I / O .

Powiem, że nie musisz być spójny z httpsvs. httpdla danych wyjściowych (ale musisz być konsekwentny dla danych wejściowych), o ile jesteś zgodny z tym, czy uwzględnisz całą https?://część.

Przypadki testowe

Są one zapisywane bez wejściowego ukośnika; https://nie www., nie; tak https://, nie www.i tak końcowy ukośnik na wyjściu.

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

Założenia

  • Możesz założyć, że skrócony link nie będzie wskazywał na inny skrócony link i że witryna docelowa zwróci kod statusu 2xxlub 4xx(brak przekierowań).

Możesz przejść tutaj i wprowadzić adres URL, aby zastosować odwrotną operację: https://goo.gl/

HyperNeutrino
źródło
@HelkaHomba naprawiono
Pavel
3
Pogoda lub notr na wyjście z wyprzedzeniem www.robi różnicę. W większości przypadków jest to ten sam serwer, do którego się odnosi. Spróbuj na przykład http://pks.mpg.dei http://www.pks.mpg.de. Pierwszego nie można rozwiązać, podczas gdy drugiego można.
Golar Ramblar
@StephenS Gotowe, dziękuję za sugestię.
HyperNeutrino

Odpowiedzi:

11

CJam , 7 bajtów

lg'"/5=

Testowe uruchomienie

$ 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

Jak to działa

lgodczytuje wiersz ze STDIN i wysyła żądanie GET do tego adresu URL. Skrócony adres URL powoduje przekierowanie 301, którego CJam nie przestrzega. W przypadku pierwszego przypadku testowego popycha to

<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>

na stosie. Wreszcie '"/dzieli się na podwójne cudzysłowy i 5=otrzymuje szósty fragment. Wynik jest niejawny.

Dennis
źródło
1
Próbowałem 05AB1E i Pyth, oba podążają za 301 :(
Erik the Outgolfer
3

Żądania w języku Python 2 +, 44 bajty

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

requests.get(URL)wysyła żądanie GET na podany adres URL. Pole obiektu odpowiedzi urlzawiera końcowy adres URL, po przekierowaniach. Protokół (np. http://) Jest wymagany dla danych wejściowych i oczekuje się, że dane wejściowe będą w cudzysłowach.

Mego
źródło
1
requestsnie jest wbudowany, więc należy go dodać do nagłówka języka.
numbermaniac
1
Użyj lambdawyrażenia dla -3 bajtów
ovs
1
@numbermaniac Ups, masz rację, tak przyzwyczajam się do próśb, że zapominam, że to lib strony trzeciej.
Mego
2

Bash , 28 24 bajtów

curl -I $1|grep -oehtt.*

Wyjście kończy się znakiem nowej linii w stylu Windows, który, jak zakładam, jest do przyjęcia.

Testowe uruchomienie

$ 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

Jak to działa

curl -Iwysyła żądanie HEAD, więc pobiera tylko nagłówki HTTP określonego adresu URL. W przypadku pierwszego przypadku testowego zostanie wydrukowane

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

lub podobne. Dane wyjściowe są przesyłane potokowo do grep -oehtt.*, w którym są wyświetlane tylko części pasujące do określonego wyrażenia regularnego, tj. Ciąg htt, po którym następuje dowolna liczba znaków do końca wiersza.

Dennis
źródło
Jak to działa?
Arjun
Dodałem wyjaśnienie.
Dennis
Hehe, dobrze wyjaśnione! W ten sposób wkrótce nauczę się bash :-D
Powoduje to rozwinięcie symboli wieloznacznych na, htt.*więc zakłada, że ​​w bieżącym katalogu nie ma żadnych pasujących plików. W przypadku większości wyrażeń regularnych zgodziłbym się na tej stronie, że możliwość dopasowania pliku jest na tyle mała, że ​​jest w porządku, ale w tym przypadku sam tak nie uważam. Kod źródłowy jądra systemu Linux zawiera na przykład pliki o nazwach htt.ci htt.h. Zmiana go na grep -oehtt.*nie zwiększa liczby bajtów, ale znacznie zmniejsza prawdopodobieństwo wystąpienia problemów.
hvd
@hvd Zazwyczaj zakładam, że program działa w innym pustym katalogu, ale -oehtt.*jest to dobry sposób na zwiększenie jego niezawodności.
Dennis
2

PHP, 36 bajtów

Wprowadź za pomocą https://

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

get_headers

25 bajtów, jeśli Location: na początku nie można ich usunąć

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

jeśli Google zmieni nagłówek HTTP, tutaj jest bezpieczniejsza wersja

preg_match("#Location: \K.*#",join("\n",get_headers($argn)),$t);echo$t[0];
Jörg Hülsermann
źródło
1

Python 2 , 43 bajty

Nie ma zależności i jest obecnie krótszy niż inna odpowiedź w języku Python. wzruszenie ramion Dane wejściowe muszą być zgodnehttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*
całkowicie ludzki
źródło
0

NodeJS, 60 bajtów

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

Dane wejściowe są w formacie http://goo.gl/<id>.

Justin Mariner
źródło