取消缩短Google链接


10

挑战

给定有效的goo.gl缩短链接,输出原始URL。

goo.gl/qIwi3N会给像https://codegolf.stackexchange.com/。对于输入,您可以选择https?://在开头加上,可以www.在之前goo.gl选择,goo.gl如果只希望URL的结尾,也可以选择删除。末尾的斜杠对于输入和输出是可选的。因此,您的输入将最终与regex匹配(https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?。对于输出,您可以选择是否输出https?://,是否输出www.以及是否输出斜杠。但是,您必须与I / O格式保持一致

我会说你不必与 https vs. http的输出(但对于输入,您必须保持一致),只要您对是否包括整个https?://部分都保持一致即可。

测试用例

这些在输入中用no https://,no www.,末尾没有斜杠书写;yes https://,no www.和yes输出中的斜杠。

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

假设条件

  • 您可以假定缩短的链接不会指向另一个缩短的链接,并且目标站点将返回2xx或的状态代码4xx(无重定向)。

您可以在此处输入URL以应用相反的操作:https//goo.gl/


@HelkaHomba已修正
Pavel

3
无论天气好坏,都可能会导致领先www.。在大多数情况下,它只是指的是同一台服务器。尝试例如http://pks.mpg.dehttp://www.pks.mpg.de。前者不能解决,而后者可以解决。
Golar Ramblar

@StephenS完成,谢谢您的建议。
HyperNeutrino '17

Answers:


11

CJam,7个字节

lg'"/5=

测试运行

$ 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

怎么运行的

lg从STDIN读取一行,然后对该URL进行GET请求。缩短的URL发出301重定向,CJam不遵循。对于第一个测试用例,这将推动

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

在堆栈上。最后,'"/将双引号分开,并5=获得第六个块。输出是隐式的。


1
我尝试过05AB1E和Pyth,它们都遵循301 :(
Erik the Outgolfer

3

Python 2 +请求,44字节

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

requests.get(URL)向指定的URL发出GET请求。url重定向后,响应对象的字段包含最终URL。http://输入需要使用协议(例如),并且输入应使用引号引起来。


1
requests不是内置的,因此需要将其添加到语言标头中。
numbermaniac

1
lambda为-3个字节使用表达式
ovs '17

1
@numbermaniac糟糕,您是对的,我已经习惯了要求,以至于我忘记了它是第三方库。
Mego

2

28 24字节

curl -I $1|grep -oehtt.*

输出以Windows风格的换行符结尾,我认为这是可以接受的。

测试运行

$ 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

怎么运行的

curl -I发送HEAD请求,因此它仅获取指定URL的HTTP标头。对于第一个测试用例,它会打印

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

或类似。输出通过管道传输到grep -oehtt.*,仅显示与指定正则表达式匹配的部分,即字符串htt,后跟任意字符,直到行尾。


这是如何运作的?
Arjun

我添加了一个解释。
丹尼斯

呵呵,讲得好!这样,我将很快学习bash

这将对通配符进行扩展,htt.*因此假定当前目录中不存在与之匹配的文件。对于大多数正则表达式,我会在该站点上同意,文件被匹配的可能性很小,这样就可以了,但是在这种情况下,我自己并不这么认为。例如,Linux内核源代码包括名为htt.c和的文件htt.h。将其更改为grep -oehtt.*不会增加字节数,但确实会大大减少引起问题的可能性。
hvd

@hvd我通常认为该程序在一个否则为空的目录中运行,但这-oehtt.*是使其更可靠的好方法。
丹尼斯,

2

PHP,36字节

输入 https://

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

get_headers

25字节(如果Location: 开头不能删除)

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

如果Google更改了HTTP标头,则此处的版本更安全

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

1

Python 2,43个字节

没有依赖关系,目前比其他Python回答要短。耸肩输入必须匹配https?://goo\.gl/.*?/?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.