Google Autouzupełnianie Zabawa


16

Twoim zadaniem jest stworzenie programu, który na podstawie ciągu wejściowego wyświetli pierwszy wynik autouzupełniania Google dla tego wyszukiwania. Format wejścia / wyjścia zależy od Ciebie.

Zasady

  1. Twój program musi przyjąć 1 dane wejściowe, ciąg znaków i wygenerować wynik najlepszych sugestii autouzupełniania / autouzupełniania Google. Format wejścia / wyjścia zależy od Ciebie. Pamiętaj tylko, aby podać swój format we / wy.
  2. Oczywiście dostęp do Internetu jest dozwolony.
  3. Skracacze URL (takie jak bit.ly, TinyURL itp.) Są surowo zabronione . Powinieneś pobrać wyniki autouzupełniania z tego adresu URL: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query lub http://google.com/complete/search?client=your_browser&q=your_query . Możesz założyć dowolną nazwę (lub ciąg znaków przeglądarki) dla client. W programie, który napisałem , zakładam Chrome. Każda nazwa lub ciąg przeglądarki powinien działać. Możesz przekazać dowolne opcje na stronę internetową, o ile korzystasz z jakiejś wersji http://suggestqueries.google.com/complete/search .
  4. Proszę wyjaśnić, jak działa Twój program. Nie jest to obowiązkowe, ale zdecydowanie odradzam.
  5. Wszystkie standardowe luki są surowo zabronione .

Przypadki testowe

Te ciągle się zmieniają, więc edytuj ten post, jeśli staną się nieaktualne.

'how to'
  => 'how to make slime'
'code golf'
  => 'code golf languages'
'you'
  => 'youtube'
'g'
  => 'google' (why would you google 'google'?)

To jest , więc może wygrać najkrótszy kod, a najlepszy programista ...


3
Ujednoliciłbym nazwę klienta, aby była sprawiedliwa
rozpad Beta

7
Dlaczego ścisły adres URL? Tak długo, jak używana jest witryna sugestqueries.google.com, bez żadnych skracaczy adresów URL, nie widzę żadnych problemów.
Dennis,

W szczególności, jeśli możemy użyć output=toolbar, nie musimy wcale określać klienta.
Dennis,

2
@ mınxomaτ, ale dlaczego nie https -> http(zapisz 1 bajt), usuń www.(zapisz 4 bajty), google.com -> google.us(zapisz 1 bajt) lub nawet google.com -> g.cn(zapisz 6 bajtów; nie jestem pewien, dlaczego to nadal działa, ale wygląda na to, że nadal działa w 20170424)
tsh

3
Czy sugestie wyszukiwania nie są różne dla różnych użytkowników i regionów? Nie sądzę, aby posiadanie standardowych przypadków testowych naprawdę na to działało.
MrZander

Odpowiedzi:


8

Zsh + coreutils + w3m, 88 71 68 bajtów

echo `w3m "google.com/complete/search?client=gma&q=$*"|cut -d\" -f4`

Przejście z Bash na Zsh pozwoliło zaoszczędzić 3 bajty.

Dzięki @FatalMerlin za krótszy adres URL, oszczędzając 17 bajtów!

Przykładowy przebieg

$ zsh complete.sh how to
how to make slime
$ zsh complete.sh dont you
don't you forget about me
$ zsh complete.sh don\'t you
don't you worry child

3
Spośród wszystkich rzeczy, dlaczego „uczynić szlam” pierwszą sugestią? Ilu ludzi jest tam, gdy rozmawiamy, robiąc śluz?
MildlyMilquetoast 23.04.17

27
Bladego pojęcia. Chodziło o to, jak podnieść swoje IQ, jedząc utalentowane dzieci , więc uważam to za poprawę.
Dennis

Dang, uwielbiam w3m. Pozwala mi to przeglądać bez rozpraszania uwagi i jest po prostu całkiem fajne.
ckjbgames

