Annulla collegamenti a Google Links


10

Sfida

Dato un goo.glcollegamento abbreviato valido , genera l'URL originale.

Esempio

goo.gl/qIwi3Ndarebbe qualcosa del genere https://codegolf.stackexchange.com/. Per l'input, puoi scegliere di avere https?://all'inizio, puoi scegliere di avere www.prima di goo.gle puoi anche scegliere di sbarazzarti di goo.glse vuoi solo la fine dell'URL. Una barra alla fine è opzionale per input e output. Quindi, il tuo input finirà per abbinare la regex (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Per l'output, è possibile scegliere se produrre https?://o meno, se produrre www.o meno una barra finale. Tuttavia, è necessario essere coerenti con la formattazione di I / O .

Dirò che non devi essere coerente con httpsvs. httpper l'output (ma devi essere coerente per l'input), purché tu sia coerente con se includere o meno l'intera https?://parte.

Casi test

Questi sono scritti con nessuna https://, nessuna www., nessuna barra finale nell'input; Sì https://, no www.e sì barra finale nell'output.

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

ipotesi

  • Si può presumere che il collegamento abbreviato non punti a un altro collegamento abbreviato e che il sito di destinazione restituirà un codice di stato di ( 2xxo 4xxnessun reindirizzamento).

Puoi andare qui e inserire un URL per applicare l'operazione inversa di questo: https://goo.gl/


@HelkaHomba risolto
Pavel

3
Il tempo o il notr per generare un anticipo www.fanno la differenza. È solo nella maggior parte dei casi lo stesso server a cui fa riferimento. Prova ad esempio http://pks.mpg.dee http://www.pks.mpg.de. Il primo non può essere risolto, mentre il secondo può essere risolto.
Golar Ramblar,

@StephenS Fatto, grazie per il suggerimento.
HyperNeutrino,

Risposte:


11

CJam , 7 byte

lg'"/5=

Prova

$ 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

Come funziona

lglegge una riga da STDIN ed effettua una richiesta GET a tale URL. L'URL abbreviato emette un reindirizzamento 301, che CJam non segue. Per il primo caso di test, questo spinge

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

sullo stack. Infine, si '"/divide in virgolette doppie e 5=ottiene il sesto pezzo. L'output è implicito.


1
Ho provato 05AB1E e Pyth, entrambi seguono il 301 :(
Erik the Outgolfer

3

Python 2 + richieste, 44 byte

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

requests.get(URL)invia una richiesta GET all'URL specificato. Il urlcampo dell'oggetto risposta contiene l'URL finale, dopo eventuali reindirizzamenti. È richiesto un protocollo (ad es. http://) Per l'input e si prevede che l'input sia tra virgolette.


1
requestsnon è integrato, quindi è necessario aggiungerlo all'intestazione della lingua.
numbermaniac,

1
Usa lambdaun'espressione per -3 byte
ovs

1
@numbermaniac Whoops, hai ragione, mi abituo così tanto alle richieste che dimentico che è una lib di terze parti.
Mego,

2

Bash , 28 24 byte

curl -I $1|grep -oehtt.*

L'output termina con una newline in stile Windows, che presumo sia accettabile.

Prova

$ 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

Come funziona

curl -Iinvia una richiesta HEAD, quindi recupera solo le intestazioni HTTP dell'URL specificato. Per il primo caso di prova, stampa

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 simili. L'output viene reindirizzato a grep -oehtt.*, che visualizza solo le parti corrispondenti alla regex specificata, ovvero la stringa htt seguita da qualsiasi quantità di caratteri fino alla fine della riga.


Come funziona?
Arjun,

Ho aggiunto una spiegazione.
Dennis,

Hehe, ben spiegato! In questo modo imparerò presto bash :-D

Ciò esegue l'espansione jolly su htt.*quindi presuppone che non esistano file corrispondenti nella directory corrente. Per la maggior parte delle regex, su questo sito sarei d'accordo sul fatto che le possibilità di abbinare un file sono abbastanza piccole da essere a posto, ma in questo caso, non penso proprio, me stesso. Il codice sorgente del kernel Linux include file denominati htt.ce htt.h, ad esempio. La modifica in grep -oehtt.*non aumenta il conteggio dei byte, ma rende significativamente meno probabile che causi problemi.
hvd,

@hvd Di solito presumo che il programma sia eseguito in una directory altrimenti vuota, ma -oehtt.*è un buon modo per renderlo più affidabile.
Dennis,

2

PHP, 36 byte

Ingresso con https://

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

get_headers

25 byte se Location: all'inizio non devono essere rimossi

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

se Google modifica l'intestazione HTTP qui è una versione più sicura

preg_match("#Location: \K.*#",join("\n",get_headers($argn)),$t);echo$t[0];

1

Python 2 , 43 byte

Non ha dipendenze ed è attualmente più breve dell'altra risposta di Python. l' input deve corrisponderehttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*

0

NodoJS, 60 byte

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

L'input è nel formato http://goo.gl/<id>.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.