Fabuloso tiro glamour

11

insira a descrição da imagem aqui

Encontrei esta foto na web hoje. Sendo um programador preguiçoso, não quero abrir o google e digitar alguns caracteres. Trabalho demais! Essa é uma tarefa tão importante que deve ser automatizada.

Desafio

Todo mundo sabe que a primeira imagem em um resultado de pesquisa no Google é sempre a melhor. Por isso, deve ser apresentado ao usuário.

Você deve escrever um programa ou função que use uma string como parâmetro e exiba a primeira imagem que encontrar no google ao pesquisar esse nome + as palavras glamour shotpor trás dele.

Consultas de pesquisa do Google

Para pesquisar imagens no google, o URL deve conter o parâmetro de consulta tbm=ische q=query, querysendo o nome que você deseja pesquisar.
Uma string de consulta válida para o meu nome Basseriawww.google.com/search?tbm=isch&q=Bas

Entrada

Seu programa ou função usa um único parâmetro de entrada, que é o nome que você deseja pesquisar no google. Essa seqüência será composto de personagens [a-z], [A-Z], [0-9]e (espaço). Essa string pode ser separada por espaço, para procurar uma string separada por espaço no google, é necessário substituir os espaços por +. Por exemplo, esta é uma consulta válida:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Resultado

A imagem pode ser desenhada na tela ou salva em um arquivo (em qualquer formato).
Se o primeiro resultado da pesquisa no google for um arquivo gif, você poderá mostrar o gif ou qualquer quadro desse gif.

Casos de teste

Execute esse snippet para ver os resultados esperados

Este é o , o código mais curto em bytes vence!

Bassdrop Cumberwubwubwub
fonte
Quais caracteres precisam ser suportados na entrada? Precisamos nos preocupar com a codificação de URL?
Martin Ender
@ Martin Ender [a-z0-9], editou meu post. Os urls será parecido com os exemplos que eu forneci, nenhuma codificação necessária, apenas um espaço para+
Bassdrop Cumberwubwubwub
Eu acho A-Zque também pode aparecer, a julgar pelo seu exemplo?
Martin Ender
@MartinEnder Sim, não faz distinção entre maiúsculas e minúsculas. Esqueci de mencionar
Bassdrop Cumberwubwubwub
2
Há um número surpreendente de pessoas posando com armas quando você joga este jogo: D
Beta Decay

Respostas:

8

PowerShell v4 +, 160 bytes

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"

Recebe a entrada $acomo uma sequência. Faz um Invoke-WebRequest( iwr) no local apropriado do Google, usando o bloco de scripts da cadeia interna para -replaceespaços +na cadeia de entrada. Tomamos .linksisso disso, onde .innerhtmlé a -likenossa string de entrada. Isso gera os links com a descrição adequada da miniatura. Pegue o primeiro [0]deles, pegue o seu .innerhtml e -splitele entre aspas. O quarto [3]elemento é o texto dentro da img src="parte, por isso fazemos outro iwr, especificando o -outfarquivo $a.jpgna pasta local. Como essas são apenas as miniaturas geradas pelo Google, elas são garantidas em jpg.

AdmBorkBork
fonte
1
você pode mudar para fora google.comcom google.nla -1 byte
Taylor Scott
4

Excel VBA + , 465 332 bytes

NOTA: Usa referências para

  • Biblioteca de objetos HTML da Microsoft
  • Controles da Internet da Microsoft
  • Microsoft Scripting Runtime

Golfe:

SubRotina completa que leva a entrada n(abreviação de nome) do tipo esperado Variant/Stringe gera o primeiro resultado da pesquisa de imagens do Google para a consulta desse nome e glamour shotpara uma janela do 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 bytes para remover o espaço em branco no If InStr(1, a.href, "imgres") Then

-2 bytes para mudar .navigate (a.href)para.navigate a.href

-27 bytes para reduzir o for each a in ... if (...) then ... end if .. nextloop parado until ... loop

-10 bytes para condensar imgrespara rese encryptedparayp

-8 bytes para remover initalizers para j, ke assumindo módulo limpo

-1 byte para mudar google.comparagoogle.nl

