Stellen Sie die Google-Suchergebnisse grafisch dar

9

Wenn Sie bei Google nach etwas suchen, wird am oberen Rand der Seite eine Meldung angezeigt, die etwa Folgendes enthält About 53,000,000 results (0.22 seconds). (Die Zahlen ändern sich natürlich je nachdem, wonach gesucht wurde.)

In dieser Herausforderung schreiben Sie ein Programm, das ein logarithmisches ASCII-Diagramm der Anzahl der von Google angegebenen Ergebnisse zeichnet, wenn alle nicht leeren Präfixe eines bestimmten Suchbegriffs durchsucht werden.

Ein Suchbegriff ist definiert als eine oder mehrere Zeichenfolgen von alphanumerischen Kleinbuchstaben, die durch ein Leerzeichen voneinander getrennt sind. In Regex ist ein Suchbegriff (?:[a-z0-9]+ )*[a-z0-9]+.

So im ok, rund 1a 2sind alle Such-Sätze, sondern I'm OK, R, 1a 2, und , ist es nicht.

(Die Zeichenbeschränkungen sind vorhanden, da Google Groß- und Kleinschreibung oder spezielle Symbole nur selten berücksichtigt. Das Ausweichen von nicht alphanumerischen Zeichen in URLs ist ebenfalls problematisch.)

Spec

Ihr Programm muss einen Suchbegriff und eine positive Gleitkommazahl H entweder von stdin oder von der Befehlszeile aufnehmen. (Sie können davon ausgehen, dass sie gültig sind, und es ist in Ordnung, wenn Sie Anführungszeichen oder etwas um den Suchbegriff herum benötigen.)

Als Arbeitsbeispiel nehmen wir an, dass der Suchbegriff a carH = 0,75 ist.

Schritt 1:
Sammeln Sie die nicht leeren Präfixe Ihres Suchbegriffs und setzen Sie sie in doppelte Anführungszeichen . Die Anführungszeichen stellen sicher, dass nach der genauen Phrase gesucht wird, und vermeiden Umleitungen , die Sie gemeint haben .

Schließen Sie alle Präfixe aus, die in einem Leerzeichen wie z a[space].

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

Schritt 2:
Suchen Sie jeden dieser Begriffe mithilfe von https://www.google.com genau so, wie er angezeigt wird , und notieren Sie die Anzahl der zurückgegebenen Ergebnisse.

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

Wenn der Suchbegriff nicht mit Dokumenten übereinstimmt , geben Sie eine 0 in die ResultsSpalte ein.

Schritt 3:
Berechnen Sie y = floor(H * log10(r + 1))für jede Zeile, wobei r der ResultsWert ist. H ist hier immer noch 0,75.

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

Schritt 4:
Ordnen Sie die yAnzahl der vertikalen Balken ( |) über dem letzten Zeichen jedes nicht zitierten Suchbegriffs an, und verwenden Sie Leerzeichen, um leere Bereiche in einer Art Balkendiagramm zu füllen.

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

Dieses Diagramm ist das Endergebnis Ihres Programms und das einzige, was es ausgeben muss. Es sollte zu stdout gehen.

Wertung

Dies ist , also gewinnt das kürzeste Programm in Bytes .

Anmerkungen

  • Sie können URL-Shortener oder andere Suchwerkzeuge / APIs verwenden, sofern die Ergebnisse mit denen der Suche unter https://www.google.com übereinstimmen .
  • Ich weiß, dass doppelte Anführungszeichen kein todsicherer Weg sind , um Weiterleitungen von "Meinten Sie ..." auszuschließen. Das Hinzufügen &nfpr=1zur URL funktioniert auch nicht immer . Mach dir keine Sorgen über diese Ungenauigkeiten. Suchen Sie einfach nach der About X results...Nachricht, egal was auftaucht, oder setzen Sie sie Resultsauf 0, wenn keine vorhanden ist.
  • Über jedem Leerzeichen in der Suchphrase im Diagramm befindet sich eine leere Spalte.
  • Das Diagramm sollte nicht breiter oder höher sein als es sein muss (z. B. mit Leerzeichen).
  • Es ist in Ordnung, wenn Ihr Programm Nebenwirkungen wie das Öffnen eines Webbrowsers hat, damit die kryptischen Google HTML / JS-Seiten beim Rendern gelesen werden können.
Calvins Hobbys
quelle
Ich weiß, dass es nicht typisch ist, keine Ergebnisse zu erhalten , aber wenn Sie dies tun, gibt es kein "Über x Ergebnisse ...". Ich gehe davon aus, dass das erkannt und als 0 Balken angezeigt werden soll?
Geobits
@Geobits Ja, nehme 0 Ergebnisse an.
Calvins Hobbys
1
Nur damit Sie wissen - hämmern Sie nicht auf Google - es wird mit einem Captcha antworten, wenn Sie es zu hart / zu oft treffen, was Ihr Programm brechen könnte
SeanC

Antworten:

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

Leider funktionierten die Anfragen bei dem von mir verwendeten Online-Tester nicht mehr, sodass ich heute Abend oder morgen noch weiter Golf spielen muss.

Erläuterung: Ich nehme die Eingabe über ARGV. Dann sende ich einfach eine Anfrage für jeden Teilstring, der nicht in einem Leerzeichen endet, finde die Ergebnisse über Regex (und standardmäßig, 0wenn der Regex nicht übereinstimmt) und erstelle dann das Histogramm mit horizontalen Balken. Am Ende kehre ich alle Linien um und transponiere sie, um das vertikale Histogramm zu erstellen.

Martin Ender
quelle