Muhteşem cazibe çekimi


11

resim açıklamasını buraya girin

Bu resmi bugün web'de buldum. Tembel bir programcı olarak, google'ı açmak ve birkaç karakter yazmak istemiyorum. Çok fazla iş! Bu o kadar önemli bir görevdir ki, otomatikleştirilmelidir.

Meydan okuma

Herkes bir Google arama sonucundaki ilk resmin her zaman en iyisi olduğunu bilir . Bu nedenle kullanıcıya sunulmalıdır.

Bir dizeyi parametre olarak alan ve bu adı + glamour shotarkasındaki kelimeleri aradığınızda Google'da bulduğu ilk resmi görüntüleyen bir program veya işlev yazmanız gerekir.

Google arama sorguları

Google görüntüleri aramak için, url sorgu parametresi içermelidir tbm=ischve q=querybirlikte queryaramak istediğiniz ismi olmak.
Adıma için geçerli bir sorgu dizesi Basolacaktıwww.google.com/search?tbm=isch&q=Bas

Giriş

Programınız veya işleviniz, Google'da aramak istediğiniz ad olan tek bir girdi parametresi alır. Bu dize karakterlerden oluşacak [a-z], [A-Z], [0-9]ve (boşluk). Bu dize boşlukla ayrılmış olabilir, google'da boşlukla ayrılmış bir dize aramak için boşluklarla değiştirilmelidir +. Örneğin, bu geçerli bir sorgudur:
www.google.com/search?tbm=isch&q=Bassdrop+Cumberwubwubwub+glamour+shot

Çıktı

Görüntü ekrana çizilebilir veya bir dosyaya (herhangi bir biçimde) kaydedilebilir.
Google'daki ilk arama sonucu bir gif dosyasıysa, gif'i gösterebilir veya bu gif'in herhangi bir karesini gösterebilirsiniz.

Test senaryoları

Beklenen sonuçları görmek için bu snippet'i çalıştırın

Bu , bayt kazanır en kısa kod kazanır!


Girişte hangi karakterlerin desteklenmesi gerekir? URL kodlaması hakkında endişelenmemiz gerekiyor mu?
Martin Ender

@Martin Ender [a-z0-9], yayınımı düzenledi. +
Url'ler sağladığım

Sanırım, A-Zörneğinize bakarak, görünebilir mi?
Martin Ender

@MartinEnder Evet, büyük / küçük harfe duyarlı değil. Bahsetmeyi unuttum
Bassdrop Cumberwubwubwub

2
Bu oyunu oynarken silahlarla poz veren şaşırtıcı sayıda insan var: D
Beta Çürümesi

Yanıtlar:


8

PowerShell v4 +, 160 bayt

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"

Girişi $adize olarak alır. Does bir Invoke-WebRequest( iwriç-string komut bloğunu kullanarak uygun Google konuma kadar) -replaceile mekanlarda +girdi dizesindeki. Biz almak .linksnerede, bunun .innerhtmlise -likebizim girdi dizesi. Bu, uygun küçük resim açıklamasına sahip bağlantıları verir. İlk al [0]onlardan biri, almak onun .innerhtml ve -splito alıntılar üzerinde. Dördüncü [3]unsur iç metindir img src="başka yapmak, böylece kısım iwrbelirterek, bu konuda -outfolmayı Ile $a.jpgyerel klasörde. Bunlar yalnızca Google tarafından oluşturulan küçük resimler olduğundan, jpg olmaları garanti edilir.


1
-1 bayt google.comile değiştirebilirsinizgoogle.nl
Taylor Scott

4

Excel VBA + , 465332 Bayt

NOT: Referansları kullanır

  • Microsoft HTML Nesne Kitaplığı
  • Microsoft İnternet Denetimleri
  • Microsoft Komut Dosyası Çalıştırma Zamanı

golfed:

Beklenen türün Subgirişini n(adın kısaltması) alan Variant/Stringve bu adın sorgusu için ilk google görsel arama sonucunu ve glamour shotbir internet explorer penceresini çıkaran tam rutin .

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

Beyaz alanın kaldırılması için -2 bayt If InStr(1, a.href, "imgres") Then

-2 bayt değiştirmek .navigate (a.href)için.navigate a.href

for each a in ... if (...) then ... end if .. nextDöngüyü azaltmak için -27 baytdo until ... loop

Yoğunlaştırılması için -10 bayt imgresiçin resve encryptedhiçyp

-8 için initalizers çıkarılması için bayt j, kve temiz modülü varsayarak

Değiştirme -1 bayt google.comiçingoogle.nl

