Supprimer les liens Google

10

Défi

Étant donné un goo.gllien raccourci valide , affichez l'URL d'origine.

Exemple

goo.gl/qIwi3Ndonnerait quelque chose comme https://codegolf.stackexchange.com/. Pour la saisie, vous pouvez choisir d'avoir le https?://au début, vous pouvez choisir d'avoir www.avant le goo.gl, et vous pouvez également choisir de vous débarrasser du goo.glsi vous ne voulez que la fin de l'URL. Une barre oblique à la fin est facultative pour l'entrée et la sortie. Ainsi, votre entrée finira par correspondre à l'expression régulière (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Pour la sortie, vous pouvez choisir de sortir ou non, de sortir https?://ou non www., et de sortir ou non une barre oblique de fin. Cependant, vous devez être compatible avec votre E / S formatage .

Je dirai que vous ne devez pas être cohérent avec httpsvs. httppour la sortie (mais vous devez être cohérent pour l'entrée), tant que vous êtes cohérent avec si vous incluez la https?://partie entière ou non .

Cas de test

Celles-ci sont écrites sans https://, ni www., ni barre oblique de fin dans l'entrée; oui https://, non www.et oui barre oblique de fin dans la sortie.

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

Hypothèses

  • Vous pouvez supposer que le lien raccourci ne pointera pas vers un autre lien raccourci et que le site de destination renverra un code d'état de 2xxou 4xx(aucune redirection).

Vous pouvez aller ici et entrer une URL pour appliquer l'opération inverse de ceci: https://goo.gl/

HyperNeutrino
la source
@HelkaHomba fixe
Pavel
3
Météo ou notr pour sortir un leader www.fait une différence. Il s'agit dans la plupart des cas du même serveur auquel il fait référence. Essayez par exemple http://pks.mpg.deet http://www.pks.mpg.de. Le premier ne peut pas être résolu, tandis que le second le peut.
Golar Ramblar
@StephenS Terminé, merci pour la suggestion.
HyperNeutrino

Réponses:

11

CJam , 7 octets

lg'"/5=

Essai

$ 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

Comment ça fonctionne

lglit une ligne de STDIN et fait une requête GET à cette URL. L'URL raccourcie émet une redirection 301, que CJam ne suit pas. Pour le premier cas de test, cela pousse

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

sur la pile. Enfin, '"/se divise en guillemets doubles et 5=obtient le sixième morceau. La sortie est implicite.

Dennis
la source
1
J'ai essayé 05AB1E et Pyth, ils suivent tous les deux le 301 :(
Erik the Outgolfer
3

Python 2 + requêtes, 44 octets

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

requests.get(URL)émet une demande GET vers l'URL spécifiée. Le urlchamp de l'objet de réponse contient l'URL finale, après toute redirection. Un protocole (par exemple http://) est requis pour l'entrée, et l'entrée devrait être entre guillemets.

Mego
la source
1
requestsn'est pas intégré, donc cela doit être ajouté à l'en-tête de la langue.
numbermaniac
1
Utilisez une lambdaexpression pour -3 octets
ovs
1
@numbermaniac Oups, vous avez raison, je m'habitue tellement aux demandes que j'oublie qu'il s'agit d'une bibliothèque tierce.
Mego
2

Bash , 28 24 octets

curl -I $1|grep -oehtt.*

La sortie se termine par une nouvelle ligne de style Windows, qui, je suppose, est acceptable.

Essai

$ 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

Comment ça fonctionne

curl -Ienvoie une requête HEAD, donc il ne récupère que les en-têtes HTTP de l'URL spécifiée. Pour le premier cas de test, il imprime

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

ou similaire. La sortie est dirigée vers grep -oehtt.*, qui n'affiche que les parties qui correspondent à l'expression régulière spécifiée, c'est-à-dire la chaîne htt suivie de n'importe quelle quantité de caractères jusqu'à la fin de la ligne.

Dennis
la source
Comment cela marche-t-il?
Arjun
J'ai ajouté une explication.
Dennis
Hehe, bien expliqué! De cette façon, j'apprendrai bientôt bash :-D
Ceci effectue une expansion générique sur htt.*donc suppose qu'aucun fichier correspondant à celui-ci n'existe dans le répertoire courant. Pour la plupart des expressions rationnelles, je suis d'accord sur ce site que les possibilités de correspondance d'un fichier sont suffisamment petites pour que ce soit correct, mais dans ce cas, je ne le pense pas, moi-même. Le code source du noyau Linux comprend des fichiers nommés htt.cet htt.h, par exemple. Le changer en grep -oehtt.*n'augmente pas le nombre d'octets, mais le rend beaucoup moins susceptible de causer des problèmes.
DVD
@hvd Je suppose généralement que le programme est exécuté dans un répertoire par ailleurs vide, mais -oehtt.*c'est un bon moyen de le rendre plus fiable.
Dennis
2

PHP, 36 octets

Entrée avec https://

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

get_headers

25 octets si Location: au début ne doit pas être supprimé

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

si Google change l'en-tête HTTP, voici une version plus sûre

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

Python 2 , 43 octets

N'a pas de dépendances et est actuellement plus court que l'autre réponse Python. haussement L' entrée doit correspondrehttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*
totalement humain
la source
0

NodeJS, 60 octets

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

L'entrée est au format http://goo.gl/<id>.

Justin Mariner
la source