Казковий гламур постріл


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.

Тестові справи

Запустіть цей фрагмент, щоб побачити очікувані результати

Це , найкоротший код в байтах виграє!


Які символи потрібно підтримувати у введенні? Чи потрібно турбуватися про кодування 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на цьому, вказавши -outfile, щоб він знаходився $a.jpgу локальній папці. Оскільки це лише мініатюри, створені Google, вони гарантовано будуть jpg.


1
ви можете переодягнутися google.comз google.nlдля -1 байт
Тейлор Скотт

4

Excel VBA + , 465 332 байт

ПРИМІТКА. Використовує посилання на

  • Об'єктна бібліотека HTML HTML
  • Microsoft Internet Controls
  • Виконання сценарію Microsoft

Гольф:

Повна 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 відкритим у фоновому режимі, тому рекомендується використовувати замість цього повну версію, яка не використовується для перешкод, або завдання Internet Explorer припиняти через диспетчер завдань після використання

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

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

-2 байти, перемістившись j=0у помічник і видаливши ,j, ,0(x2)

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

-8 байт для зменшення виклику функції помічника в for .. nextцикл

-16 байт для зміни результату від Sheets(1)об'єкта зображення до відображення через InternetExplorerоб'єкт

Безголів, 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


Можливо, я міг би мати версію з urllib + html.parse, щоб вона могла повністю працювати зі стандартною бібліотекою.
Gui42

1
ви можете скористатися www.google.nl/або, можливо, навіть google.nlзамість того, https://www.google.com.br/щоб зберегти кілька байт
Тейлор Скотт,

1
мені чомусь доводиться постійно http://працювати з запитами. Але бразильський google дав мені кумедніші результати, тож я
розгубився

Чи має ця ручка випадки , коли Google рекомендує інші результати пошуку , як це випадки , такі , як це (можливо , доведеться зробити кілька пошуків , щоб отримати пропозиції , як це спливав)
Тейлор Скотт

Мені також подобається, як я n = 'something'; f'{n}_here'n = 'something'; '{n}_here'.format(n = n)n = 'something'; '{}_here'.format(n)
набираю

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

Знімок екрана: введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.