Google Autocomplete Fun


16

あなたの仕事は、入力文字列が与えられると、その検索の最初のGoogleオートコンプリート結果を出力するプログラムを作成することです。入出力の形式はユーザー次第です。

ルール

  1. プログラムは1つの入力と文字列を受け取り、Googleのオートコンプリート/オートフィル候補の上位の結果を出力する必要があります。入出力の形式はユーザー次第です。必ず、I / Oフォーマットとは何かを述べてください。
  2. 明らかに、インターネットへのアクセスは許可されています。
  3. URL短縮(bit.ly、TinyURLなど)は厳しく禁止されています。あなたはこのURLからあなたのオートコンプリートの結果をフェッチする必要がありますhttp://suggestqueries.google.com/complete/search?client=your_browser&q=your_queryまたはhttp://google.com/complete/search?client=your_browser&q=your_query。のブラウザ名(または、文字列)を想定することができclientます。私が書いプログラムでは、Chromeを想定しています。任意のブラウザ名または文字列が機能するはずです。http://suggestqueries.google.com/complete/searchのバリアントを使用している限り、ウェブページにオプションを渡すことができます。
  4. プログラムがどのように機能するかの説明を提供してください。必須ではありませんが、強くお勧めします。
  5. すべての標準的な抜け穴は厳密に禁止されています。

テストケース

これらは常に変化しているため、これらが古くなった場合はこの投稿を編集してください。

'how to'
  => 'how to make slime'
'code golf'
  => 'code golf languages'
'you'
  => 'youtube'
'g'
  => 'google' (why would you google 'google'?)

これはですので、最短のコードが勝ち、最高のプログラマーが繁栄するかもしれません...


3
クライアント名を標準化して公平にする
ベータ崩壊

7
なぜ厳密なURLなのか?suggestqueries.google.comがURL短縮機能なしで使用されている限り、問題は発生しません。
デニス

特に、を使用できる場合output=toolbar、クライアントを指定する必要はまったくありません。
デニス

2
@mınxomaτしかし、なぜhttps -> http(1バイトを保存)、削除www.(4バイトを保存)、google.com -> google.us(1バイトを保存)、さらにはgoogle.com -> g.cn(6バイトを保存;これがまだ機能するのか分かりませんが、20170424でまだ機能しているようです)
-tsh

3
ユーザーや地域によって検索候補は異なりませんか?標準のテストケースがこれに本当に役立つとは思わない。
-MrZander

回答:


8

Zsh + coreutils + w3m、88 71 68バイト

echo `w3m "google.com/complete/search?client=gma&q=$*"|cut -d\" -f4`

BashからZshに切り替えると、3バイト節約されました。

@FatalMerlinの短いURLに感謝し、17バイトを節約しました!

サンプル実行

$ zsh complete.sh how to
how to make slime
$ zsh complete.sh dont you
don't you forget about me
$ zsh complete.sh don\'t you
don't you worry child

3
何よりも、「スライムを作る」ことが最初の提案なのはなぜですか?私たちが話している間にスライムを作っている人が何人いますか?
MildlyMilquetoast

27
全く分からない。それは、才能のある子供たちをしばらく食べることによってあなたのIQを上げる方法でしたので、私はこれを改善と考えます。
デニス

ダン、私はw3mが大好きです。気を散らすことなくブラウジングすることができ、まったくクールです。
ckjbgames

1
@MistahFigginsそのためのMinecraftのせいです。
JakeSteam

@MistahFigginsは、おそらく彼らはすべてちょうどにしたいmake(1) スライム
アルミニウス

12

Vim 8 + unimpaired.vim93 89 85 70 73 71バイト

  • tshのおかげで-4バイト
  • -2バイト、Ian Emnaceのおかげ
  • FatalMerlinのおかげで-2バイト
  • tsh / ckjbgamesのおかげで-1バイト
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

ボーナスとして、最後のバイトはあなたにウインクしているように見えます;Dこれには非印刷文字が含まれているため、説明には置換が含まれています([url]簡潔にするために、URLのクエリ文字列の前の部分をに置き換えました):

:s/ /+/g<CR>D:e [url]?client=gma&q=<C-R>"<CR>d3f";D]yy
:s/ /+/g<CR>                                           " Replace spaces with +
            D                                          " Delete and yank result
             :e                                        " Type :e ('edit' command) and a space
                [url]?client=gma&q=                    " Type the url, except the query
                                   <C-R>"              " Paste from the default register
                                         <CR>          " Execute the command, which opens the response
                                                       "   in a new buffer
                                             d3f"      " Delete through the first three quotation marks
                                                       "   This deletes everything before the suggestion
                                                 ;     " Repeat motion; this jumps to the next \"
                                                  D    " Delete everything from there, leaving only the suggestion
                                                   ]yy " unimpaired.vim C string unescape to handle escaped '

実行に関しては、少なくともmacOSで名前付きのファイルに保存してscript実行すると正常に機能しますvim -s script input.txt。を追加すると機能しません-u NONEが、my .vimrcが空の場合は正常に機能します。私はそれがシステム.vimrcから何かを使用してURLのものを機能させると仮定します。ただし、これはVでは機能しないため、TIOリンクがないことを意味します。

