Wspaniały strzał glamour


11

wprowadź opis zdjęcia tutaj

Znalazłem dziś to zdjęcie w Internecie. Będąc leniwym programistą, nie chcę właściwie otwierać google i wpisywać kilku znaków. O wiele za dużo pracy! Jest to tak ważne zadanie, że powinno zostać zautomatyzowane.

Wyzwanie

Wszyscy wiedzą, że pierwszy obraz w wynikach wyszukiwania Google jest zawsze najlepszy. Dlatego powinien zostać przedstawiony użytkownikowi.

Masz napisać program lub funkcję, która przyjmuje ciąg znaków jako parametr i wyświetla pierwszy obraz znaleziony w google podczas wyszukiwania tej nazwy + słowa glamour shotza nią.

Wyszukiwane hasła Google

Aby wyszukać zdjęcia w Google, adres URL powinien zawierać parametr zapytania tbm=ischi q=query, z queryczym nazwa chcesz wyszukać.
Prawidłowy ciąg zapytania dla mojego imienia Bastowww.google.com/search?tbm=isch&q=Bas

Wejście

Twój program lub funkcja pobiera pojedynczy parametr wejściowy, którym jest nazwa, którą chcesz wyszukać w Google. Łańcuch ten składa się ze znaków [a-z], [A-Z], [0-9]oraz (spacja). Ten ciąg może być rozdzielony spacjami, aby wyszukać ciąg google w Google, należy zastąpić spacje +. Na przykład jest to prawidłowe zapytanie:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Wynik

Obraz można narysować na ekranie lub zapisać w pliku (w dowolnym formacie).
Jeśli pierwszym wynikiem wyszukiwania w Google jest plik gif, możesz pokazać gif lub dowolną ramkę tego gif.

Przypadki testowe

Uruchom ten fragment kodu, aby zobaczyć oczekiwane wyniki

To jest , wygrywa najkrótszy kod w bajtach!


Jakie znaki muszą być obsługiwane w danych wejściowych? Czy musimy się martwić kodowaniem adresów URL?
Martin Ender

@Martin Ender [a-z0-9], edytował mój post. Adresy URL będą wyglądały jak +
podane przeze

Sądzę, że A-Zmoże się również pojawić, sądząc po twoim przykładzie?
Martin Ender

@MartinEnder Tak, bez rozróżniania wielkości liter. Zapomniałem wspomnieć
Bassdrop Cumberwubwubwub

2
W tej grze zaskakująco wiele osób pozuje z bronią: D
Beta Decay

Odpowiedzi:


8

PowerShell v4 +, 160 bajtów

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"

Pobiera dane wejściowe $ajako ciąg. Wykonuje Invoke-WebRequest( iwr) do odpowiedniej lokalizacji Google, używając bloku skryptu wewnętrznego ciągu do -replacespacji +w ciągu wejściowym. Bierzemy .linksto, gdzie .innerhtmljest -likenaszym ciągiem wejściowym. Daje to linki z odpowiednim opisem miniatury. Zrób pierwszy [0]jeden z tych, wziąć jej .innerhtml i -splitto na notowaniach. Czwarty [3]element to tekst wewnątrz img src="porcji, więc robimy na nim kolejny iwr, określając -outfile ma być $a.jpgw folderze lokalnym. Ponieważ są to tylko miniatury generowane przez Google, na pewno są to jpg.


1
można zmienić się google.comz google.nlna -1 bajt
Taylor Scott

4

Excel VBA + , 465 332 bajtów

UWAGA: Wykorzystuje odniesienia do

  • Biblioteka obiektów Microsoft HTML
  • Kontrolki internetowe Microsoft
  • Środowisko wykonawcze skryptów Microsoft

Gra w golfa:

Pełna Subprocedura, która pobiera n(skrót od nazwy) oczekiwanego typu Variant/Stringi wysyła pierwszy wynik wyszukiwania grafiki google dla zapytania o tę nazwę i glamour shotdo okna przeglądarki internetowej.

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 bajty do usuwania białych znaków w If InStr(1, a.href, "imgres") Then

-2 bajty na zmianę .navigate (a.href)na.navigate a.href

-27 bajtów na zmniejszenie for each a in ... if (...) then ... end if .. nextpętli dodo until ... loop

-10 bajtów na kondensację imgresdo resi encrypteddoyp

-8 bajtów do usuwania initalizers do j, ki przy założeniu, że moduł czystej

-1 bajt do zmiany google.comnagoogle.nl

