Wykres Wyniki wyszukiwania Google

9

Gdy szukasz czegoś w Google , wygodnie wyświetla wiadomość u góry strony, mówiąc coś w rodzaju About 53,000,000 results (0.22 seconds). (Liczby zmieniają się oczywiście w zależności od tego, czego szukano).

W tym wyzwaniu napiszesz program, który rysuje logarytmiczny wykres ASCII liczby wyników podanych przez Google podczas wyszukiwania wszystkich niepustych prefiksów danej frazy wyszukiwania.

Wyszukiwania Zwrot jest zdefiniowany jako jeden lub więcej ciągów małych znaków alfanumerycznych, oddzielone jedną spacją od siebie. W wyrażeniu regularnym wyszukiwane wyrażenie to (?:[a-z0-9]+ )*[a-z0-9]+.

Tak im ok, ri 1a 2to wszystkie zwroty wyszukiwania, ale I'm OK, R, 1a 2, i nie są.

(Obowiązują ograniczenia dotyczące znaków, ponieważ Google rzadko bierze pod uwagę wielkość liter lub symbole specjalne. Ucieczka od znaków innych niż alfanumeryczne w adresach URL również stanowi problem).

Spec

Twój program musi pobrać frazę wyszukiwania i dodatnią liczbę zmiennoprzecinkową H z linii standardowej lub wiersza poleceń. (Możesz założyć, że są one poprawne i jest w porządku, jeśli potrzebujesz cudzysłowów lub czegoś wokół wyszukiwanego wyrażenia).

Jako działający przykład załóżmy, że szukana fraza to a cari H = 0,75.

Krok 1:
Zbierz niepuste prefiksy wyszukiwanego wyrażenia i umieść je w podwójnych cudzysłowach . Cytaty zapewniają wyszukiwanie dokładnie tej frazy, unikając przekierowań typu „czy miałeś na myśli ...” .

Wyklucz wszystkie prefiksy kończące się spacją, np a[space].

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

Krok 2:
Wyszukaj każdy z tych terminów dokładnie tak, jak są wyświetlane za pomocą https://www.google.com , i zanotuj liczbę zwróconych wyników.

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

Jeśli wyszukiwane hasło nie pasuje do żadnego dokumentu , wpisz 0 w Resultskolumnie.

Krok 3:
Oblicz y = floor(H * log10(r + 1))dla każdego wiersza, gdzie r jest Resultswartością. H wciąż tutaj wynosi 0,75.

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

Krok 4:
Ułóż yliczbę pionowych pasków ( |) powyżej ostatniego znaku każdego niecytowanego wyszukiwanego terminu, używając spacji do wypełnienia pustych obszarów, na rodzaju wykresu słupkowego.

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

Ten wykres jest końcowym wynikiem twojego programu i jedyną rzeczą, którą musi wygenerować. Powinien przejść na standardowe wyjście.

Punktacja

To jest , więc wygrywa najkrótszy program w bajtach .

Notatki

  • Możesz używać skracaczy adresów URL lub innych narzędzi wyszukiwania / interfejsów API, o ile wyniki będą takie same jak w przypadku wyszukiwania na https://www.google.com .
  • Wiem, że podwójne cudzysłowy niepewnym sposobem na wykluczenie przekierowań „miałeś na myśli ...”. Dodawanie &nfpr=1do adresu URL również nie zawsze działa . Nie martw się o te nieścisłości. Poszukaj About X results...wiadomości bez względu na wyskakujące okienko lub ustaw Results0, jeśli nie ma.
  • Pusta kolumna jest nad dowolną spacją w wyszukiwanym wyrażeniu na wykresie.
  • Wykres nie powinien być szerszy ani wyższy niż powinien (np. Z białymi odstępami).
  • Jest ok, jeśli Twój program ma skutki uboczne, takie jak otwarcie przeglądarki internetowej, dzięki czemu można odczytać tajemnicze strony HTML / JS podczas renderowania.
Hobby Calvina
źródło
Wiem, że uzyskanie wyników zerowych nie jest typowe , ale kiedy to zrobisz, nie ma „O wynikach x…”. Zakładam, że powinien zostać wykryty i pokazany jako 0 słupków?
Geobits
@Geobits Tak, przyjmij 0 wyników.
Calvin's Hobbies
1
Na
wszelki wypadek

Odpowiedzi:

4

Rubin, 316 295 bajtów

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

Niestety żądania właśnie przestały działać na testerze internetowym, którego używałem, więc muszę zagrać w golfa jeszcze dziś wieczorem lub jutro.

Objaśnienie: Pobieram dane wejściowe za pośrednictwem ARGV. Następnie wysyłam żądanie dla każdego podłańcucha, który nie kończy się spacją, znajduję wyniki za pomocą wyrażenia regularnego (i domyślnie, 0jeśli wyrażenie regularne nie pasuje), a następnie buduję histogram za pomocą poziomych pasków. Na koniec odwracam wszystkie linie i transponuję je, aby utworzyć pionowy histogram.

Martin Ender
źródło