-3 bytes para substituir Dim i as New ...porSet i=New ...

-8 bytes para remover a SHDocVw.referência de classe

-12 bytes para remover o with ibloco

-7 bytes para remoção i.quit- isso causa algum vazamento de memória, deixando o Internet Explorer aberto em segundo plano; portanto, é recomendável que a versão completa e não protegida seja usada ou que a tarefa do Internet Explorer seja encerrada pelo gerenciador de tarefas após o uso.

-6 bytes para mover i.navigatepara a sub-rotina auxiliarh

-13 bytes para mover Do Until ... Looppara a sub-rotina auxiliar

-2 bytes movendo j=0para auxiliar a remoção e ,j, ,0(x2)

-11 bytes para converter em uma função de janela imediata anônima

-8 bytes para reduzir chamadas de função auxiliar no for .. nextloop

-16 bytes para alterar a saída do Sheets(1)objeto de imagem para exibição através do InternetExplorerobjeto

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

Gif de uso

Gif de uso

Taylor Scott
fonte
3

Vimperator , 30 pressionamentos de teclas

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

Alternativamente, 27 pressionamentos de tecla se você não precisar da imagem de maior resolução:

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

Vídeo: https://youtu.be/t8824UjlYt8



Felizmente, o mecanismo de pesquisa padrão no Firefox é o google, e o Vimperator permite digitar dicas por padrão. É mais longo do que o necessário para garantir que sempre funcione, independentemente do que você procura.

Leva entrada pela área de transferência.

Explicação:

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)

Agradecemos a @TaylorScott por encontrar um caso extremo.

BlackCap
fonte
Será que este lidar com casos em que o Google recomenda outros resultados de pesquisa como são os casos como este
Taylor Scott
@TaylorScott Não, mas não consigo obter recomendações no Firefox. Poderia ser dependente do navegador?
BlackCap
1
Não importa, eu tenho-os para uma pesquisa diferente
Cabeção
3

Python 3.6, 247 242 232 talvez 224 bytes

Esta é uma tentativa fofa de resolver este. Ele salvará o arquivo como p.pngno diretório atual.

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)

Para executá-lo com facilidade na linha de comando, basta colocar o conteúdo acima em um arquivo, como glamour.pye execute:

$ python glamour.py NAME_YOU_WANT

Atualização 1: versão melhorada com o novo URL do 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)

Atualização 2:

Salvei alguns bytes:

  • Importando apenas a função get do módulo de solicitações
  • aproveitando o novo fsinalizador de interpolação de cadeia de caracteres python 3.6 sem alocar o sys.argvpara uma variável
  • eliminando alguns espaços em branco
  • transformando-o em uma linha
  • removendo a especificação do analisador da BeautifulSoupchamada

O último é controverso, pois resulta em uma mensagem std.output informando o programador para especificar o analisador para compatibilidade entre plataformas, portanto, pode ser considerado uma saída indesejada.

Aqui está a versão de 224 bytes:

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)

Aqui está a versão de 232 bytes:

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)

Mas a versão mais curta pode ser usada se std.out for redirecionado /dev/nullou algo assim: D

Gui42
fonte
Provavelmente eu poderia ter uma versão com urllib + html.parse, para que ela possa ser executada inteiramente com a biblioteca padrão.
Gui42
1
você provavelmente pode usar www.google.nl/ou talvez até google.nlem vez de https://www.google.com.br/salvar alguns bytes
Taylor Scott
1
por alguma razão, tenho que manter http://para que ele funcione com solicitações. Mas o google brasileiro me deu resultados mais engraçados, por isso perdi pontos de diversão: D
Gui42 31/07/17
Será que este lidar com casos em que o Google recomenda outros resultados de pesquisa como são os casos tais como este (você pode ter que fazer várias pesquisas para obter sugestões como esta para aparecer)
Taylor Scott
Eu também adoro a forma como eu ganhar alguns bytes, graças ao n = 'something'; f'{n}_here'em vez de n = 'something'; '{n}_here'.format(n = n)oun = 'something'; '{}_here'.format(n)
Gui42
1

Raquete, 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"))))))))

Captura de tela: insira a descrição da imagem aqui

Geoff Reedy
fonte