さらにいくつかのテストケース:

'what' => 'whataburger'
'what ' => 'what time is it' (Seriously? People Google that?)

本当に必要なのは、スペースを含むURLを開く方法です。それらを+最初に置き換えると、バイト数が多すぎます!


1
スペースをプラス記号で置き換える必要があり+ますか?
-tsh

1
@tshその通りです!今、誰かが2バイトを節約してデニスを打つ方法を教えてくれます:)
ブライアンマックラッチン

netrwが動作するために必要なfiletype plugin on
-tbodt

1
<Cr>を実行することにより、「レジスタ(デフォルト)を挿入/コマンドモードで貼り付ける」ことができます。の:r [url]?client=opera&q=^R"代わりに行うことで、数バイトを削ることができますq:ir [url]?client=opera&q=<esc>p^Rあなたが<CR>ではなく、キーを押したときに実際のバイトが送信される^R、それは唯一の1バイトとしてカウントして、一緒に。
イアンエムナス

1
バイトカウントすると88になります。また、URLをhttp://google.com/complete/search?client=hp&q=your_queryclient=gma=>プレーンJSONおよび短いテキスト)に変更することでバイトを節約できます。
-FatalMerlin

7

Python + 要求 121 117 103バイト

from requests import*
lambda s:get("http://google.com/complete/search?client=gma&q="+s).json()[1][0][0]

5

JavaScript、109バイト

q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

Promise、あなたはそれを愛さなければならないが、男はそれが冗長です!この答えはfetch()、最新のブラウザに存在する約束ベースのフェッチAPIを使用しています。Promiseは、コールバックのような非同期アクションのハンドラーを最初に確立することで機能しますが、より優れています。.then()非同期アクションの結果で呼び出される関数を取ります。.then(r=>r.json())使用して.json()操作可能な変数にテキスト列を変換するために応答方法を、第二は、.then()ちょうど最初の応答を引っ張ります。

使用法:

S = q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

S("node.js").then(console.log); // Prints the result to the debug console

2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])11文字少ない;-)をお楽しみください
ステファンBijzitter

Firefox 52とChrome 57、このページ、Googleのホームページ、およびabout:blankで試しましたが、CORSエラーが発生し続けています。正常に動作するようになりましたか?
-ETHproductions

@ETHproductionsはい、CORSの問題があります。ドメインsuggestqueries.google.comで
MayorMonty

@StephanBijzitter .json()はPromiseを返しますが、それは何らかの理由で非同期です
-MayorMonty

確かにそこで動作します、ありがとう!
ETHproductions

1

C#、192 112 111バイト

@TheLethalCoderのおかげで80バイトを節約できました。コードを再フォーマットしてくれたおかげで、周囲のクラスとメソッド本体をそのままにすることが許可されているとは知りませんでした:)

解析で問題にならず、応答本文の前に少し意味がわからないため、で置き換えgmaて別のByteを保存しましたhp

I見つけるlitterallyブルート強制API gmahp

s=>new System.Net.WebClient().DownloadString("http://google.com/complete/search?client=hp&q="+s).Split('"')[3];

1

Groovy、122バイト

{Eval.me(new URL("http://suggestqueries.google.com/complete/search?client=chrome&q="+it).text.split(",\\{")[0]+"]")[1][0]}

基本的に:

  1. エンドポイントからテキストを取得します。

  2. 最後に角括弧で囲まれた部分を削除します。これは有効な構文ではありません。

  3. 残りのビットをグルーヴィーな配列として解析します。

  4. 結果配列の2番目の要素を取得します。

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


1

PowerShell、133 115バイト

([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]

サンプル実行

Windows CMDコマンドライン:

powershell.exe -c "'code golf l'|%{([net.webclient]::new().downloadstring(""""http://google.com/complete/search?client=gma&q=$_"""")|convertfrom-json)[1][0]}"

PowerShellコンソール:

'code golf l'|%{([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]}

1

R、111バイト

私が最後にここに来てから長い時間がかかりましたが、試してみました:

jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]

パッケージjsonliteを使用して、取得した文字列をreadLines()リストオブジェクトに変換します。

次に、2番目の要素を抽出します(例:気にする必要がないという警告を表示します)。

> jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]
1: "how to"
2: 
    Read 1 item
[[1]]
[1] "how to make slime"

Warning message:
    In readLines(url(paste0("http://google.com/complete/search?client=gma&q=",  :
                                incomplete final line found on 'http://google.com/complete/search?client=gma&q=how to'

0

C#、127バイト

s=>new System.Net.WebClient().DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s).Split('"')[3];

完全でフォーマットされたバージョン:

static void Main()
{
    System.Func<string, string> f = s =>
        new System.Net.WebClient()
                      .DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s)
                      .Split('"')[3];

    System.Console.WriteLine(f("you"));
    System.Console.ReadLine();
}

MethodとClass Bodyの脱退についてのヒントをありがとう!
-FatalMerlin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.