Google 링크 단축


10

도전

유효한 goo.gl단축 링크가 있으면 원래 URL을 출력하십시오.

goo.gl/qIwi3N같은 것을 줄 것 https://codegolf.stackexchange.com/입니다. 입력의 경우, 당신이되도록 선택할 수 있습니다 https?://처음에, 당신은 선택할 수 있습니다 www.전과 goo.gl, 당신은 또한 제거하도록 선택할 수 있습니다 goo.gl당신은 단지 URL의 끝을합니다. 끝에있는 슬래시는 입력 및 출력에 선택 사항입니다. 따라서 입력 내용이 정규식과 일치하게 (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?됩니다. 출력의 경우 출력 여부 https?://, 출력 여부 www.및 후행 슬래시 출력 여부 를 선택할 수 있습니다 . 그러나 I / O 형식과 일치해야합니다 .

전체 부품 을 포함하는지 여부와 일치하는 한 출력 httpshttp출력 과 일치 할 필요는 없지만 입력에 일관성이 있어야 한다고 말할 것입니다 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 수정
파벨

3
날씨를 리드하거나 출력을하지 않으면 www.차이가납니다. 대부분의 경우 참조하는 서버와 동일합니다. 예를 들어 시도 http://pks.mpg.de하고 http://www.pks.mpg.de. 첫 번째는 해결할 수 없지만 후자는 해결할 수 없습니다.
Golar Ramblar

@StephenS 완료, 제안 주셔서 감사합니다.
HyperNeutrino

답변:


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

작동 원리

lgSTDIN에서 행을 읽고 해당 URL에 GET 요청을합니다. 단축 된 URL은 CJam이 따르지 않는 301 리디렉션을 발행합니다. 첫 번째 테스트 사례의 경우

<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) :( 따라
에릭 Outgolfer

3

파이썬 2 + 요청, 44 바이트

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

requests.get(URL)지정된 URL에 GET 요청을 발행합니다. 응답 객체의 url필드에는 리디렉션 후 최종 URL이 포함됩니다. 입력에는 프로토콜 (예 :) http://이 필요하며 입력은 따옴표로 묶어야합니다.


1
requests내장되어 있지 않으므로 언어 ​​헤더에 추가해야합니다.
numbermaniac

1
lambda-3 바이트에 대한 표현식 사용
ovs

1
@numbermaniac Whoops, 맞아, 나는 그것이 타사 라이브러리라는 것을 잊어 버린 요청에 너무 익숙해 져있다.
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 -IHEAD 요청을 전송하므로 지정된 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

설명을 추가했습니다.
Dennis

그는 잘 설명했다! 그런 식으로 나는 배쉬를 곧 배울 것입니다

이렇게하면 와일드 카드 확장이 수행 htt.*되므로 현재 디렉토리에 일치하는 파일이 없다고 가정합니다. 대부분의 정규 표현식의 경우이 사이트에서 파일 일치 가능성이 작기 때문에이 사이트에 동의하지만이 경우 나 자신은 그렇게 생각하지 않습니다. Linux 커널 소스 코드에는 예를 들어 htt.chtt.h등의 파일이 포함됩니다 . 이 값을 변경해도 grep -oehtt.*바이트 수는 증가하지 않지만 문제를 일으킬 가능성이 크게 줄어 듭니다.
hvd

@hvd 나는 보통 프로그램이 다른 빈 디렉토리에서 실행된다고 가정하지만, -oehtt.*보다 안정적으로 만드는 좋은 방법이다.
Dennis

2

PHP, 36 바이트

로 입력 https://

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

get_headers

Location: 처음에 제거하지 않아야하는 경우 25 바이트

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

Google이 HTTP 헤더를 변경하면 더 안전한 버전입니다.

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

1

파이썬 2 , 43 바이트

의존성이 없으며 현재 다른 Python 답변보다 짧습니다. 어깨를 으 Input하다https?://goo\.gl/.*?/?

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

0

NodeJS, 60 바이트

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

입력 형식은입니다 http://goo.gl/<id>.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.