Сказочный гламурный снимок

11

введите описание изображения здесь

Нашел эту картинку сегодня в сети. Будучи ленивым программистом, я не хочу открывать Google и вводить пару символов. Слишком много работы! Это настолько важная задача, что она должна быть автоматизирована.

Вызов

Все знают, что первое изображение в результатах поиска Google всегда лучшее. Следовательно, это должно быть представлено пользователю.

Вы должны написать программу или функцию, которая принимает строку в качестве параметра и отображает первое изображение, которое она находит в Google, когда вы ищете это имя + слова glamour shotза ним.

Поисковые запросы Google

Для поиска изображений на Google, URL - адрес должен содержать параметр запроса tbm=ischи q=queryс queryбыть имя , которое вы хотите найти.
Допустимая строка запроса для моего имени Basбудетwww.google.com/search?tbm=isch&q=Bas

вход

Ваша программа или функция принимает один параметр ввода - имя, которое вы хотите найти в Google. Эта строка будет состоять из символов [a-z], [A-Z], [0-9]и (пробел). Эта строка может быть разделена пробелами, чтобы найти в Google строку с разделенными пробелами, нужно заменить пробелы на +. Например, это правильный запрос:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Выход

Изображение можно либо вывести на экран, либо сохранить в файл (в любом формате).
Если первым результатом поиска в Google является файл GIF, вы можете либо показать GIF, либо показать любой кадр этого GIF.

Контрольные примеры

Запустите этот фрагмент, чтобы увидеть ожидаемые результаты

Это , выигрывает самый короткий код в байтах!

Bassdrop Cumberwubwubwub
источник
Какие символы должны поддерживаться при вводе? Нужно ли беспокоиться о кодировке URL?
Мартин Эндер
@Martin Ender [a-z0-9], отредактировал мой пост. URL будут похожи на примеры, которые я предоставил, без кодирования, просто место для+
Bassdrop Cumberwubwubwub
Наверное, A-Zтоже может появиться, судя по вашему примеру?
Мартин Эндер
@MartinEnder Да, это без учета регистра. Забыл упомянуть
Bassdrop Cumberwubwubwub
2
Когда вы играете в эту игру, удивительно много людей, позирующих с оружием: D
Beta Decay

Ответы:

8

PowerShell v4 +, 160 байт

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"

Принимает ввод $aв виде строки. Делает Invoke-WebRequest( iwr) соответствующее местоположение Google, используя блок скрипта внутренней строки для -replaceпробелов +во входной строке. Берем .linksо том, где .innerhtmlнаходится -likeнаша строка ввода. Это дает ссылки с соответствующим описанием миниатюры. Возьмите первый [0]из тех, возьмите его .innerhtml и -splitон по цитатам. Четвертый [3]элемент - это текст внутри img src="части, поэтому мы делаем еще один iwr, указывая, что -outfфайл должен находиться $a.jpgв локальной папке. Так как это всего лишь сгенерированные Google эскизы, они гарантированно будут jpg.

AdmBorkBork
источник
1
вы можете переодеться google.comс google.nlдля -1 байт
Тейлор Скотт
4

Excel VBA + , 465 332 байта

ПРИМЕЧАНИЕ: использует ссылки на

  • Microsoft HTML Object Library
  • Microsoft Internet Controls
  • Microsoft Scripting Runtime

Golfed:

Полная Subподпрограмма, которая принимает ввод n(сокращение от имени) ожидаемого типа Variant/Stringи выводит первый результат поиска изображений Google для запроса этого имени и glamour shotв окно 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 байта для удаления пробелов в If InStr(1, a.href, "imgres") Then

-2 байта для перехода .navigate (a.href)на.navigate a.href

-27 байт для уменьшения for each a in ... if (...) then ... end if .. nextцикла доdo until ... loop

-10 байтов для конденсации imgresв resи encryptedвyp

-8 байт для удаления initalizers для j, kи предполагая , чистый модуль

-1 байт для перехода google.comнаgoogle.nl

-3 байта для замены Dim i as New ...наSet i=New ...

