Google Links kürzen

10

Herausforderung

Geben Sie bei einem gültigen goo.glverkürzten Link die ursprüngliche URL aus.

Beispiel

goo.gl/qIwi3Nwürde so etwas geben /codegolf//. Für die Eingabe können Sie wählen , die haben https?://am Anfang, können Sie haben , www.bevor das goo.gl, und Sie können auch wählen , um von der loszuwerden , goo.glwenn Sie das Ende der URL mögen. Ein Schrägstrich am Ende ist für die Ein- und Ausgabe optional. Ihre Eingabe stimmt also mit dem regulären Ausdruck überein (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Für die Ausgabe können Sie auswählen, ob ausgegeben werden soll https?://, ob ausgegeben werden soll oder nicht www.und ob ein abschließender Schrägstrich ausgegeben werden soll oder nicht. Allerdings müssen Sie mit Ihrem E / A - Formatierung konsistent sein .

Ich werde sagen, dass Sie nicht konsistent mit httpsvs. httpfür die Ausgabe sein müssen (aber Sie müssen konsistent für die Eingabe sein), solange Sie konsistent sind, ob Sie den gesamten https?://Teil einschließen oder nicht .

Testfälle

Diese werden mit keinem https://, keinem www., keinem abschließenden Schrägstrich in der Eingabe geschrieben. Ja https://, Nein www.und Ja, abschließender Schrägstrich in der Ausgabe.

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

Annahmen

  • Sie können davon ausgehen, dass der verkürzte Link nicht auf einen anderen verkürzten Link verweist und dass die Zielwebsite einen Statuscode von 2xxoder 4xx(keine Weiterleitungen) zurückgibt.

Sie können hier eine URL eingeben, um die umgekehrte Operation anzuwenden: https://goo.gl/

HyperNeutrino
quelle
@ HelkaHomba behoben
Pavel
3
Wetter oder Notr, um eine Führung auszugeben, www.macht einen Unterschied. Es ist nur in den meisten Fällen derselbe Server, auf den es sich bezieht. Versuchen Sie zum Beispiel http://pks.mpg.deund http://www.pks.mpg.de. Das erste kann nicht gelöst werden, während das letztere kann.
Golar Ramblar
@StephenS Fertig, danke für den Vorschlag.
HyperNeutrino

Antworten:

11

CJam , 7 Bytes

lg'"/5=

Testlauf

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

Wie es funktioniert

lgliest eine Zeile von STDIN und sendet eine GET-Anfrage an diese URL. Die verkürzte URL gibt eine 301-Weiterleitung aus, der CJam nicht folgt. Für den ersten Testfall drückt dies

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

auf dem Stapel. Schließlich wird '"/in doppelte Anführungszeichen aufgeteilt und 5=erhält den sechsten Block. Die Ausgabe ist implizit.

Dennis
quelle
1
Ich habe 05AB1E und Pyth ausprobiert, beide folgen der 301 :(
Erik the Outgolfer
3

Python 2 + Anfragen, 44 Bytes

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

requests.get(URL)gibt eine GET-Anforderung an die angegebene URL aus. Das urlFeld des Antwortobjekts enthält nach Weiterleitungen die endgültige URL. Für http://die Eingabe ist ein Protokoll (z. B. ) erforderlich, und es wird erwartet, dass die Eingabe in Anführungszeichen steht.

Mego
quelle
1
requestsist nicht integriert, daher muss dies dem Sprachheader hinzugefügt werden.
Numbermaniac
1
Verwenden Sie einen lambdaAusdruck für -3 Bytes
ovs
1
@numbermaniac Hoppla, Sie haben Recht, ich gewöhne mich so an Anfragen, dass ich vergesse, dass es sich um eine Drittanbieter-Bibliothek handelt.
Mego
2

Bash , 28 24 Bytes

curl -I $1|grep -oehtt.*

Die Ausgabe endet mit einer Newline im Windows-Stil, die meiner Meinung nach akzeptabel ist.

Testlauf

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

Wie es funktioniert

curl -Isendet eine HEAD-Anfrage, sodass nur die HTTP-Header der angegebenen URL abgerufen werden. Für den ersten Testfall wird gedruckt

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: /codegolf//
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

oder ähnliches. Die Ausgabe wird an weitergeleitet grep -oehtt.*, wobei nur Teile angezeigt werden, die dem angegebenen regulären Ausdruck entsprechen , dh die Zeichenfolge htt, gefolgt von einer beliebigen Anzahl von Zeichen bis zum Ende der Zeile.

Dennis
quelle
Wie funktioniert das?
Arjun
Ich habe eine Erklärung hinzugefügt.
Dennis
Hehe, gut erklärt! Auf diese Weise werde ich bald Bash lernen :-D
Dies führt eine Platzhaltererweiterung durch, htt.*sodass davon ausgegangen wird, dass im aktuellen Verzeichnis keine übereinstimmenden Dateien vorhanden sind. Für die meisten regulären Ausdrücke würde ich auf dieser Website zustimmen, dass die Möglichkeit, dass eine Datei übereinstimmt, klein genug ist, dass es in Ordnung ist, aber in diesem Fall denke ich selbst nicht. Der Linux-Kernel-Quellcode enthält beispielsweise Dateien mit dem Namen htt.cund htt.h. Durch Ändern in grep -oehtt.*wird die Anzahl der Bytes nicht erhöht, die Wahrscheinlichkeit von Problemen wird jedoch erheblich verringert.
HDD
@hvd Ich gehe normalerweise davon aus, dass das Programm in einem ansonsten leeren Verzeichnis ausgeführt wird, aber es -oehtt.*ist eine gute Möglichkeit, es zuverlässiger zu machen.
Dennis
2

PHP, 36 Bytes

Eingabe mit https://

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

get_headers

25 Bytes, wenn Location: am Anfang nicht entfernt werden darf

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

Wenn Google den HTTP-Header ändert, ist dies eine sicherere Version

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

Python 2 , 43 Bytes

Hat keine Abhängigkeiten und ist derzeit kürzer als die andere Python-Antwort. Achselzucken Eingabe muss übereinstimmenhttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*
total menschlich
quelle
0

NodeJS, 60 Bytes

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

Die Eingabe erfolgt im Format http://goo.gl/<id>.

Justin Mariner
quelle