Google Arama Sonuçlarını Grafikle


9

Google'da bir şey aradığınızda , sayfanın üst kısmına yakın bir şeye benzer bir mesaj verir About 53,000,000 results (0.22 seconds). (Sayılar, elbette aranana bağlı olarak değişir.)

Bu meydan okumada , belirli bir arama ifadesinin tüm boş olmayan önekleri arandığında Google tarafından verilen sonuçların logaritmik ASCII grafiğini çizen bir program yazacaksınız .

Bir ara-ifade birbirinden bir boşluk ile ayrılmış küçük alfanümerik karakterden oluşan bir ya da birden fazla ipliklerin, olarak tanımlanır. Regex'te bir arama ifadesi (?:[a-z0-9]+ )*[a-z0-9]+.

Yani im ok, rve 1a 2tüm arama-ibareleri vardır, ama I'm OK, R, 1a 2, ve , değildir.

(Google, nadiren büyük / küçük harf veya özel sembolleri dikkate aldığı için karakter kısıtlamaları mevcuttur. URL'lerde alfasayısal olmayan karakterlerden kaçmak da bir güçlüktür.)

spec

Programınız bir arama ifadesini ve stdin'den veya komut satırından pozitif bir kayan nokta sayısı H almalıdır. (Geçerli olduklarını varsayabilir ve arama ifadesinin etrafında tırnak işaretleri veya başka bir şeye ihtiyacınız varsa sorun yoktur.)

Çalışan bir örnek olarak, arama ifadesinin a carH = 0.75 olduğunu varsayalım .

Adım 1:
Arama ifadenizin boş olmayan öneklerini toplayın ve çift ​​tırnak içine alın . Tırnak işaretleri, "demek istediniz ..." yönlendirmelerinden kaçınarak, tam kelime öbeğinin aranmasını sağlar .

Gibi bir alanda biten tüm önekleri hariç tutun a[space].

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

2. Adım: https://www.google.com adresini
kullanarak bu terimlerin her birini tam olarak göründükleri şekilde arayın ve döndürülen sonuçların sayısını not edin.

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

Arama terimi herhangi bir dokümanla eşleşmediyseResults sütuna 0 koyun .

Adım 3: Her satır için
hesaplayın y = floor(H * log10(r + 1)), burada r Resultsdeğerdir. H burada hala 0.75.

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

Adım 4: Boş alanları doldurmak için boşluklar kullanarak bir tür çubuk grafikte, alıntılanmamış her arama teriminin son karakterinin üzerinde dikey çubuk ( ) sayısını
düzenleyin .y|

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

Bu grafik, programınızın nihai sonucudur ve çıktısının alınması gereken tek şeydir. Stdout'a gitmeli.

puanlama

Bu , bayt cinsinden en kısa program kazanır.

notlar

  • Sonuçlar https://www.google.com arama ile aynı olduğu sürece URL kısaltıcılarını veya diğer arama araçlarını / API'lerini kullanabilirsiniz .
  • Çift tırnakların "demek istediniz ..." yönlendirmelerini hariç tutmanın kesin bir yolu olmadığını biliyorum . &nfpr=1URL'ye eklemek her zaman işe yaramaz . Bu yanlışlıklar için endişelenme. About X results...Ne olursa olsun mesajı arayın ya da Resultsyoksa 0'a ayarlayın .
  • Grafikteki arama ifadesinde herhangi bir boşluğun üstünde boş bir sütun var.
  • Grafik olması gerekenden daha geniş veya daha uzun olmamalıdır (örneğin boşlukla).
  • Programınızın bir web tarayıcısı açmak gibi yan etkileri varsa sorun olmaz, böylece şifreli Google html / js sayfaları oluşturuldukça okunabilir.

Sıfır sonuç almanın tipik olmadığını biliyorum , ama bunu yaptığınızda "About x results ..." diye bir şey yok. Bunun tespit edilmesi ve 0 çubuk olarak gösterilmesi gerektiğini varsayalım?
Geobits

@ Geobits Evet, 0 sonuç olduğunu varsayın.
Calvin'in Hobileri

1
Bildiğiniz gibi - google'ı çekiçlemeyin - çok sert / çok sık vurursanız bir captcha ile yanıt verir, bu da programınızı
bozabilir

Yanıtlar:


4

Yakut, 316 295 bayt

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

Ne yazık ki, istekler sadece kullandığım çevrimiçi test üzerinde çalışmayı bıraktı, bu yüzden bu gece veya yarın daha fazla golf yapmam gerekiyor.

Açıklama: Girişi ARGV üzerinden alıyorum. Sonra sadece bir boşlukta bitmeyen her alt dize için bir istek gönderiyorum, sonuçları regex yoluyla buluyorum (ve 0normal ifade eşleşmiyorsa varsayılan ) ve histogramı yatay çubuklarla oluşturuyorum. Sonunda, tüm çizgileri tersine çeviriyorum ve dikey histogramı oluşturmak için bunları aktarıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.