-8 байт для удаления SHDocVw.ссылки на класс

-12 байт для удаления with iблока

-7 байт для удаления i.quit- это вызывает некоторую утечку памяти, оставляя Internet Explorer открытым в фоновом режиме, поэтому рекомендуется использовать вместо него полную версию без использования golf или что задача Internet Explorer завершается через диспетчер задач после использования

-6 байт для перехода i.navigateво вспомогательную подпрограммуh

-13 байт для перехода Do Until ... Loopв вспомогательную подпрограмму

-2 байта путем перемещения j=0в помощник и удаления ,j, ,0(x2)

-11 байт для преобразования в анонимную функцию непосредственного окна

-8 байт для сокращения вызовов вспомогательных функций в for .. nextцикле

-16 байт для изменения вывода Sheets(1)изображения с объекта на отображение через InternetExplorerобъект

Ungolfed, 1304 байта

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

Использование Gif

Тейлор Скотт
источник
3

Вимператор , 30 нажатий клавиш

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

Или 27 нажатий клавиш, если вам не нужно изображение с самым высоким разрешением:

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

Видео: https://youtu.be/t8824UjlYt8



К счастью, стандартная поисковая система в Firefox - это Google, и Vimperator позволяет вводить подсказки по умолчанию. Это дольше, чем нужно, чтобы убедиться, что он всегда работает независимо от того, что вы ищете.

Принимает ввод через буфер обмена.

Объяснение:

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)

Спасибо @TaylorScott за то, что нашли крайний случай.

судейская шапочка
источник
Рассматривает ли это случаи, когда Google рекомендует другие результаты поиска, как в таких
Тейлор Скотт
@TaylorScott Это не так, но я не могу получить рекомендации в Firefox. Может ли это зависеть от браузера?
BlackCap
1
Неважно, я получил их для другого поиска
BlackCap
3

Python 3,6, 247, 242, 232, может быть, 224 байта

Это милая попытка решить эту проблему. Это сохранит файл как p.pngв текущем каталоге.

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)

Чтобы легко запустить его из командной строки, просто поместите вышеуказанное содержимое в файл, например, glamour.pyи запустите:

$ python glamour.py NAME_YOU_WANT

Обновление 1: лучшая версия с новым URL 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)

Обновление 2:

Я сохранил несколько байтов:

  • Импортируя только функцию get из модуля запросов
  • использование нового fфлага интерполяции строки Python 3.6 без выделения sys.argvпеременной
  • устраняя некоторые пробелы
  • превращая его в однострочник
  • удаление спецификации парсера из BeautifulSoupвызова

Последнее является спорным, поскольку приводит к сообщению std.output, в котором программисту задается синтаксический анализатор для кроссплатформенной совместимости, поэтому его можно считать нежелательным выводом.

Вот 224-байтовая версия:

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)

Вот 232-байтовая версия:

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)

Но более короткую версию можно использовать, если std.out перенаправлен на /dev/nullчто-то еще: D

Gui42
источник
Я мог бы, вероятно, иметь версию с urllib + html.parse, чтобы она могла полностью работать со стандартной библиотекой.
Gui42
1
Вы, вероятно, можете использовать www.google.nl/или, возможно, даже google.nlвместо того, https://www.google.com.br/чтобы сохранить некоторые байты
Тейлор Скотт
1
по какой-то причине я вынужден оставить http://его для работы с запросами. Но бразильский гугл дал мне более смешные результаты, поэтому я
теряю
Рассматривает ли это случаи, когда Google рекомендует другие результаты поиска, как это имеет место (возможно, вам придется выполнить несколько поисков, чтобы получить подобные предложения, чтобы всплыть)
Тейлор Скотт
Мне также нравится, как я получаю несколько байтов благодаря n = 'something'; f'{n}_here'вместо n = 'something'; '{n}_here'.format(n = n)илиn = 'something'; '{}_here'.format(n)
Gui42
1

Ракетка, 284 бай

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

Снимок экрана: введите описание изображения здесь

Джефф Риди
источник