-3 bajtów do wymiany Dim i as New ...zSet i=New ...

-8 bajtów do usunięcia SHDocVw.odwołania do klasy

-12 bajtów do usunięcia with ibloku

-7 bajtów do usunięcia i.quit- powoduje to wyciek pamięci, pozostawiając Internet Explorera otwartym w tle, dlatego zaleca się, aby zamiast niego użyć pełnej wersji bez golfisty lub aby zadanie Internet Explorera zostało zakończone po użyciu przez menedżera zadań

-6 bajtów do przejścia i.navigatedo podprogramu pomocniczegoh

-13 bajtów do przejścia Do Until ... Loopdo podprogramu pomocniczego

-2 bajty poprzez przejście j=0do pomocnika i usunięcie ,j, ,0(x2)

-11 bajtów na konwersję do anonimowej funkcji bezpośredniego okna

-8 bajtów do zmniejszenia wywołań funkcji pomocniczych do for .. nextpętli

-16 bajtów do zmiany wyjścia z Sheets(1)obiektu obrazu na wyświetlanie za pośrednictwem InternetExplorerobiektu

Niegolfowany, 1304 bajtów

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

Sposób użycia gif

Wykorzystanie Gif


3

Vimperator , 30 naciśnięć klawiszy

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

Alternatywnie 27 naciśnięć klawiszy, jeśli nie potrzebujesz obrazu o najwyższej rozdzielczości:

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

Wideo: https://youtu.be/t8824UjlYt8



Na szczęście standardową wyszukiwarką w przeglądarce Firefox jest Google, a Vimperator pozwala domyślnie wpisywać wskazówki. Jest to dłuższe niż trzeba, aby mieć pewność, że zawsze działa niezależnie od tego, czego szukasz.

Pobiera dane ze schowka.

Wyjaśnienie:

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)

Dzięki @TaylorScott za znalezienie skrzynki krawędzi.


Czy obsługuje to przypadki, gdy Google zaleca inne wyniki wyszukiwania, tak jak w przypadku takich
Taylor Scott

@TaylorScott Nie, ale nie mogę uzyskać rekomendacji w Firefoksie. Czy to może być zależne od przeglądarki?
BlackCap

1
Nieważne, mam je dla innego wyszukiwania
BlackCap

3

Python 3.6, 247 242 232 może 224 bajty

To urocza próba rozwiązania tego. Zapisze plik jak p.pngw bieżącym katalogu.

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)

Aby z łatwością uruchomić go z wiersza poleceń, po prostu umieść powyższą zawartość w pliku, takim jak glamour.pyi uruchom:

$ python glamour.py NAME_YOU_WANT

Aktualizacja 1: lepsza wersja z nowym adresem 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)

Aktualizacja 2:

Zapisałem kilka bajtów:

  • Tylko importując funkcję get z modułu żądań
  • wykorzystując nową fflagę interpolacji ciągów python 3.6 bez przypisywania sys.argvzmiennej
  • eliminując niektóre białe spacje
  • zmieniając go w jednowarstwowy
  • usunięcie specyfikacji parsera z BeautifulSoupwywołania

Ostatni jest kontrowersyjny, ponieważ powoduje wyświetlenie komunikatu std.output informującego programistę, aby określił analizator składni w celu zapewnienia zgodności między platformami, dlatego można go uznać za niepożądane wyjście.

Oto wersja 224 bajtów:

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)

Oto wersja 232 bajtów:

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)

Można jednak użyć krótszej wersji, jeśli przekierowane jest std.out /dev/nulllub coś: D


Prawdopodobnie mógłbym mieć wersję z urllib + html.parse, aby mogła działać w całości ze standardową biblioteką.
Gui42

1
prawdopodobnie możesz użyć, www.google.nl/a może nawet google.nlzamiast https://www.google.com.br/zaoszczędzić trochę bajtów
Taylor Scott

1
z jakiegoś powodu muszę go zachować http://, aby działał z żądaniami. Ale brazylijskie google dało mi zabawniejsze wyniki, więc
tracę

Czy ten uchwyt przypadki Google zaleca inne wyniki wyszukiwania ukazywały się przypadki, takie jak to (być może trzeba będzie zrobić kilka wyszukiwania, aby uzyskać sugestie jak to pop-up)
Taylor Scott

Uwielbiam też to, jak n = 'something'; f'{n}_here'n = 'something'; '{n}_here'.format(n = n)n = 'something'; '{}_here'.format(n)
zyskuję

1

Rakieta, 284 bajtów

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

Zrzut ekranu: wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.