Rappresenta graficamente i risultati di ricerca di Google


9

Quando cerchi qualcosa su Google , viene visualizzato un messaggio nella parte superiore della pagina che dice qualcosa di simile About 53,000,000 results (0.22 seconds). (I numeri cambiano a seconda di ciò che è stato cercato ovviamente.)

In questa sfida dovrai scrivere un programma che disegna un grafico ASCII logaritmico del numero di risultati forniti da Google quando vengono cercati tutti i prefissi non vuoti di una determinata frase di ricerca.

Una frase di ricerca è definita come una o più stringhe di caratteri alfanumerici minuscoli, separati da uno spazio l'uno dall'altro. In Regex una frase di ricerca è (?:[a-z0-9]+ )*[a-z0-9]+.

Quindi im ok, re 1a 2sono tutti ricerca frasi, ma I'm OK, R, 1a 2, e , non lo sono.

(Le restrizioni sui caratteri sono in atto perché Google raramente tiene conto di maiuscole o simboli speciali. Anche la fuga di caratteri non alfanumerici negli URL è una seccatura.)

Spec

Il programma deve contenere una frase di ricerca e un numero in virgola mobile positivo H dalla riga di comando o da stdin. (Puoi presumere che siano validi e va bene se hai bisogno di virgolette o qualcosa intorno alla frase di ricerca.)

Ad esempio, supponiamo che la frase di ricerca sia a care H = 0,75.

Passaggio 1:
raccogli i prefissi non vuoti della frase di ricerca e inseriscili tra virgolette . Le virgolette assicurano che verrà cercata la frase esatta, evitando qualsiasi reindirizzamento "intendevi ..." .

Escludere tutti i prefissi che terminano in uno spazio come a[space].

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

Passaggio 2:
cerca ciascuno di questi termini esattamente come appaiono utilizzando https://www.google.com e annota il numero di risultati restituiti.

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 il termine di ricerca non corrisponde ad alcun documento , inserire uno 0 nella Resultscolonna.

Passaggio 3:
calcolare y = floor(H * log10(r + 1))per ogni riga, dove r è il Resultsvalore. H è ancora 0,75 qui.

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

Passaggio 4:
disporre il ynumero di barre verticali ( |) sopra l'ultimo carattere di ciascun termine di ricerca non quotato, utilizzando gli spazi per riempire le aree vuote, in una sorta di grafico a barre.

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

Questo grafico è il risultato finale del tuo programma e l'unica cosa che deve produrre. Dovrebbe andare a stdout.

punteggio

Questo è , quindi vince il programma più breve in byte .

Appunti

  • Puoi utilizzare abbreviazioni di URL o altri strumenti di ricerca / API purché i risultati siano gli stessi della ricerca https://www.google.com .
  • So che le doppie virgolette non sono un modo infallibile per escludere i reindirizzamenti "intendevi ...". L'aggiunta &nfpr=1all'URL non sempre funziona neanche . Non preoccuparti per queste inesattezze. Cerca il About X results...messaggio indipendentemente da ciò che viene visualizzato o imposta Resultssu 0 se non ce n'è.
  • C'è una colonna vuota sopra qualsiasi spazio nella frase di ricerca nel grafico.
  • Il grafico non dovrebbe essere più largo o più alto del necessario (ad es. Con spazi bianchi).
  • Va bene se il tuo programma ha effetti collaterali come l'apertura di un browser web in modo che le criptiche pagine html / js di Google possano essere lette mentre vengono visualizzate.

So che non è tipico ottenere zero risultati , ma quando lo fai non c'è "Informazioni su x risultati ...". Presumo che dovrebbe essere rilevato e mostrato come 0 barre?
Geobits,

@Geobits Sì, assume 0 risultati.
Calvin's Hobbies,

1
Solo così sai - non martellare google - risponderà con un captcha se lo colpisci troppo forte / troppo spesso, il che potrebbe interrompere il tuo programma
SeanC

Risposte:


4

Rubino, 316 295 byte

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

Sfortunatamente, le richieste hanno smesso di funzionare sul tester online che stavo usando, quindi ho bisogno di giocarci ancora stasera o domani.

Spiegazione: Prendo l'input tramite ARGV. Quindi sto solo inviando una richiesta per ogni sottostringa che non termina in uno spazio, trovo i risultati tramite regex (e di default 0se la regex non corrisponde), quindi costruisco l'istogramma con barre orizzontali. Alla fine, sto invertendo tutte le linee e le traspongo per creare l'istogramma verticale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.