Unshorten Links do Google

10

Desafio

Dado um goo.gllink encurtado válido , produza o URL original.

Exemplo

goo.gl/qIwi3Ndaria algo parecido https://codegolf.stackexchange.com/. Para entrada, você pode optar por ter o nome https?://no início, pode optar por ter www.antes do goo.gle também pode se livrar do goo.glse desejar apenas o final do URL. Uma barra no final é opcional para entrada e saída. Portanto, sua entrada acabará correspondendo ao regex (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Para a saída, você pode escolher se deseja ou não produzir https?://, se deve ou não produzir www., e se deve ou não gerar uma barra final. No entanto, você deve ser consistente com o seu I / O formatação .

Eu direi que você não precisa ser consistente com httpsvs. httppara saída (mas deve ser consistente para entrada), desde que seja consistente com a inclusão ou não da https?://parte inteira .

Casos de teste

Eles são gravados sem https://, não www., sem barra na entrada; sim https://, não www.e sim barra final na saída.

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

Premissas

  • Você pode assumir que o link reduzido não apontará para outro link reduzido e que o site de destino retornará um código de status 2xxou 4xx(sem redirecionamentos).

Você pode ir aqui e inserir um URL para aplicar a operação inversa: https://goo.gl/

HyperNeutrino
fonte
@HelkaHomba corrigido
Pavel
3
O tempo ou a falta de saída de um líder www.faz a diferença. Na maioria dos casos, é apenas o mesmo servidor a que se refere. Tente por exemplo http://pks.mpg.dee http://www.pks.mpg.de. O primeiro não pode ser resolvido, enquanto o último pode.
Golar Ramblar
@ Stephenos Concluído, obrigado pela sugestão.
HyperNeutrino

Respostas:

11

CJam , 7 bytes

lg'"/5=

Execução de teste

$ 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

Como funciona

lglê uma linha de STDIN e faz uma solicitação GET para esse URL. O URL encurtado emite um redirecionamento 301, que o CJam não segue. Para o primeiro caso de teste, isso empurra

<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 pilha. Finalmente, '"/divide-se em aspas duplas e 5=obtém o sexto pedaço. A saída está implícita.

Dennis
fonte
11
Eu tentei 05AB1E e Pyth, ambos seguem o 301 :(
Erik the Outgolfer
3

Solicitações Python 2 +, 44 bytes

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

requests.get(URL)emite uma solicitação GET para o URL especificado. O urlcampo do objeto de resposta contém a URL final, após qualquer redirecionamento. Um protocolo (por exemplo http://) é necessário para a entrada, e a entrada deve estar entre aspas.

Mego
fonte
11
requestsnão está embutido, portanto, ele precisa ser adicionado ao cabeçalho do idioma.
Numbermaniac
11
Use uma lambdaexpressão para -3 bytes
ovs 13/05/19
11
@numbermaniac Opa, você está certo, eu me acostumo a solicitações que esqueço que é uma publicação de terceiros.
Mego
2

Bash , 28 24 bytes

curl -I $1|grep -oehtt.*

A saída termina com uma nova linha no estilo do Windows, que eu assumo ser aceitável.

Execução de teste

$ 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

Como funciona

curl -Ienvia uma solicitação HEAD, portanto, busca apenas os cabeçalhos HTTP do URL especificado. Para o primeiro caso de teste, ele 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 similar. A saída é enviada para grep -oehtt.*, que exibe apenas partes que correspondem à expressão regular especificada, ou seja, a cadeia htt seguido por qualquer quantidade de caracteres até o fim da linha.

Dennis
fonte
Como é que isso funciona?
Arjun
Eu adicionei uma explicação.
Dennis
Hehe, bem explicado! Dessa forma eu vou aprender festa logo :-D
Isso executa a expansão de curinga, htt.*portanto, assume que não há arquivos correspondentes no diretório atual. Para a maioria das regexes, eu concordo neste site que a possibilidade de correspondência de um arquivo é pequena o suficiente para que esteja tudo bem, mas, neste caso, acho que não. O código fonte do kernel Linux inclui arquivos nomeados htt.ce htt.h, por exemplo. Mudá-lo para grep -oehtt.*não aumenta a contagem de bytes, mas reduz significativamente a probabilidade de causar problemas.
hvd
@hvd Eu costumo assumir que o programa é executado em um diretório vazio, mas -oehtt.*é uma boa maneira de torná-lo mais confiável.
Dennis
2

PHP, 36 bytes

Entrada com https://

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

get_headers

25 bytes se Location: no início não deve ser removido

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

se o Google alterar o cabeçalho HTTP, aqui está uma versão mais segura

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

Python 2 , 43 bytes

Não possui dependências e atualmente é mais curto que a outra resposta do Python. shrug A entrada deve corresponderhttps?://goo\.gl/.*?/?

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

NodeJS, 60 bytes

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

A entrada está no formato http://goo.gl/<id>.

Justin Mariner
fonte