绘制Google搜索结果图


9

当您在Google搜索内容时,它会在页面顶部附近方便地显示一条消息,例如About 53,000,000 results (0.22 seconds)。(数字随搜索内容而变化。)

在此挑战中,您将编写一个程序,当搜索给定搜索词组的所有非空前缀时,绘制一个对数 ASCII图,显示Google提供的结果数。

搜索短语被定义为小写字母数字字符的一个或多个字符串,从彼此用一个空格分开。在Regex中,搜索词组是(?:[a-z0-9]+ )*[a-z0-9]+

所以im okr1a 2全搜索短语,但是I'm OKR1a 2,和,都没有。

(由于Google很少考虑大小写或特殊符号,因此存在字符限制。在URL中转义非字母数字字符也很麻烦。)

规格

您的程序必须从stdin或命令行中输入一个搜索短语和一个正浮点数H。(您可以假设它们是有效的,如果您在搜索词中需要引号或其他内容,也可以。)

作为一个工作示例,我们假设搜索短语为,a car并且H = 0.75。

第1步:
收集搜索短语的非空前缀,并将其放在双引号中。引号确保将搜索确切的短语,避免任何“您的意思是……”重定向。

排除所有以a[space]。结尾的前缀。

Prefixes
"a"
"a c"
"a ca"
"a car"

第2步:
使用https://www.google.com完全搜索每个术语,并记下返回的结果数。

Search Term    Message                                       Results
"a"            About 6,950,000,000 results (0.27 seconds)    6950000000
"a c"          About 861,000,000 results (0.27 seconds)      861000000 
"a ca"         About 2,990,000 results (0.30 seconds)        2990000
"a car"        About 53,900,000 results (0.39 seconds)       53900000

如果搜索词与任何文档都不匹配,请在Results栏中输入0 。

步骤3:为每一行
计算y = floor(H * log10(r + 1)),其中r是Results值。H在这里仍然是0.75。

Search Term    Results       y
"a"            6950000000    7
"a c"          861000000     6
"a ca"         2990000       4
"a car"        53900000      5

步骤4:在条形图中,使用空格填充空白区域,在每个未加引号的搜索词的最后一个字符上方
排列y竖线(|)的数量。

|
| |
| | |
| |||
| |||
| |||
| |||
a car

该图是程序的最终结果,也是唯一需要输出的东西。它应该转到标准输出。

计分

这是 ,因此以字节为单位的最短程序将获胜。

笔记

  • 您可以使用URL缩短器或其他搜索工具/ API,只要结果与搜索https://www.google.com相同即可。
  • 我知道双引号不是排除“您的意思是……”重定向的肯定方法。添加&nfpr=1到URL 也不总是可行。不必担心这些错误。About X results...无论弹出什么消息,只需查找该消息Results;如果没有,则设置为0。
  • 图中搜索短语中任何空格上方都有一个空列。
  • 该图不应比其需要的宽或高(例如,带有空白)。
  • 如果您的程序具有打开网络浏览器之类的副作用,这样可以使隐藏的Google html / js页面在呈现时就可以读取,这是可以的。

我知道获得零结果不是很典型,但是当您执行操作时,没有“关于x结果...”。我认为应该检测到并显示为0条?
Geobits 2014年

@Geobits是的,假设结果为0。
加尔文的爱好2014年

1
请注意-不要
用刀

Answers:


4

Ruby,316 295字节

require 'open-uri'
s,h=*$*
r=[]
s.size.times{|i|r<<(s[i]==' '?'':?|*(h.to_f*Math.log10((URI.parse("http://google.com/search?q=#{URI::encode ?"+s[0..i]+?"}").read[/About [\d,]+ results/]||?0).gsub(/\D/,'').to_i+1)).floor)+s[i]}
puts r.map{|l|l.rjust(r.map(&:size).max).chars}.transpose.map &:join

不幸的是,这些请求刚刚停止在我正在使用的在线测试仪上工作,因此我需要在今晚或明天进行进一步的测试。

说明:我正在通过ARGV输入。然后,我只是向每个不以空格结尾的子字符串发送一个请求,通过正则表达式查找结果(0如果正则表达式不匹配,则默认为结果),然后使用单杠构建直方图。最后,我要反转所有线条并将它们转置以创建垂直直方图。

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.