Graphique des résultats de recherche Google

9

Lorsque vous recherchez quelque chose sur Google , il donne un message pratique en haut de la page disant quelque chose comme About 53,000,000 results (0.22 seconds). (Les chiffres changent en fonction de ce qui a été recherché bien sûr.)

Dans ce défi, vous écrirez un programme qui dessine un graphique ASCII logarithmique du nombre de résultats fournis par Google lorsque tous les préfixes non vides d'une expression de recherche donnée sont recherchés.

Une expression de recherche est définie comme une ou plusieurs chaînes de caractères alphanumériques en minuscules, séparées par un espace les unes des autres. Dans Regex, une expression de recherche est (?:[a-z0-9]+ )*[a-z0-9]+.

Alors im ok, ret 1a 2sont toutes les phrases de recherche, mais I'm OK, R, 1a 2et , ne sont pas.

(Les restrictions de caractères sont en place, car Google prend rarement en compte la casse ou les symboles spéciaux. L'échappement de caractères non alphanumériques dans les URL est également un problème.)

Spec

Votre programme doit accepter une expression de recherche et un nombre à virgule flottante positif H à partir de stdin ou de la ligne de commande. (Vous pouvez supposer qu'ils sont valides et que ça va si vous avez besoin de guillemets ou de quelque chose autour de l'expression de recherche.)

Comme exemple de travail, supposons que la phrase de recherche est a caret H = 0,75.

Étape 1:
rassemblez les préfixes non vides de votre expression de recherche et mettez-les entre guillemets . Les guillemets garantissent que la phrase exacte sera recherchée, en évitant toute redirection "vouliez-vous dire ..." .

Exclure tous les préfixes se terminant par un espace tel que a[space].

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

Étape 2:
Recherchez chacun de ces termes exactement tels qu'ils apparaissent à l'aide de https://www.google.com et notez le nombre de résultats renvoyés.

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 le terme de recherche ne correspond à aucun document , mettez un 0 dans la Resultscolonne.

Étape 3:
Calculez y = floor(H * log10(r + 1))pour chaque ligne, où r est la Resultsvaleur. H est toujours de 0,75 ici.

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

Étape 4:
Disposez le ynombre de barres verticales ( |) au-dessus du dernier caractère de chaque terme de recherche sans guillemets, en utilisant des espaces pour remplir les zones vides, dans une sorte de graphique à barres.

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

Ce graphique est le résultat final de votre programme et la seule chose dont il a besoin pour sortir. Il devrait aller à la sortie standard.

Notation

Il s'agit de , donc le programme le plus court en octets l' emporte.

Remarques

  • Vous pouvez utiliser des raccourcisseurs d'URL ou d'autres outils de recherche / API à condition que les résultats soient les mêmes que pour la recherche sur https://www.google.com .
  • Je sais que les guillemets doubles ne sont pas un moyen infaillible d'exclure les redirections "vouliez-vous dire ...". L'ajout &nfpr=1à l'URL ne fonctionne pas toujours non plus . Ne vous inquiétez pas de ces inexactitudes. Recherchez simplement le About X results...message, peu importe ce qui apparaît, ou définissez-le Resultssur 0 s'il n'y en a pas.
  • Il y a une colonne vide au-dessus de n'importe quel espace dans l'expression de recherche dans le graphique.
  • Le graphique ne doit pas être plus large ou plus haut qu'il ne devrait l'être (par exemple avec des espaces).
  • Ce n'est pas grave si votre programme a des effets secondaires comme l'ouverture d'un navigateur Web afin que les pages cryptées Google html / js puissent être lues au fur et à mesure qu'elles sont rendues.
Loisirs de Calvin
la source
Je sais que ce n'est pas typique d'obtenir des résultats nuls , mais quand vous le faites, il n'y a pas de "About x results ...". Je suppose que cela devrait être détecté et affiché sous forme de 0 barre?
Geobits
@Geobits Oui, supposez 0 résultat.
Calvin's Hobbies
1
Juste pour que vous sachiez - ne martelez pas google - il répondra avec un captcha si vous le frappez trop fort / trop souvent, ce qui pourrait casser votre programme
SeanC

Réponses:

4

Rubis, 316 295 octets

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

Malheureusement, les demandes ont juste cessé de fonctionner sur le testeur en ligne que j'utilisais, donc je dois continuer à jouer ce soir ou demain.

Explication: je prends l'entrée via ARGV. Ensuite, j'envoie simplement une demande pour chaque sous-chaîne qui ne se termine pas dans un espace, trouve les résultats via l'expression régulière (et par défaut 0si l'expression régulière ne correspond pas), puis crée l'histogramme avec des barres horizontales. À la fin, j'inverse toutes les lignes et les transpose pour créer l'histogramme vertical.

Martin Ender
la source