Scatto glamour favoloso


11

inserisci qui la descrizione dell'immagine

Ho trovato questa immagine sul web oggi. Essendo un programmatore pigro, non voglio aprire Google e digitare un paio di caratteri. Troppo lavoro! Questo è un compito così importante che dovrebbe essere automatizzato.

Sfida

Tutti sanno che la prima immagine in un risultato di ricerca di Google è sempre la migliore. Quindi dovrebbe essere presentato all'utente.

Devi scrivere un programma o una funzione che accetta una stringa come parametro e visualizza la prima immagine che trova su Google quando cerchi quel nome + le parole glamour shotdietro di esso.

Query di ricerca di Google

Per cercare immagini su google, l'URL deve contenere il parametro query tbm=ische q=query, con queryil nome che si desidera cercare.
Una stringa di query valida per il mio nome Bassarebbewww.google.com/search?tbm=isch&q=Bas

Ingresso

Il tuo programma o funzione accetta un singolo parametro di input, che è il nome che desideri cercare su Google. Questa stringa sarà composto da personaggi [a-z], [A-Z], [0-9]e (spazio). Questa stringa può essere separata dallo spazio, per cercare una stringa separata dallo spazio su Google, è necessario sostituire gli spazi con +. Ad esempio, questa è una query valida:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Produzione

L'immagine può essere disegnata sullo schermo o salvata in un file (in qualsiasi formato).
Se il primo risultato di ricerca su google è un file gif, puoi mostrare la gif o mostrare qualsiasi frame di quella gif.

Casi test

Esegui questo frammento per vedere i risultati previsti

Questo è , vince il codice più corto in byte!


Quali caratteri devono essere supportati nell'input? Dobbiamo preoccuparci della codifica URL?
Martin Ender,

@Martin Ender [a-z0-9], modificato il mio post. Gli URL appariranno come gli esempi che ho fornito, nessuna codifica necessaria, solo spazio per+
Bassdrop Cumberwubwubwub

Immagino, A-Zpuò anche apparire, a giudicare dal tuo esempio?
Martin Ender,

@MartinEnder Sì, non distingue tra maiuscole e minuscole. Ho dimenticato di menzionare
Bassdrop Cumberwubwubwub il

2
C'è un numero sorprendente di persone che posano con le pistole quando giochi a questo gioco: D
Beta Decay

Risposte:


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"

Accetta l'input $acome stringa. Esegue un Invoke-WebRequest( iwr) nella posizione di Google appropriata, utilizzando il blocco di script della stringa interna negli -replacespazi con +nella stringa di input. Prendiamo .linksquello, dove .innerhtmlè la -likenostra stringa di input. Ciò produce i collegamenti con la descrizione dell'anteprima corretta. Prendi il primo [0]di quelli, prendi il suo .innerhtml e -splitquello sulle citazioni. Il quarto [3]elemento è il testo all'interno della img src="porzione, quindi ne facciamo un altro iwr, specificando -outfile $a.jpgnella cartella locale. Dal momento che queste sono solo le miniature generate da Google, sono garantite come jpg.


1
puoi cambiare google.comcon google.nlper -1 byte
Taylor Scott,

4

Excel VBA + , 465 332 byte

NOTA: utilizza riferimenti a

  • Libreria di oggetti HTML Microsoft
  • Controlli Internet di Microsoft
  • Microsoft Scripting Runtime

golfed:

SubRoutine completa che accetta input n(abbreviazione di nome) del tipo previsto Variant/Stringe genera il primo risultato di ricerca di immagini google per la query con quel nome e glamour shotverso una finestra di 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 per rimuovere lo spazio bianco in If InStr(1, a.href, "imgres") Then

-2 byte per passare .navigate (a.href)a.navigate a.href

-27 byte per ridurre il for each a in ... if (...) then ... end if .. nextloop ado until ... loop

-10 byte per la condensazione imgresda rese encryptedversoyp

-8 byte per la rimozione initalizers per j, ke supponendo modulo pulita

-1 byte per passare google.comagoogle.nl

-3 byte per la sostituzione Dim i as New ...conSet i=New ...

