Gráfico de resultados de búsqueda de Google

9

Cuando buscas algo en Google , aparece convenientemente un mensaje cerca de la parte superior de la página que dice algo así About 53,000,000 results (0.22 seconds). (Los números cambian dependiendo de lo que se buscó, por supuesto).

En este desafío, escribirá un programa que dibuje un gráfico ASCII logarítmico del número de resultados dados por Google cuando se buscan todos los prefijos no vacíos de una frase de búsqueda dada .

Una frase de búsqueda se define como una o más cadenas de caracteres alfanuméricos en minúsculas, separadas por un espacio entre sí. En Regex, una frase de búsqueda es (?:[a-z0-9]+ )*[a-z0-9]+.

Por lo tanto im ok, ry 1a 2son todas las frases de búsqueda, pero I'm OK, R, 1a 2, y , no lo son.

(Las restricciones de caracteres están establecidas porque Google rara vez tiene en cuenta mayúsculas o minúsculas o símbolos especiales. Escapar de caracteres no alfanuméricos en las URL también es una molestia).

Especificaciones

Su programa debe tomar una frase de búsqueda y un número positivo de coma flotante H desde stdin o desde la línea de comando. (Puede suponer que son válidos y está bien si necesita comillas o algo alrededor de la frase de búsqueda).

Como ejemplo de trabajo, supongamos que la frase de búsqueda es a cary H = 0.75.

Paso 1:
Reúna los prefijos no vacíos de su frase de búsqueda y póngalos entre comillas dobles . Las citas aseguran que se buscará la frase exacta, evitando cualquier redireccionamiento de 'quiso decir ...' .

Excluya todos los prefijos que terminan en un espacio como a[space].

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

Paso 2:
busque cada uno de estos términos exactamente como aparecen con https://www.google.com y anote la cantidad de resultados devueltos.

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

Si el término de búsqueda no coincide con ningún documento , ponga un 0 en la Resultscolumna.

Paso 3:
Calcule y = floor(H * log10(r + 1))para cada fila, donde r es el Resultsvalor. H sigue siendo 0,75 aquí.

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

Paso 4:
Organice el ynúmero de barras verticales ( |) sobre el último carácter de cada término de búsqueda sin comillas, usando espacios para llenar áreas vacías, en una especie de gráfico de barras.

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

Este gráfico es el resultado final de su programa y lo único que necesita para generar. Debería ir a stdout.

Puntuación

Este es el , por lo que gana el programa más corto en bytes .

Notas

  • Puede usar acortadores de URL u otras herramientas de búsqueda / API siempre que los resultados sean los mismos que buscando https://www.google.com .
  • Sé que las comillas dobles no son una forma segura de excluir las redirecciones "quiso decir ...". Agregar &nfpr=1a la URL no siempre funciona tampoco . No te preocupes por estas inexactitudes. Simplemente busque el About X results...mensaje sin importar lo que aparezca, o configúrelo Resultsen 0 si no hay ninguno.
  • Hay una columna vacía sobre cualquier espacio en la frase de búsqueda en el gráfico.
  • El gráfico no debe ser más ancho o más alto de lo necesario (por ejemplo, con espacios en blanco).
  • Está bien si su programa tiene efectos secundarios como abrir un navegador web para que las páginas crípticas html / js de Google se puedan leer a medida que se procesan.
Pasatiempos de Calvin
fuente
Sé que no es típico obtener cero resultados , pero cuando lo hace no hay "Acerca de x resultados ...". ¿Supongo que debería detectarse y mostrarse como 0 barras?
Geobits
@Geobits Sí, suponga 0 resultados.
Aficiones de Calvin
1
Para que lo sepas, no martillees google, responderá con un captcha si lo golpeas con demasiada fuerza / demasiada frecuencia, lo que podría interrumpir tu programa
SeanC

Respuestas:

4

Ruby, 316 295 bytes

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

Desafortunadamente, las solicitudes simplemente dejaron de funcionar en el probador en línea que estaba usando, por lo que necesito jugar más esta noche o mañana.

Explicación: Estoy tomando la entrada a través de ARGV. Luego, solo estoy enviando una solicitud para cada subcadena que no termina en un espacio, encuentro los resultados a través de expresiones regulares (y por defecto 0si la expresión regular no coincide), y luego construyo el histograma con barras horizontales. Al final, invierto todas las líneas y las transpongo para crear el histograma vertical.

Martin Ender
fuente