Tembakan glamor yang luar biasa

11

masukkan deskripsi gambar di sini

Ditemukan gambar ini di web hari ini. Menjadi pemrogram yang malas, saya tidak ingin membuka google dan mengetik beberapa karakter. Terlalu banyak pekerjaan! Ini adalah tugas yang sangat penting sehingga harus otomatis.

Tantangan

Semua orang tahu bahwa gambar pertama dalam hasil pencarian google selalu yang terbaik. Oleh karena itu harus disajikan kepada pengguna.

Anda harus menulis program atau fungsi yang menggunakan string sebagai parameter dan menampilkan gambar pertama yang ditemukannya di google ketika Anda mencari nama itu + kata-kata di glamour shotbelakangnya.

Permintaan pencarian Google

Untuk mencari gambar di google, url harus berisi parameter kueri tbm=ischdan q=query, dengan querymenjadi nama yang ingin Anda cari.
String kueri yang valid untuk nama saya Basadalahwww.google.com/search?tbm=isch&q=Bas

Memasukkan

Program atau fungsi Anda mengambil satu parameter input, yaitu nama yang ingin Anda cari di google. String ini akan terdiri dari karakter [a-z], [A-Z], [0-9]dan (ruang). String ini dapat dipisahkan dengan spasi, untuk mencari string terpisah dari ruang di google, seseorang harus mengganti spasi dengan +. Misalnya, ini adalah kueri yang valid:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Keluaran

Gambar dapat ditarik ke layar, atau disimpan ke file (dalam format apa pun).
Jika hasil pencarian pertama di google adalah file gif, Anda dapat menampilkan gif atau menampilkan bingkai gif tersebut.

Uji kasus

Jalankan cuplikan ini untuk melihat hasil yang diharapkan

Ini adalah , kode terpendek dalam byte yang menang!

Bassdrop Cumberwubwubwub
sumber
Karakter apa yang perlu didukung dalam input? Apakah kita perlu khawatir tentang pengodean URL?
Martin Ender
@ Martin Ender [a-z0-9], mengedit posting saya. Url akan terlihat seperti contoh yang saya berikan, tidak perlu penyandian, hanya ruang untuk+
Bassdrop Cumberwubwubwub
Saya kira, A-Zdapat juga muncul, menilai dengan teladan Anda?
Martin Ender
@ MartinEnder Ya, case-sensitive. Lupa menyebutkan
Bassdrop Cumberwubwubwub
2
Ada sejumlah orang yang berpose dengan senjata ketika Anda memainkan game ini: D
Beta Decay

Jawaban:

8

PowerShell v4 +, 160 byte

param($a)iwr (((iwr "google.com/search?tbm=isch&q=$($a-replace' ','+')+glamour+shot").links|?{$_.innerhtml-like"*$a*"})[0].innerhtml-split'"')[3] -outf "$a.jpg"

Mengambil input $asebagai string. Apakah sebuah Invoke-WebRequest( iwr) ke lokasi Google yang sesuai, menggunakan blok skrip string dalam ke -replacespasi dengan +di string input. Kami mengambil .linksitu, di mana .innerhtmladalah -likeinput string kami. Itu menghasilkan tautan dengan deskripsi thumbnail yang tepat. Ambil yang pertama [0]salah satu dari mereka, mengambil nya .innerhtml dan -splitpada kutipan. [3]Elemen keempat adalah teks di dalam img src="bagian tersebut, jadi kami melakukan yang lain iwr, menentukan -outfile untuk berada $a.jpgdi folder lokal. Karena ini hanya thumbnail yang dibuat oleh Google, mereka dijamin dengan jpg.

AdmBorkBork
sumber
1
Anda dapat mengganti google.comdengan google.nluntuk -1 byte
Taylor Scott
4

Excel VBA + , 465 332 Bytes

CATATAN: Menggunakan Referensi untuk

  • Perpustakaan Objek Microsoft HTML
  • Kontrol Internet Microsoft
  • Microsoft Scripting Runtime

Golf:

SubRutin penuh yang mengambil input n(singkatan nama) dari tipe yang diharapkan Variant/Stringdan menampilkan hasil pencarian gambar google pertama untuk permintaan nama itu dan glamour shotke jendela internet explorer.

