Tautan Google yang tidak ditampilkan


10

Tantangan

Diberi goo.gltautan singkat yang valid , tampilkan URL asli.

Contoh

goo.gl/qIwi3Nakan memberikan sesuatu seperti https://codegolf.stackexchange.com/. Untuk input, Anda dapat memilih untuk memiliki https?://di awal, Anda dapat memilih untuk memiliki www.sebelum goo.gl, dan Anda juga dapat memilih untuk menyingkirkan goo.gljika Anda hanya menginginkan akhir dari URL. Garis miring pada bagian akhir adalah opsional untuk input dan output. Jadi, input Anda pada akhirnya akan cocok dengan regex (https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?. Untuk output, Anda dapat memilih untuk output https?://atau tidak, apakah atau tidak untuk output www., dan apakah atau tidak untuk menghasilkan garis miring. Namun, Anda harus konsisten dengan pemformatan I / O Anda .

Saya akan mengatakan bahwa Anda tidak harus konsisten dengan httpsvs httpuntuk output (tetapi Anda harus konsisten untuk input), selama Anda konsisten dengan apakah Anda menyertakan seluruh https?://bagian atau tidak .

Uji Kasus

Ini ditulis tanpa https://, tidak www., tanpa garis miring pada input; ya https://, tidak www., dan ya membuntuti slash di 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

Asumsi

  • Anda dapat mengasumsikan bahwa tautan yang diperpendek tidak akan mengarah ke tautan yang dipersingkat lainnya dan bahwa situs tujuan akan mengembalikan kode status 2xxatau 4xx(tidak ada pengalihan).

Anda dapat pergi di sini dan memasukkan URL untuk menerapkan operasi terbalik ini: https://goo.gl/


@HelkaHomba diperbaiki
Pavel

3
Cuaca atau notr untuk menghasilkan yang terkemuka www.membuat perbedaan. Hanya saja dalam banyak kasus server yang sama itu merujuk. Coba misalnya http://pks.mpg.dedan http://www.pks.mpg.de. Yang pertama tidak bisa diselesaikan, sementara yang kedua bisa.
Golar Ramblar

@StephenS Selesai, terima kasih atas sarannya.
HyperNeutrino

Jawaban:


11

CJam , 7 byte

lg'"/5=

Uji coba

$ 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

Bagaimana itu bekerja

lgmembaca baris dari STDIN dan membuat permintaan GET ke URL itu. URL yang dipersingkat mengeluarkan pengalihan 301, yang tidak diikuti CJam. Untuk kasus uji pertama, ini mendorong

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

di tumpukan. Akhirnya, '"/bagi dengan tanda kutip ganda, dan 5=dapatkan potongan keenam. Output tersirat.


1
Saya sudah mencoba 05AB1E dan Pyth, mereka berdua mengikuti 301 :(
Erik the Outgolfer

3

Permintaan Python 2 +, 44 byte

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

requests.get(URL)mengeluarkan permintaan GET ke URL yang ditentukan. Bidang objek respons urlberisi URL akhir, setelah pengalihan. Protokol (misalnya http://) diperlukan untuk input, dan input diharapkan dalam tanda kutip.


1
requeststidak built-in, sehingga perlu ditambahkan ke header bahasa.
numbermaniac

1
Gunakan lambdaekspresi untuk -3 byte
ovs

1
@numbermaniac Ups, kau benar, aku sudah terbiasa dengan permintaan bahwa aku lupa itu adalah lib pihak ketiga.
Mego

2

Bash , 28 24 byte

curl -I $1|grep -oehtt.*

Output berakhir dengan baris gaya Windows, yang saya anggap dapat diterima.

Uji coba

$ 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

Bagaimana itu bekerja

curl -Imengirimkan permintaan HEAD, sehingga hanya mengambil header HTTP dari URL yang ditentukan. Untuk test case pertama, ia mencetak

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

atau serupa. Keluaran disalurkan ke grep -oehtt.*, yang hanya menampilkan bagian-bagian yang cocok dengan regex yang ditentukan, yaitu string htt diikuti oleh jumlah karakter apa pun hingga akhir baris.


Bagaimana cara kerjanya?
Arjun

Saya telah menambahkan penjelasan.
Dennis

Hehe, jelaskan! Dengan cara itu saya akan segera belajar bash :-D

Ini melakukan ekspansi wildcard htt.*jadi anggap tidak ada file yang cocok dengan itu di direktori saat ini. Untuk sebagian besar regex, saya setuju di situs ini bahwa kemungkinan file yang cocok cukup kecil sehingga tidak apa-apa, tetapi dalam hal ini, saya tidak berpikir begitu. Kode sumber kernel Linux termasuk file bernama htt.cdan htt.h, misalnya. Mengubahnya menjadi grep -oehtt.*tidak meningkatkan jumlah byte, tetapi membuatnya lebih kecil kemungkinannya untuk menyebabkan masalah.
hvd

@ Hvd Saya biasanya berasumsi bahwa program dijalankan di direktori yang kosong, tetapi -oehtt.*merupakan cara yang bagus untuk membuatnya lebih dapat diandalkan.
Dennis

2

PHP, 36 Bytes

Masukan dengan https://

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

get_headers

25 Bytes jika Location: pada awalnya tidak boleh dihapus

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

jika Google mengubah HTTP Header di sini adalah versi yang lebih aman

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

1

Python 2 , 43 byte

Tidak memiliki dependensi dan saat ini lebih pendek dari jawaban Python lainnya. Input shrug harus cocokhttps?://goo\.gl/.*?/?

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

0

NodeJS, 60 byte

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

Input dalam format http://goo.gl/<id>.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.