Acortar enlaces de Google

10

Desafío

Dado un goo.glenlace acortado válido , genera la URL original.

Ejemplo

goo.gl/qIwi3Ndaría algo así https://codegolf.stackexchange.com/. Para la entrada, puede elegir tener el https?://al principio, puede elegir tener www.antes del goo.gl, y también puede optar por deshacerse de él goo.glsi solo desea el final de la URL. Una barra oblicua al final es opcional para entrada y salida. Entonces, su entrada terminará haciendo coincidir la expresión regular (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Para la salida, puede elegir si generar o no https?://, si generar o no www., y si generar o no una barra diagonal final. Sin embargo, debe ser compatible con el formato de su E / S .

Diré que no tiene que ser consistente con httpsvs. httppara salida (pero debe ser consistente para entrada), siempre y cuando sea consistente con si incluye o no la https?://parte completa .

Casos de prueba

Estos se escriben con no https://, no www., sin barra diagonal en la entrada; sí https://, no www.y sí, barra diagonal final en la salida.

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

Supuestos

  • Puede suponer que el enlace acortado no apuntará a otro enlace acortado y que el sitio de destino devolverá un código de estado de 2xxo 4xx(sin redireccionamientos).

Puede ir aquí e ingresar una URL para aplicar la operación inversa de esto: https://goo.gl/

Hiperneutrino
fuente
@HelkaHomba solucionado
Pavel
3
El tiempo o el tiempo para generar un líder www.marca la diferencia. En la mayoría de los casos, es el mismo servidor al que se refiere. Prueba por ejemplo http://pks.mpg.dey http://www.pks.mpg.de. El primero no puede resolverse, mientras que el último sí.
Golar Ramblar
@StephenS Hecho, gracias por la sugerencia.
HyperNeutrino

Respuestas:

11

CJam , 7 bytes

lg'"/5=

Prueba de funcionamiento

$ 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

Cómo funciona

lglee una línea de STDIN y realiza una solicitud GET a esa URL. La URL acortada emite una redirección 301, que CJam no sigue. Para el primer caso de prueba, esto empuja

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

en la pila Finalmente, se '"/divide entre comillas dobles y 5=obtiene el sexto fragmento. La salida es implícita.

Dennis
fuente
1
He probado 05AB1E y Pyth, ambos siguen el 301 :(
Erik the Outgolfer
3

Python 2 + solicitudes, 44 bytes

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

requests.get(URL)emite una solicitud GET a la URL especificada. El urlcampo del objeto de respuesta contiene la URL final, después de cualquier redireccionamiento. Se http://requiere un protocolo (por ejemplo ) para la entrada, y se espera que la entrada esté entre comillas.

Mego
fuente
1
requestsno está integrado, por lo que debe agregarse al encabezado del idioma.
numbermaniac
1
Use una lambdaexpresión para -3 bytes
ovs
1
@numbermaniac Vaya, tienes razón, me acostumbro tanto a las solicitudes que olvido que es una biblioteca de terceros.
Mego
2

Bash , 28 24 bytes

curl -I $1|grep -oehtt.*

El resultado finaliza con una nueva línea de estilo Windows, que supongo que es aceptable.

Prueba de funcionamiento

$ 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

Cómo funciona

curl -Ienvía una solicitud HEAD, por lo que solo obtiene los encabezados HTTP de la URL especificada. Para el primer caso de prueba, 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

o similar. La salida se canaliza a grep -oehtt.*, que muestra solo partes que coinciden con la expresión regular especificada, es decir, la cadena htt seguida de cualquier cantidad de caracteres hasta el final de la línea.

Dennis
fuente
¿Como funciona esto?
Arjun
He añadido una explicación.
Dennis
Jeje, bien explicado! De esa manera aprenderé bash pronto :-D
Esto lleva a cabo la expansión de comodín, por htt.*lo que se supone que no existen archivos coincidentes en el directorio actual. Para la mayoría de las expresiones regulares, estoy de acuerdo en este sitio que la posibilidad de que un archivo coincida es lo suficientemente pequeña como para que esté bien, pero en este caso, no lo creo. El código fuente del kernel de Linux incluye archivos nombrados htt.cy htt.h, por ejemplo. Cambiarlo a grep -oehtt.*no aumenta el recuento de bytes, pero hace que sea mucho menos probable que cause problemas.
hvd
@hvd Por lo general, supongo que el programa se ejecuta en un directorio vacío, pero -oehtt.*es una buena manera de hacerlo más confiable.
Dennis
2

PHP, 36 bytes

Entrada con https://

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

get_headers

25 bytes si Location: al principio no se deben eliminar

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

si Google cambia el encabezado HTTP, aquí hay una versión más segura

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

Python 2 , 43 bytes

No tiene dependencias y actualmente es más corto que la otra respuesta de Python. encogerse La entrada debe coincidirhttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*
totalmente humano
fuente
0

NodoJS, 60 bytes

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

La entrada está en el formato http://goo.gl/<id>.

Justin Mariner
fuente