Sub g(n)
Set i=New InternetExplorer
l="google.nl/search?tbm=isch&q="&Replace(n," ","+")&"+glamour+shot"
For y=0To 2
i.navigate l
While i.readyState<4
DoEvents
Wend
j=0
Do Until InStr(1,l,IIf(y,"yp","res"))
j=j+1
Set x=i.document.getElementsByTagName(IIf(y,"img","a"))(j)
If y Then l=x.src Else l=x.href
Loop
Next
i.visible=1
End Sub

-2 byte untuk menghapus spasi di If InStr(1, a.href, "imgres") Then

-2 byte untuk diubah .navigate (a.href)menjadi.navigate a.href

-27 byte untuk mengurangi for each a in ... if (...) then ... end if .. nextloop kedo until ... loop

-10 byte untuk kondensasi imgreske resdan encryptedkeyp

-8 byte untuk menghapus initalizers untuk j, kdan dengan asumsi modul bersih

-1 byte untuk diubah google.commenjadigoogle.nl

-3 byte untuk diganti Dim i as New ...denganSet i=New ...

-8 byte untuk menghapus SHDocVw.referensi kelas

-12 byte untuk menghapus with iblok

-7 byte untuk dihapus i.quit- ini menyebabkan beberapa kebocoran memori dengan membiarkan internet explorer terbuka di latar belakang, karena itu disarankan agar versi ungolfed penuh digunakan sebagai gantinya atau bahwa tugas internet explorer diakhiri melalui task manager setelah digunakan

-6 byte untuk pindah i.navigateke subrutin pembantuh

-13 byte untuk pindah Do Until ... Loopke subrutin pembantu

-2 byte dengan pindah j=0ke helper dan menghapus ,j, ,0(x2)

-11 byte untuk mengonversi ke fungsi jendela langsung anonim

-8 byte untuk mengurangi panggilan fungsi pembantu ke for .. nextloop

-16 byte untuk mengubah output dari Sheets(1)objek gambar ke tampilan melalui InternetExplorerobjek

Tidak dikelompokkan, 1304 Bytes

Option Private Module
Option Compare Text
Option Explicit
Option Base 0

Sub GlamourShot(ByVal name As String)

    Dim ie As New SHDocVw.InternetExplorer, _
        doc As MSHTML.HTMLDocument, _
        link As String, _
        j As Integer, _
        k As Integer

    With ie
        On Error GoTo CloseIE #'prevents memory leak

        Let .visible = True
        Call .navigate("www.google.com/search?tbm=isch&q=" & _
                    Replace(name, " ", "+") & _
                    "+glamour+shot")
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Set doc = .document

        Let j = 1
        Do Until InStr(1, link, "imgres") > 0
            Let link = doc.getElementsByTagName("a")(j).href
            Let j = j + 1
        Loop

        Call .navigate(link)
        While .readyState <> READYSTATE_COMPLETE Or .Busy
            VBA.DoEvents
        Wend

        Let k = 1
        Do Until InStr(1, link, "encrypted") > 0
            Let link = doc.getElementsByTagName("img")(k).src
            Let k = k + 1
        Loop

        With ThisWorkbook.ActiveSheet
            Call .Range("A1").Select
            Call .Pictures.Insert(link)
            Call .Activate
        End With
CloseIE:
        Call .Quit
    End With
End Sub

Penggunaan gif

Penggunaan Gif

Taylor Scott
sumber
3

Vimperator , 30 penekanan tombol

pgi<End> glamour shot<CR>fi222jf<CR>fim2

Atau 27 penekanan tombol jika Anda tidak membutuhkan gambar dengan resolusi tertinggi:

pgi<End> glamour shot<CR>fi222j;I<CR>

Video: https://youtu.be/t8824UjlYt8



Untungnya mesin pencari standar di Firefox adalah google, dan Vimperator memungkinkan Anda mengetik petunjuk secara default. Ini lebih lama daripada harus memastikan bahwa itu selalu berfungsi terlepas dari apa yang Anda cari.

Mengambil input melalui clipboard.

Penjelasan:

p             Google the contents of the clipboard
gi            Select the search box
<End>         Move the cursor to the end of the text
 glamour shot Type " glamour shot"