1
@MistahFiggins wini za to Minecraft.
JakeSteam

@MistahFiggins Może wszyscy chcą po prostu make(1) szlamować .
Arminius

12

Vim 8 + unimpaired.vim , 93 89 85 70 73 71 bajtów

  • -4 bajty dzięki tsh
  • -2 bajty dzięki Ianowi Emnace
  • -2 bajty dzięki FatalMerlin
  • -1 bajt dzięki tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

Jako bonus, ostatnie bajty wyglądają, jakby mrugały do ​​ciebie. ;DPonieważ zawiera znaki niedrukowalne, wyjaśnienie zawiera podstawienia (i [url]dla zwięzłości zastąpiłem część adresu URL przed zapytaniem ):

:s/ /+/g<CR>D:e [url]?client=gma&q=<C-R>"<CR>d3f";D]yy
:s/ /+/g<CR>                                           " Replace spaces with +
            D                                          " Delete and yank result
             :e                                        " Type :e ('edit' command) and a space
                [url]?client=gma&q=                    " Type the url, except the query
                                   <C-R>"              " Paste from the default register
                                         <CR>          " Execute the command, which opens the response
                                                       "   in a new buffer
                                             d3f"      " Delete through the first three quotation marks
                                                       "   This deletes everything before the suggestion
                                                 ;     " Repeat motion; this jumps to the next \"
                                                  D    " Delete everything from there, leaving only the suggestion
                                                   ]yy " unimpaired.vim C string unescape to handle escaped '

Jeśli chodzi o uruchamianie, działa dobrze, jeśli zapiszesz go w pliku o nazwie scripti uruchomisz vim -s script input.txtprzynajmniej na macOS. Nie działa, jeśli dodasz -u NONE, ale działa dobrze, jeśli mój .vimrcjest pusty. Zakładam, że używa czegoś z systemu, .vimrcaby działał URL. Oznacza to jednak, że nie działa w V, więc nie ma łącza do TIO.

Kilka innych przypadków testowych:

'what' => 'whataburger'
'what ' => 'what time is it' (Seriously? People Google that?)

To, czego naprawdę potrzebuję, to sposób na otwarcie adresu URL ze spacjami. Zastąpienie ich +pierwszym to po prostu zbyt wiele bajtów!


1
czy spację należy zastąpić znakiem plus +?
tsh

1
@tsh Masz rację! Teraz ktoś mi powie, jak mogę zaoszczędzić 2 bajty i pokonać Dennisa :)
Brian McCutchon 24.04.17

do działania netrw potrzebujeszfiletype plugin on
tbodt

1
Możesz wkleić „rejestr (domyślnie) w trybie wstawiania / poleceń, wykonując <Cr>”. Można zgolić kilka bajtów wykonując :r [url]?client=opera&q=^R"zamiast q:ir [url]?client=opera&q=<esc>p. ^Rto rzeczywisty bajt wysłany po naciśnięciu klawisza <Cr>, a nie klawisze ^i Rrazem, więc liczy się tylko jako jeden bajt.
Ian Emnace

1
Kiedy policzę bajty , otrzymuję 88. Możesz także zapisać bajty, zmieniając adres URL na http://google.com/complete/search?client=hp&q=your_query( client=gma=> Zwykły JSON i krótszy tekst.).
FatalMerlin

7

Python + żąda 121 117 103 bajtów

from requests import*
lambda s:get("http://google.com/complete/search?client=gma&q="+s).json()[1][0][0]

5

JavaScript, 109 bajtów

q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

Promise, musisz to pokochać, ale człowieku, to jest pełne! Ta odpowiedź wykorzystuje fetch()oparty na obietnicach interfejs API pobierania obecny w nowoczesnych przeglądarkach. Obiecuje pracę, ustanawiając procedury obsługi asynchronicznych działań na początku, takich jak wywołania zwrotne, ale lepiej. .then()Wykonuje funkcję, która będzie wywoływana w wyniku działania asynchronicznego. .then(r=>r.json())używa .json()metody odpowiedzi do przekonwertowania tablicy tekstowej na zmienną, którą można manipulować, druga .then()pobiera pierwszą odpowiedź.