-3 değiştirilmesi için bayt Dim i as New ...ileSet i=New ...

SHDocVw.Sınıf referansını kaldırmak için -8 bayt

-12 with ibloğu kaldırmak için bayt

Kaldırmak için -7 bayt i.quit- bu, internet explorer'ı arka planda açık bırakarak bellek sızıntısına neden olur, bu nedenle bunun yerine tam ungolfed sürümünün kullanılması veya internet explorer görevinin kullanımdan sonra görev yöneticisi aracılığıyla sonlandırılması önerilir.

i.navigateYardımcı alt rutine geçmek için -6 bayth

Do Until ... LoopYardımcı alt rutine geçmek için -13 bayt

j=0Yardımcıya geçip kaldırarak -2 bayt ,j, ,0(x2)

Anonim anında pencere işlevine dönüştürmek için -11 bayt

Yardımcı fonksiyon çağrılarını for .. nextdöngüye indirmek için -8 bayt

Dan çıkışını değiştirmek için -16 bayt Sheets(1)aracılığıyla görüntülemeye resim nesnesi InternetExplorernesne

Ungolfed, 1304 Bayt

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

Kullanım gif

Kullanım Gif


3

Vimperator , 30 tuş vuruşu

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

Alternatif olarak, en yüksek çözünürlüklü görüntüye ihtiyacınız yoksa 27 tuş vuruşu:

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

Video: https://youtu.be/t8824UjlYt8



Neyse ki Firefox'taki standart arama motoru google ve Vimperator varsayılan olarak ipuçları yazmanıza izin veriyor. Bu, ne aradığınızdan bağımsız olarak her zaman çalıştığından emin olmak için olması gerekenden daha uzundur.

Panodan girdi alır.

Açıklama:

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'a avantaj sağlayan bir durum bulduğu için teşekkür ederiz.


Vakaları olduğu gibi google diğer arama sonuçlarını önerir bu sap vakaları mı bunun gibi
Taylor Scott

@TaylorScott Değil, ancak Firefox'ta öneriler alamıyorum. Tarayıcıya bağlı olabilir mi?
BlackCap

1
Boşver, onları farklı bir arama için aldım
BlackCap

3

Python 3.6, 247 242 belki 232 224 bayt

Bu, bunu çözmek için sevimli bir girişim. Dosyayı p.pnggeçerli dizindeki gibi kaydeder .

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)

Komut satırından kolaylıkla çalıştırmak için, yukarıdaki içeriği aşağıdaki gibi bir dosyaya yerleştirin glamour.pyve çalıştırın:

$ python glamour.py NAME_YOU_WANT

Güncelleme 1: Yeni Google URL'si ile daha iyi sürüm

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)

Güncelleme 2:

Birkaç bayt kaydettim:

  • Get işlevini yalnızca istek modülünden içe aktararak
  • değişkene fayırmadan yeni python 3.6 dize enterpolasyon bayrağından sys.argvyararlanma
  • bazı beyaz boşlukları ortadan kaldırmak
  • tek astar haline getirmek
  • ayrıştırıcı belirtimini BeautifulSoupçağrıdan kaldırma

Sonuncusu tartışmalıdır, çünkü programcıya platformlar arası uyumluluk için ayrıştırıcıyı belirtmesini söyleyen bir std.output mesajıyla sonuçlanır, bu nedenle istenmeyen çıktı olarak kabul edilebilir.

İşte 224 baytlık sürüm:

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 baytlık sürüm:

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)

Ancak std.out /dev/nullveya başka bir şeye yönlendirilirse daha kısa sürüm kullanılabilir : D


Muhtemelen tamamen standart kütüphaneyle çalışabilmesi için urllib + html.parse ile bir versiyona sahip olabilirim.
Gui42

1
bazı baytları kaydetmek yerine büyük olasılıkla kullanabilir www.google.nl/veya belki de kullanabilirsinizgoogle.nlhttps://www.google.com.br/
Taylor Scott

1
bazı nedenlerden ötürü, http://isteklerle çalışmasını sağlamak zorundayım. Ama Brezilya google bana daha komik sonuçlar verdi, bu yüzden eğlenceli noktaları
kaybediyorum

Böyle durumlarda olduğu gibi google diğer arama sonuçlarını önerir bu sap davaları mu bu kadar (eğer pop up için böyle önerileri almak için birden çok arama yapmak gerekebilir)
Taylor Scott

Ayrıca n = 'something'; f'{n}_here'yerine birkaç bayt n = 'something'; '{n}_here'.format(n = n)n = 'something'; '{}_here'.format(n)
kazandığımı

1

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

Ekran görüntüsü: resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.