<CR>          Press enter to search
fi2           Click the second link that begins with the letter "i" (images)
22j           Go 22 scroll steps down on the page.
              This makes it so that the first row of images are at
              the very top of the screen.

f<CR>         Click the first clickable element, which is the
              first image because we scrolled down

fim2          Click the second link containing "im" (view image)

Terima kasih kepada @TaylorScott untuk menemukan kasing tepi.

BlackCap
sumber
Apakah ini menangani kasus ketika google merekomendasikan hasil pencarian lain seperti halnya kasus ini
Taylor Scott
@TaylorScott Tidak, tapi saya tidak bisa mendapatkan rekomendasi di Firefox. Mungkinkah itu tergantung pada browser?
BlackCap
1
Nevermind, saya mendapatkan mereka untuk pencarian yang berbeda
BlackCap
3

Python 3.6, 247 242 232 mungkin 224 byte

Ini adalah upaya yang lucu untuk menyelesaikan yang ini. Ini akan menyimpan file seperti p.pngdi direktori saat ini.

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'https://www.google.com.br/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Untuk menjalankannya dengan mudah dari baris perintah, cukup tempatkan konten di atas dalam file, seperti glamour.pydan jalankan:

$ python glamour.py NAME_YOU_WANT

Pembaruan 1: Versi yang lebih baik dengan url google baru

import sys; import requests as r; from bs4 import BeautifulSoup as s;
n = sys.argv[1]; open('p.png', 'wb').write(r.get(s(r.get(f'http://www.google.nl/search?tbm=isch&q={n}+glamour+shot').content,'lxml').find_all('img')[1].get('src')).content)

Pembaruan 2:

Saya menyimpan beberapa byte:

  • Dengan hanya mengimpor fungsi get dari modul permintaan
  • mengambil keuntungan dari fflag interpolasi string python 3.6 baru tanpa mengalokasikan sys.argvke variabel
  • menghilangkan beberapa ruang putih
  • mengubahnya menjadi satu-liner
  • menghapus spesifikasi parser dari BeautifulSouppanggilan

Yang terakhir kontroversial, karena menghasilkan pesan std.output memberitahu programmer untuk menentukan parser untuk kompatibilitas lintas platform, sehingga mungkin dianggap sebagai output yang tidak diinginkan.

Ini adalah versi 224 byte:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content).find_all('img')[1].get('src')).content)

Berikut adalah versi 232 byte:

import sys;from requests import get;from bs4 import BeautifulSoup as s;open('p.png','wb').write(get(s(get(f'http://www.google.nl/search?tbm=isch&q={sys.argv[1]}+glamour+shot').content, 'lxml').find_all('img')[1].get('src')).content)

Tetapi versi yang lebih pendek dapat digunakan jika std.out dialihkan ke /dev/nullatau sesuatu: D

Gui42
sumber
Saya mungkin bisa memiliki versi dengan urllib + html.parse sehingga dapat berjalan sepenuhnya dengan perpustakaan standar.
Gui42
1
Anda mungkin dapat menggunakan www.google.nl/atau bahkan mungkin google.nlbukannya https://www.google.com.br/menyimpan beberapa byte
Taylor Scott
1
untuk beberapa alasan, saya harus menyimpannya http://agar berfungsi dengan permintaan. Tetapi google Brazil memberi saya hasil yang lebih lucu, jadi saya kehilangan poin menyenangkan: D
Gui42
Apakah ini menangani kasus ketika google merekomendasikan hasil pencarian lain seperti halnya kasus-kasus seperti ini (Anda mungkin harus melakukan beberapa pencarian untuk mendapatkan saran seperti ini untuk muncul)
Taylor Scott
Saya juga suka bagaimana saya mendapatkan beberapa byte berkat n = 'something'; f'{n}_here'bukan n = 'something'; '{n}_here'.format(n = n)ataun = 'something'; '{}_here'.format(n)
Gui42
1

Racket, 284 bye

(require net/url html-parsing sxml racket/draw)(define(g n)(let([g(compose get-pure-port string->url string-append)])(make-object bitmap%(g(car((sxpath"//*[@id='ires']//@src/text()")(html->xexp(g"http://www.google.com/search?tbm=isch&q="(string-replace n" ""+")"+glamour+shot"))))))))

Tangkapan layar: masukkan deskripsi gambar di sini

Geoff Reedy
sumber