เลิกเชื่อมโยง Google Links


10

ท้าทาย

ให้goo.glลิงค์สั้นที่ถูกต้องให้ออก URL ดั้งเดิม

ตัวอย่าง

goo.gl/qIwi3Nhttps://codegolf.stackexchange.com/จะให้สิ่งที่ต้องการ สำหรับอินพุตคุณสามารถเลือกที่จะมีhttps?://จุดเริ่มต้นคุณสามารถเลือกที่จะมีwww.ก่อนgoo.glและคุณยังสามารถเลือกที่จะกำจัดgoo.glถ้าคุณต้องการจุดสิ้นสุดของ URL เครื่องหมายทับที่ท้ายเป็นทางเลือกสำหรับอินพุตและเอาต์พุต ดังนั้นการป้อนข้อมูลของคุณจะสิ้นสุดที่ตรงกับ (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?regex สำหรับเอาต์พุตคุณสามารถเลือกว่าจะเอาต์พุตhttps?://หรือไม่เอาต์พุตwww.หรือไม่และเพื่อเอาต์พุตสแลชต่อท้าย อย่างไรก็ตามคุณต้องสอดคล้องกับการจัดรูปแบบ I / O ของคุณ

ฉันจะบอกว่าคุณไม่จำเป็นต้องสอดคล้องกับhttpsvs. httpสำหรับเอาต์พุต (แต่คุณต้องสอดคล้องกับอินพุต) ตราบใดที่คุณสอดคล้องกับว่าคุณรวมhttps?://ส่วนทั้งหมดหรือไม่

กรณีทดสอบ

สิ่งเหล่านี้เขียนขึ้นโดยไม่มีhttps://, ไม่มีwww., ไม่มีสแลชต่อท้ายในอินพุต; ใช่https://ไม่www.และใช่ต่อท้ายสแลชในเอาต์พุต

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

มันทำงานอย่างไร

lgอ่านบรรทัดจาก STDIN และทำการร้องขอ GET ไปยัง URL นั้น 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)ออกคำขอ GET ไปยัง URL ที่ระบุ urlฟิลด์ของวัตถุตอบกลับมี URL สุดท้ายหลังจากเปลี่ยนเส้นทางใด ๆ http://จำเป็นต้องใช้โปรโตคอล (เช่น) สำหรับอินพุตและคาดว่าอินพุตจะอยู่ในเครื่องหมายคำพูด


1
requestsไม่ได้มีมาให้ในตัวดังนั้นต้องเพิ่มในส่วนหัวของภาษา
numbermaniac

1
ใช้lambdaนิพจน์สำหรับ -3 ไบต์
ovs

1
@numbermaniac อ๊ะคุณพูดถูกฉันคุ้นเคยกับคำขอที่ฉันลืมว่ามันเป็น lib ของบุคคลที่สาม
Mego

2

Bash , 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 ดังนั้นจึงดึงเฉพาะส่วนหัว HTTP ของ URL ที่ระบุ สำหรับกรณีทดสอบแรกจะพิมพ์ออกมา

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.*ที่ซึ่งแสดงเฉพาะส่วนที่ตรงกับ regex ที่ระบุนั่นคือสตริงhttตามด้วยจำนวนอักขระใด ๆ จนถึงจุดสิ้นสุดของบรรทัด


มันทำงานอย่างไร
Arjun

ฉันได้เพิ่มคำอธิบายแล้ว
Dennis

ฮิฮิอธิบายได้ดี! ด้วยวิธีนี้ฉันจะเรียนรู้ทุบตีเร็ว ๆ นี้ :-D

วิธีนี้จะทำการขยายสัญลักษณ์แทนhtt.*ดังนั้นจึงไม่มีไฟล์ที่ตรงกับในไดเรกทอรีปัจจุบัน สำหรับ regexes ส่วนใหญ่ฉันเห็นด้วยกับเว็บไซต์นี้ว่าความเป็นไปได้ของไฟล์ที่ถูกจับคู่มีขนาดเล็กพอที่จะใช้ได้ แต่ในกรณีนี้ฉันไม่คิดอย่างนั้น ซอร์สโค้ดเคอร์เนล Linux ประกอบด้วยไฟล์ชื่อhtt.cและhtt.hตัวอย่างเช่น การเปลี่ยนเป็นgrep -oehtt.*ไม่เพิ่มจำนวนไบต์ แต่จะทำให้มีโอกาสเกิดปัญหาน้อยลง
hvd

@hvd ฉันมักจะคิดว่าโปรแกรมทำงานในไดเรกทอรีว่างเปล่าเป็นอย่างอื่น แต่-oehtt.*เป็นวิธีที่ดีที่จะทำให้มันน่าเชื่อถือมากขึ้น
Dennis

2

PHP, 36 ไบต์

ป้อนข้อมูลด้วย https://

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

get_headers

25 ไบต์หากLocation: ที่จุดเริ่มต้นจะต้องไม่ถูกลบ

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

ถ้า Google เปลี่ยน HTTP Header ที่นี่เป็นรุ่นที่ปลอดภัยยิ่งขึ้น

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*

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.