Gráfico dos resultados de pesquisa do Google

9

Quando você pesquisa algo no Google , ele fornece uma mensagem conveniente no topo da página dizendo algo como About 53,000,000 results (0.22 seconds). (Os números mudam dependendo do que foi pesquisado, é claro.)

Neste desafio, você escreverá um programa que desenha um gráfico ASCII logarítmico do número de resultados fornecidos pelo Google quando todos os prefixos não vazios de uma determinada frase de pesquisa são pesquisados.

Uma frase de pesquisa é definida como uma ou mais cadeias de caracteres alfanuméricos em minúsculas, separadas por um espaço uma da outra. No Regex, uma frase de pesquisa é (?:[a-z0-9]+ )*[a-z0-9]+.

Assim im ok, re 1a 2são todos de busca frases, mas I'm OK, R, 1a 2, e , não o são.

(As restrições de caracteres estão em vigor porque o Google raramente leva em conta maiúsculas ou símbolos especiais. Escapar caracteres não alfanuméricos em URLs também é um aborrecimento.)

Spec

Seu programa deve incluir uma frase de pesquisa e um número de ponto flutuante positivo H, do stdin ou da linha de comando. (Você pode assumir que eles são válidos e não há problema em precisar de aspas ou algo relacionado à frase de pesquisa.)

Como um exemplo prático, vamos supor que a frase de pesquisa seja a care H = 0,75.

Etapa 1:
reúna os prefixos não vazios da sua frase de pesquisa e coloque-os entre aspas duplas . As aspas garantem que a frase exata seja pesquisada, evitando redirecionamentos 'você quis dizer ...' .

Exclua todos os prefixos que terminam em um espaço como a[space].

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

Etapa 2:
pesquise cada um desses termos exatamente como eles aparecem usando https://www.google.com e observe o número de resultados retornados.

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

Se o termo de pesquisa não corresponder a nenhum documento , coloque um 0 na Resultscoluna.

Etapa 3:
Calcule y = floor(H * log10(r + 1))para cada linha, em que r é o Resultsvalor. H ainda é 0,75 aqui.

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

Etapa 4:
organize o ynúmero de barras verticais ( |) acima do último caractere de cada termo de pesquisa não citado, usando espaços para preencher áreas vazias, em uma espécie de gráfico de barras.

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

Este gráfico é o resultado final do seu programa e a única coisa que ele precisa para produzir. Deve ir para stdout.

Pontuação

Isso é , então o programa mais curto em bytes vence.

Notas

  • Você pode usar encurtadores de URL ou outras ferramentas / APIs de pesquisa, desde que os resultados sejam os mesmos da pesquisa em https://www.google.com .
  • Eu sei que aspas duplas não são uma maneira infalível de excluir redirecionamentos "você quis dizer ...". Adicionar &nfpr=1à URL nem sempre funciona . Não se preocupe com essas imprecisões. Procure a About X results...mensagem, não importa o que aparecer, ou defina Resultscomo 0 se não houver.
  • Há uma coluna vazia acima de qualquer espaço na frase de pesquisa no gráfico.
  • O gráfico não deve ser mais largo ou mais alto do que o necessário (por exemplo, com espaço em branco).
  • Tudo bem se o seu programa tiver efeitos colaterais, como abrir um navegador da Web, para que as páginas criptografadas html / js do Google possam ser lidas à medida que são renderizadas.
Passatempos de Calvin
fonte
Eu sei que não é típico obter zero resultados , mas quando você faz, não há "Sobre x resultados ...". Presumo que deve ser detectado e mostrado como 0 barras?
Geobits 19/09/14
@Geobits Sim, assuma 0 resultados.
Hobbies de Calvin
11
Só para você saber - não martelo google - ele irá responder com um captcha se você bater muito difícil / demasiado frequentemente, o que pode quebrar o seu programa
SeanC

Respostas:

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

Infelizmente, as solicitações pararam de funcionar no testador on-line que eu estava usando, então preciso resolver isso ainda hoje ou amanhã.

Explicação: Estou recebendo a entrada via ARGV. Então, estou apenas enviando uma solicitação para cada substring que não termina em um espaço, localizo os resultados via regex (e o padrão é 0se a regex não corresponder) e, em seguida, construa o histograma com barras horizontais. No final, estou revertendo todas as linhas e transpondo-as para criar o histograma vertical.

Martin Ender
fonte