Stosowanie:

S = q=>fetch("//suggestqueries.google.com/complete/search?client=chrome&q="+q).then(r=>r.json()).then(r=>r[1][0])

S("node.js").then(console.log); // Prints the result to the debug console

2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Ciesz się 11 znakami mniej ;-)
Stephan Bijzitter 24.04.17

Próbowałem w Firefoksie 52 i Chrome 57, na tej stronie, stronie głównej Google i about: blank, i wciąż dostaję błędy CORS. Czy udało Ci się to z powodzeniem?
ETHprodukcje

@ETHproductions Tak, występują problemy z CORS, które należy wykonać w domenie sugestqueries.google.com
MayorMonty

@StephanBijzitter .json()zwraca obietnicę, z jakiegoś powodu jest asynchroniczna
MayorMonty

Rzeczywiście to działa, dzięki!
ETHprodukcje

1

C #, 192 112 111 bajtów

Zapisano 80 bajtów dzięki @TheLethalCoder. Dzięki za ponowne sformatowanie mojego kodu, nie wiedziałem, że wolno było po prostu opuścić otaczającą klasę i metodę Method :)

Zapisano kolejny bajt, zastępując gmago hp, ponieważ nie ma to znaczenia dla analizowania, a przed ciałem odpowiedzi jest tylko bełkot.

Dosłownie brutalnie zmusiłem API do znalezienia gmai hp.

s=>new System.Net.WebClient().DownloadString("http://google.com/complete/search?client=hp&q="+s).Split('"')[3];

1

Groovy, 122 bajty

{Eval.me(new URL("http://suggestqueries.google.com/complete/search?client=chrome&q="+it).text.split(",\\{")[0]+"]")[1][0]}

Gruntownie:

  1. Pobierz tekst z punktu końcowego.

  2. Usuń część ze nawiasami na końcu, to nie jest poprawna składnia.

  3. Przetwarzaj pozostały bit jako świetną tablicę.

  4. Chwyć drugi element tablicy wyników.

enter image description here


1

PowerShell, 133 115 bajtów

([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]

Przykładowy przebieg

Wiersz poleceń Windows CMD:

powershell.exe -c "'code golf l'|%{([net.webclient]::new().downloadstring(""""http://google.com/complete/search?client=gma&q=$_"""")|convertfrom-json)[1][0]}"

Konsola PowerShell:

'code golf l'|%{([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]}

1

R, 111 bajtów

Dawno nie przyjechałem tutaj, ale spróbowałem:

jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]

Użycie pakietu jsonlitedo konwersji łańcucha pobranego z readLines()obiektu listy.

Następnie wyodrębnij drugi element, np. (Daje ostrzeżenie, że nie musimy się tym przejmować):

> jsonlite::fromJSON(readLines(url(paste0("http://google.com/complete/search?client=gma&q=",scan(,"")))))[[2]][1]
1: "how to"
2: 
    Read 1 item
[[1]]
[1] "how to make slime"

Warning message:
    In readLines(url(paste0("http://google.com/complete/search?client=gma&q=",  :
                                incomplete final line found on 'http://google.com/complete/search?client=gma&q=how to'

0

C #, 127 bajtów

s=>new System.Net.WebClient().DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s).Split('"')[3];

Pełna i sformatowana wersja:

static void Main()
{
    System.Func<string, string> f = s =>
        new System.Net.WebClient()
                      .DownloadString("http://suggestqueries.google.com/complete/search?client=gma&q="+s)
                      .Split('"')[3];

    System.Console.WriteLine(f("you"));
    System.Console.ReadLine();
}

Dzięki za podpowiedź na temat opuszczenia Metody i Ciała klasy!
FatalMerlin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.