Google Autocomplete Fun

16

Tugas Anda adalah membuat program yang, diberi string masukan, akan menampilkan hasil Google autocomplete pertama untuk pencarian itu. Format input / output terserah Anda.

Aturan

  1. Program Anda harus mengambil 1 input, string, dan menampilkan hasil saran autocomplete / auto-fill top Google. Format input / output terserah Anda. Pastikan untuk menyebutkan apa format I / O Anda.
  2. Jelas, mengakses Internet diperbolehkan.
  3. Penyingkat URL (seperti bit.ly, TinyURL, dll.) Dilarang keras . Anda harus mengambil hasil autocomplete dari URL ini: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query atau http://google.com/complete/search?client=your_browser&q=your_query . Anda diizinkan mengasumsikan nama browser apa pun (atau string, untuk hal ini) untuk client. Dalam program yang saya tulis , saya menganggap Chrome. Nama atau string browser apa pun harus berfungsi. Anda diizinkan meneruskan opsi apa pun ke halaman web selama Anda menggunakan beberapa varian http://suggestqueries.google.com/complete/search .
  4. Harap berikan penjelasan tentang cara kerja program Anda. Itu tidak wajib, tapi saya sangat menyarankannya.
  5. Semua celah standar dilarang keras .

Uji Kasus

Ini terus berubah, jadi edit posting ini jika ini menjadi ketinggalan zaman.

'how to'
  => 'how to make slime'
'code golf'
  => 'code golf languages'
'you'
  => 'youtube'
'g'
  => 'google' (why would you google 'google'?)

Ini adalah , jadi semoga kode terpendek menang dan programmer terbaik ...

ckjbgames
sumber
3
Saya akan membakukan nama klien, untuk membuatnya adil
Beta Decay
7
Kenapa URLnya ketat? Selama sarankanqueries.google.com digunakan, tanpa penyingkat URL, saya tidak melihat masalah.
Dennis
Secara khusus, jika kita dapat menggunakan output=toolbar, kita tidak harus menentukan klien sama sekali.
Dennis
2
@ mınxomaτ tetapi mengapa tidak https -> http(simpan 1 byte), hapus www.(simpan 4 byte), google.com -> google.us(simpan 1 byte) atau genap google.com -> g.cn(simpan 6 byte; saya tidak yakin mengapa ini masih berfungsi, tetapi tampaknya masih berfungsi pada 20170424)
tsh
3
Tidakkah saran pencarian berbeda untuk pengguna dan wilayah yang berbeda? Saya tidak berpikir memiliki test case standar benar-benar berfungsi untuk ini.
MrZander

Jawaban:

8

Zsh + coreutils + w3m, 88 71 68 byte

echo `w3m "google.com/complete/search?client=gma&q=$*"|cut -d\" -f4`

Beralih dari Bash ke Zsh disimpan 3 byte.

Terima kasih kepada @FatalMerlin untuk URL yang lebih pendek, menghemat 17 byte!

Contoh dijalankan

$ zsh complete.sh how to
how to make slime
$ zsh complete.sh dont you
don't you forget about me
$ zsh complete.sh don\'t you
don't you worry child
Dennis
sumber
3
Dari semua hal, mengapa "membuat lendir" adalah saran pertama? Berapa banyak orang di luar sana yang membuat lendir saat kita berbicara?
MildlyMilquetoast
27
Tidak tahu. Itu adalah cara meningkatkan iq Anda dengan memakan anak-anak berbakat untuk sementara waktu, jadi saya akan menganggap ini sebagai peningkatan.
Dennis
Dang, aku suka w3m. Ini memungkinkan saya menjelajah tanpa gangguan dan itu cukup keren sama sekali.
ckjbgames
1
@MistahFiggins Salahkan Minecraft untuk yang itu.
JakeSteam
@MistahFiggins Mungkin mereka semua hanya ingin make(1) lendir .
Arminius
12

Vim 8 + unimpaired.vim , 93 89 85 70 73 71 byte

  • -4 byte terima kasih kepada tsh
  • -2 byte terima kasih kepada Ian Emnace
  • -2 byte terima kasih kepada FatalMerlin
  • -1 byte terima kasih kepada tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

Sebagai bonus, byte terakhir terlihat seperti mengedip pada Anda ;DKarena ini mengandung karakter yang tidak dicetak, penjelasannya berisi substitusi (dan saya telah mengganti bagian pra-pertanyaan dari url dengan [url], untuk singkatnya):

:s/ /+/g<CR>D:e [url]?client=gma&q=<C-R>"<CR>d3f";D]yy
:s/ /+/g<CR>                                           " Replace spaces with +
            D                                          " Delete and yank result
             :e                                        " Type :e ('edit' command) and a space
                [url]?client=gma&q=                    " Type the url, except the query
                                   <C-R>"              " Paste from the default register
                                         <CR>          " Execute the command, which opens the response
                                                       "   in a new buffer
                                             d3f"      " Delete through the first three quotation marks
                                                       "   This deletes everything before the suggestion
                                                 ;     " Repeat motion; this jumps to the next \"
                                                  D    " Delete everything from there, leaving only the suggestion
                                                   ]yy " unimpaired.vim C string unescape to handle escaped '

Sejauh menjalankan berjalan, itu berfungsi dengan baik jika Anda menyimpannya ke file bernama scriptdan dijalankan dengan vim -s script input.txtdi macOS, setidaknya. Tidak berfungsi jika Anda menambahkan -u NONE, tetapi berfungsi dengan baik jika saya .vimrckosong. Saya menganggap itu menggunakan sesuatu dari sistem .vimrcuntuk membuat URL berfungsi. Ini berarti, bagaimanapun, bahwa itu tidak berfungsi di V, jadi tidak ada tautan TIO.

