素晴らしいグラマーショット


11

ここに画像の説明を入力してください

今日、この写真をウェブで見つけました。怠け者のプログラマーなので、実際にGoogleを開いて2、3文字入力したくありません。仕事が多すぎる!これは非常に重要なタスクであるため、自動化する必要があります。

チャレンジ

Google検索結果の最初の画像が常に最高であることは誰もが知っています。したがって、ユーザーに提示する必要があります。

パラメータとして文字列を取り、その名前とそのglamour shot後ろの単語を検索すると、Googleで最初に見つかった画像を表示するプログラムまたは関数を作成します。

Google検索クエリ

Googleで画像を検索するには、URLクエリパラメータを含める必要がありますtbm=ischq=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
ベータ崩壊

回答:


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-WebRequestiwr)は、内側に文字列スクリプトブロックを使用して、適切なGoogleの位置へ-replaceとスペース+入力文字列です。を使用します。.linksここで、.innerhtml-like入力文字列です。これにより、適切なサムネイルの説明を含むリンクが生成されます。最初のテイク[0]これらのいずれかを取る .innerhtml-splitそれが引用で。4番目の[3]要素はimg src="部分内のテキストなので、そのiwr上で別の操作を行い、-outfileを$a.jpgローカルフォルダーに指定します。これらはGoogleが生成したサムネイルであるため、jpgであることが保証されています。


1
あなたはアウトに変更することができgoogle.comgoogle.nlために-1バイト
テイラー・スコットは、

4

Excel VBA +465 332バイト

注:参照を使用して

  • Microsoft HTMLオブジェクトライブラリ
  • Microsoftインターネットコントロール
  • Microsoft Scripting Runtime

ゴルフ済み:

予想されるタイプのSub入力n(名前の略)をVariant/String受け取り、その名前のクエリの最初のGoogle画像検索結果をglamour shotインターネットエクスプローラーウィンドウに出力する完全なルーチン。

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

に変更.navigate (a.href)する場合は-2バイト.navigate a.href

for each a in ... if (...) then ... end if .. nextループを減らすための-27バイトdo until ... loop

凝縮-10バイトimgresまでresencryptedしますyp

の初期化子を削除しjkクリーンモジュールを想定する場合は-8バイト

-1バイトに変更google.comするgoogle.nl

交換用-3バイトDim i as New ...Set i=New ...

SHDocVw.クラス参照を削除するための-8バイト

with iブロックを削除するための-12バイト

-7バイトの削除i.quit-インターネットエクスプローラーをバックグラウンドで開いたままにしておくと、メモリリークが発生します。代わりに、完全な未ゴルフバージョンを使用するか、使用後にインターネットエクスプローラータスクをタスクマネージャーで終了することをお勧めします

i.navigateヘルパーサブルーチンに移動するための-6バイトh

Do Until ... Loopヘルパーサブルーチンに移動するための-13バイト

-2バイト、j=0ヘルパーに移動して削除,j,0(x2)

匿名イミディエイトウィンドウ関数に変換する場合は-11バイト

for .. nextループへのヘルパー関数呼び出しを減らすための-8バイト

出力変化のために-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

Vimperator、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で推奨事項を取得できません。ブラウザに依存する可能性がありますか?
ブラックキャップ

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:新しいGoogle URLを使用したより良いバージョン

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呼び出しからパーサー仕様を削除する

最後の1つは、プラットフォーム間の互換性のためにパーサーを指定するようプログラマーに指示する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は他の検索結果を推奨しています。このハンドル例ん。このように(あなたがポップアップするために、このような提案を得るために、複数の検索を実行する必要があります)
テイラー・スコット

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

スクリーンショット: ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.