Google自动填充乐趣


16

您的任务是创建一个程序,给定输入字符串,该程序将输出该搜索的第一个Google自动完成结果。输入/输出的格式由您决定。

规则

  1. 您的程序必须接受1个输入,一个字符串,并输出最上面的Google自动填充/自动填充建议结果。输入/输出的格式由您决定。只要确保提及您的I / O格式是什么即可。
  2. 显然,允许访问Internet。
  3. 严格禁止使用 URL缩短器(如bit.ly,TinyURL等)。您应该从以下URL获取自动完成结果:http ://suggestqueries.google.com/complete/search?client=your_browser&q= your_queryhttp://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
我将标准化一个客户名称,以使其公平
Beta Decay

7
为什么使用严格的URL?只要不使用任何URL缩短程序,只要使用了荐queques.google.com,我就不会遇到任何问题。
丹尼斯,

特别是,如果可以使用output=toolbar,则根本不必指定客户端。
丹尼斯,

2
@mınxomaτ但为什么不https -> http(保存1个字节),删除www.(保存4个字节),google.com -> google.us(保存1个字节)甚至google.com -> g.cn(保存6个字节;我不确定为什么它仍然可以工作,但似乎仍然可以在20170424中工作)
tsh

3
不同用户和地区的搜索建议是否有所不同?我认为没有标准的测试用例真的可以解决这个问题。
MrZander '17

Answers:


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
没有线索。这是如何通过吃一些有天赋的孩子来提高智商的方法,所以我认为这是一种改善。
丹尼斯,

堂,我爱w3m。它使我浏览时不会分心,而且完全很酷。
ckjbgames

1
@MistahFiggins谴责那个Minecraft。
JakeSteam

@MistahFiggins也许他们都只是想make(1) 黏泥
Arminius

12

Vim 8 + unimpaired.vim93 89 85 70 73 71字节

  • -4个字节感谢tsh
  • -2个字节,感谢Ian Emnace
  • -2字节归功于FatalMerlin
  • -1个字节感谢tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

另外,最后一个字节看起来很眨眼,;D因为它们包含非打印字符,说明中包含替换([url]为了简洁,我用替换了url的pre-querystring部分):

: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 scriptvim -s script input.txt在macOS上运行的文件中,它可以很好地运行。如果您添加-u NONE,则不起作用,但如果my .vimrc为空,则可以正常工作。我认为它正在使用系统中的某些东西.vimrc来使URL起作用。但是,这意味着它在V中不起作用,因此没有TIO链接。

其他一些测试用例:

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

我真正需要的是一种打开带有空格的URL的方法。用+first 替换它们太多字节了!


1
应该用加号代替空格+吗?
tsh

1
@tsh你是对的!现在有人告诉我如何保存2个字节并击败Dennis :)
Brian McCutchon

为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
当我计算字节数时,我得到88。也可以通过将URL更改为http://google.com/complete/search?client=hp&q=your_queryclient=gma=>纯JSON和较短的文本。)来保存字节。
FatalMerlin

7

蟒+ 请求 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()response方法将文本数组转换为可操作的变量,第二个.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个字符;-)
Stephan Bijzitter

我已经在Firefox 52和Chrome 57(在此页面,Google的首页以及about:blank)中进行过尝试,但我一直在收到CORS错误。您使它成功工作了吗?
ETHproductions'Apr

@ETHproductions是的,存在CORS问题,您必须在域commentqueries.google.com
MayorMonty,2017年

@StephanBijzitter .json()返回一个Promise,由于某种原因,它是异步的
MayorMonty

确实可以在这里工作,谢谢!
ETHproductions'Apr

1

C#,192 112 111个字节

@TheLethalCoder节省了80个字节。感谢您重新格式化我的代码,我不知道只允许忽略周围的类和方法体:)

通过替换为gma来保存另一个Byte hp,因为对于解析而言这无关紧要,并且响应主体之前只有一些乱码。

我以残酷的方式强迫该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. 抓取结果数组的第二个元素。

在此处输入图片说明


1

PowerShell,133115字节

([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()转换为列表对象。

随后提取第二个元素,例如(发出警告,我们不必在意):

> 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();
}

感谢您提供有关离开方法和类主体的提示!
FatalMerlin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.