Beberapa kasus uji lagi:

'what' => 'whataburger'
'what ' => 'what time is it' (Seriously? People Google that?)

Yang benar-benar saya butuhkan adalah cara untuk membuka URL dengan spasi di dalamnya. Menggantinya dengan yang +pertama terlalu banyak byte!

Brian McCutchon
sumber
1
haruskah ruang diganti dengan tanda plus +?
tsh
1
@ tsh, kamu benar! Sekarang seseorang memberi tahu saya bagaimana saya bisa menyelamatkan 2 byte dan mengalahkan Dennis :)
Brian McCutchon
agar netrw berfungsi, Anda perlufiletype plugin on
tbodt
1
Anda dapat menempelkan "register (default) dalam mode insert / command dengan melakukan <Cr>". Anda dapat mencukur habis beberapa byte dengan melakukan :r [url]?client=opera&q=^R"bukan q:ir [url]?client=opera&q=<esc>p. ^Radalah byte sebenarnya yang dikirim ketika Anda menekan <Cr>, bukan kunci ^dan Rbersama - sama, jadi itu hanya dihitung sebagai satu byte.
Ian Emnace
1
Ketika saya menghitung byte, saya mendapatkan 88. Anda juga dapat menyimpan byte dengan mengubah URL menjadi http://google.com/complete/search?client=hp&q=your_query( client=gma=> JSON polos dan teks yang lebih pendek.).
FatalMerlin
7

Python + meminta 121 117 103 byte

from requests import*
lambda s:get("http://google.com/complete/search?client=gma&q="+s).json()[1][0][0]
ovs
sumber
5

JavaScript, 109 Bytes

q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

Promise, Anda harus menyukainya, tetapi manusia itu verbose! Ini menggunakan jawaban fetch(), janji berbasis mengambil API hadir dalam browser modern. Janji bekerja dengan mendirikan penangan untuk tindakan async di awal, seperti callback, tapi lebih baik. The .then()mengambil fungsi yang akan disebut dengan hasil dari tindakan async. .then(r=>r.json())menggunakan .json()metode respons untuk mengubah array teks menjadi variabel yang dapat dimanipulasi, yang kedua .then()hanya menarik respons pertama.

Pemakaian:

S = q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

S("node.js").then(console.log); // Prints the result to the debug console
MayorMonty
sumber
2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Nikmati 11 karakter lebih sedikit ;-)
Stephan Bijzitter
Saya sudah mencoba di Firefox 52 dan Chrome 57, di halaman ini, homepage Google, dan tentang: kosong, dan saya hanya terus mendapatkan CORS kesalahan. Sudahkah Anda berhasil bekerja?
Produk ETH
@ETHproductions Ya, ada masalah CORS, Anda harus mengeksekusi di domain suggestqueries.google.com
MayorMonty
@StephanBijzitter .json()mengembalikan Janji, async itu, untuk beberapa alasan
MayorMonty
Memang itu bekerja di sana, terima kasih!
Produk ETH
1

C #, 192 112 111 Bytes

Disimpan 80 Bytes berkat @TheLethalCoder. Terima kasih telah memformat ulang kode saya, saya tidak tahu itu diizinkan untuk meninggalkan Kelas dan Metode Tubuh sekitarnya :)

Disimpan Byte lain dengan mengganti gmadengan hp, seperti tidak peduli untuk parsing dan hanya ada beberapa omong kosong sebelum respon tubuh.

Saya secara brutal memaksa API untuk menemukan gmadan hp.

s=>new System.Net.WebClient().DownloadString("http://google.com/complete/search?client=hp&q="+s).Split('"')[3];
FatalMerlin
sumber
1

Groovy, 122 byte

{Eval.me(new URL("http://suggestqueries.google.com/complete/search?client=chrome&q="+it).text.split(",\\{")[0]+"]")[1][0]}

Pada dasarnya:

  1. Dapatkan teks dari titik akhir.

  2. Hapus bagian dengan tanda kurung di bagian akhir, ini bukan sintaks yang valid.

  3. Parsing bit yang tersisa sebagai array asyik.

  4. Ambil elemen kedua dari array hasil.

masukkan deskripsi gambar di sini

Guci Gurita Ajaib
sumber
1

PowerShell, 133 115 byte

([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]

Contoh dijalankan

baris perintah jendela CMD:

powershell.exe -c "'code golf l'|%{([net.webclient]::new().downloadstring(""""http://google.com/complete/search?client=gma&q=$_"""")|convertfrom-json)[1][0]}"

PowerShell konsol:

'code golf l'|%{([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]}
Andrei Odegov
sumber
1

R, 111 byte

Sudah lama sejak saya terakhir datang ke sini tetapi mencobanya:

jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]

Menggunakan paket jsonliteuntuk mengubah string yang diambil dari readLines()menjadi objek daftar.

Selanjutnya ekstrak elemen kedua, misalnya (memberikan peringatan bahwa kita tidak perlu peduli):

> jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]
1: "how to"
2: 
    Read 1 item
[[1]]
[1] "how to make slime"

Warning message:
    In readLines(url(paste0("http://google.com/complete/search?client=gma&q=",  :
                                incomplete final line found on 'http://google.com/complete/search?client=gma&q=how to'
Billywob
sumber
0

C #, 127 bytes

s=>new System.Net.WebClient().DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s).Split('"')[3];

Versi lengkap dan terformat:

static void Main()
{
    System.Func<string, string> f = s =>
        new System.Net.WebClient()
                      .DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s)
                      .Split('"')[3];

    System.Console.WriteLine(f("you"));
    System.Console.ReadLine();
}
TheLethalCoder
sumber
Terima kasih atas petunjuk tentang meninggalkan Metode dan Kelas Tubuh!
FatalMerlin