-8 byte per la rimozione del SHDocVw.riferimento di classe

-12 byte per la rimozione del with iblocco

-7 byte per la rimozione i.quit: ciò causa una perdita di memoria lasciando Internet Explorer aperto in background, pertanto si consiglia di utilizzare invece la versione completa non golfata o di terminare l'attività di Internet Explorer tramite Task Manager dopo l'uso

-6 byte per passare i.navigatealla subroutine di supportoh

-13 byte per passare Do Until ... Loopalla subroutine di supporto

-2 byte spostandosi j=0nell'helper e rimuovendo ,j, ,0(x2)

-11 byte per la conversione in una funzione di finestra immediata anonima

-8 byte per ridurre le chiamate della funzione di supporto in for .. nextloop

-16 byte per modificare l'output dall'oggetto Sheets(1)immagine alla visualizzazione tramite l' InternetExploreroggetto

Ungolfed, 1304 byte

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

Usage gif

Usage Gif


3

Vimperator , 30 sequenze di tasti

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

In alternativa 27 sequenze di tasti se non è necessaria l'immagine con la massima risoluzione:

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

Video: https://youtu.be/t8824UjlYt8



Fortunatamente il motore di ricerca standard di Firefox è google e Vimperator consente di digitare suggerimenti per impostazione predefinita. Questo è più lungo di quanto deve essere per assicurarsi che funzioni sempre indipendentemente da ciò che si cerca.

Riceve input dagli appunti.

Spiegazione:

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)

Grazie a @TaylorScott per aver trovato un caso limite.


Questo casi gestire quando Google consiglia di altri risultati di ricerca come i casi di questo tipo
Taylor Scott

@TaylorScott Non funziona, ma non riesco a ottenere consigli su Firefox. Potrebbe dipendere dal browser?
BlackCap,

1
Non importa, li ho presi per una ricerca diversa
BlackCap

3

Python 3.6, 247 242 232 forse 224 byte

Questo è un tentativo carino di risolvere questo. Salverà un file come p.pngnella directory corrente.

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)

Per eseguirlo facilmente dalla riga di comando, basta posizionare il contenuto sopra in un file, come glamour.pyed eseguire:

$ python glamour.py NAME_YOU_WANT

Aggiornamento 1: versione migliore con il nuovo URL di Google

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)

Aggiornamento 2:

Ho salvato alcuni byte:

  • Importando solo la funzione get dal modulo request
  • sfruttando il nuovo fflag di interpolazione delle stringhe di Python 3.6 senza allocare la sys.argvvariabile
  • eliminando alcuni spazi bianchi
  • trasformandolo in una fodera
  • rimuovendo la specifica del parser dalla BeautifulSoupchiamata

L'ultimo è controverso, poiché risulta in un messaggio std.output che dice al programmatore di specificare il parser per la compatibilità multipiattaforma, quindi potrebbe essere considerato un output indesiderato.

Ecco la versione da 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)

Ecco la versione da 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)

Ma la versione più breve potrebbe essere utilizzata se std.out viene reindirizzato /dev/nullo qualcosa del genere: D


Probabilmente potrei avere una versione con urllib + html.parse in modo che possa funzionare interamente con la libreria standard.
Gui42

1
probabilmente puoi usare www.google.nl/o forse anche google.nlinvece di https://www.google.com.br/salvare alcuni byte
Taylor Scott

1
per qualche motivo, devo continuare http://affinché funzioni con le richieste. Ma il google brasiliano mi ha dato risultati più divertenti, quindi
perdo

Questo casi gestire quando Google consiglia di altri risultati di ricerca come è il caso ad esempio come questo (potrebbe essere necessario effettuare ricerche multiple per ottenere suggerimenti come questo a pop-up)
Taylor Scott

Adoro anche il modo in cui guadagno qualche byte grazie a n = 'something'; f'{n}_here'invece di n = 'something'; '{n}_here'.format(n = n)on = 'something'; '{}_here'.format(n)
Gui42

1

Racchetta, 284 byes

(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"))))))))

Immagine dello schermo: inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.