Google Autocomplete Fun


16

Ihre Aufgabe ist es, ein Programm zu erstellen, das anhand einer Eingabezeichenfolge das erste Ergebnis der automatischen Vervollständigung von Google für diese Suche ausgibt. Das Format der Eingabe / Ausgabe liegt bei Ihnen.

Regeln

  1. Ihr Programm muss 1 Eingabe, eine Zeichenfolge und das beste Ergebnis für die automatische Vervollständigung / automatische Ausfüllung von Google-Vorschlägen ausgeben. Das Format der Eingabe / Ausgabe liegt bei Ihnen. Stellen Sie nur sicher, dass Sie das E / A-Format angeben.
  2. Der Zugriff auf das Internet ist selbstverständlich erlaubt.
  3. URL-Kürzungen (wie bit.ly, TinyURL usw.) sind strengstens untersagt . Sie sollten Ihre Ergebnisse für die automatische Vervollständigung über diese URL abrufen : http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query oder http://google.com/complete/search?client=your_browser&q=your_query . Sie dürfen einen beliebigen Browsernamen (oder eine beliebige Zeichenfolge) für annehmen client. In dem Programm, das ich geschrieben habe, gehe ich von Chrome aus. Jeder Browsername oder String sollte funktionieren. Sie dürfen alle Optionen an die Webseite übergeben, solange Sie eine Variante von http://suggestqueries.google.com/complete/search verwenden .
  4. Bitte erläutern Sie die Funktionsweise Ihres Programms. Es ist nicht obligatorisch, aber ich rate dringend dazu.
  5. Alle Standardlücken sind strengstens untersagt .

Testfälle

Diese ändern sich ständig. Bearbeiten Sie diesen Beitrag, wenn sie nicht mehr aktuell sind.

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

Das ist , also kann der kürzeste Code gewinnen und der beste Programmierer gedeihen ...


3
Ich würde einen Kundennamen standardisieren, um ihn fair zu machen
Beta Decay

7
Warum die strenge URL? Solange suggestqueries.google.com ohne URL-Kürzel verwendet wird, sehe ich keine Probleme.
Dennis

Insbesondere wenn wir verwenden können output=toolbar, müssen wir überhaupt keinen Client angeben.
Dennis

2
@ mınxomaτ aber warum nicht https -> http(1 Byte speichern), entfernen www.(4 Byte speichern), google.com -> google.us(1 Byte speichern) oder sogar google.com -> g.cn(6 Byte speichern; ich bin mir nicht sicher, warum dies noch funktioniert, aber es scheint, dass es in 20170424 noch funktioniert)
TSH

3
Sind Suchvorschläge nicht für verschiedene Benutzer und Regionen unterschiedlich? Ich denke nicht, dass Standard-Testfälle dafür wirklich funktionieren.
MrZander

Antworten:


8

Zsh + Coreutils + W3M, 88 71 68 Bytes

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

Das Umschalten von Bash auf Zsh sparte 3 Bytes.

Danke an @FatalMerlin für die kürzere URL, die 17 Bytes spart!

Probelauf

$ 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
Warum ist "Schleim machen" ausgerechnet der erste Vorschlag? Wie viele Leute machen da draußen Schleim, während wir sprechen?
MildlyMilquetoast

27
Keine Ahnung. Es war, wie man seinen IQ erhöht, indem man eine Zeit lang begabte Kinder isst , also würde ich dies als eine Verbesserung betrachten.
Dennis

Mist, ich liebe w3m. Dadurch kann ich ohne Ablenkungen surfen und es ist insgesamt einfach ziemlich cool.
ckjbgames

1
@MistahFiggins Tadelt Minecraft für diesen.
JakeSteam

@MistahFiggins Vielleicht wollen sie alle nur make(1) schleimen .
Arminius

12

Vim 8 + unbeeinträchtigt. Vim , 93 89 85 70 73 71 Bytes

  • -4 bytes dank tsh
  • -2 Bytes dank Ian Emnace
  • -2 Bytes dank FatalMerlin
  • -1 Byte dank tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

Als Bonus sehen die letzten Bytes so aus, als würden sie Ihnen ;Dzuzwinkern. Da dies nicht druckbare Zeichen enthält, enthält die Erklärung Ersetzungen (und ich habe der [url]Kürze halber den vor der Abfrage erfolgenden Teil der URL durch ersetzt ):

: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 '

Was das Laufen betrifft, funktioniert es einwandfrei, wenn Sie es in einer Datei mit dem Namen speichern scriptund vim -s script input.txtzumindest unter macOS ausführen . Es funktioniert nicht, wenn Sie hinzufügen -u NONE, aber es funktioniert gut, wenn meine .vimrcleer ist. Ich nehme an, es wird etwas vom System verwendet .vimrc, um die URL-Inhalte zum Laufen zu bringen. Dies bedeutet jedoch, dass es in V nicht funktioniert, also keine TIO-Verbindung.

Einige weitere Testfälle:

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

Was ich wirklich brauche, ist eine Möglichkeit, eine URL mit Leerzeichen darin zu öffnen. Das Ersetzen durch +first ist einfach zu viele Bytes!


1
Soll das Leerzeichen durch ein Pluszeichen ersetzt werden +?
TSH

1
@tsh Du hast recht! Jetzt sagt mir jemand, wie ich 2 Bytes sparen und Dennis schlagen kann :)
Brian McCutchon

für netrw zu arbeiten, die Sie brauchenfiletype plugin on
tbodt

1
Sie können das "Register (Standard) im Einfüge- / Befehlsmodus einfügen, indem Sie <Cr> ausführen". Sie können :r [url]?client=opera&q=^R"stattdessen ein paar Bytes abschneiden q:ir [url]?client=opera&q=<esc>p. ^RWird das tatsächliche Byte gesendet, wenn Sie <Cr> drücken, nicht die Tasten ^und Rzusammen, so zählt es nur als ein Byte.
Ian Emnace

1
Wenn ich die Bytes zähle, erhalte ich 88. Sie können auch Bytes speichern, indem Sie die URL in http://google.com/complete/search?client=hp&q=your_query( client=gma=> Plain JSON und kürzerer Text) ändern .
FatalMerlin

7

Python + fordert 121 117 103 Bytes an

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

5

JavaScript, 109 Bytes

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

PromiseDu musst es lieben, aber der Mensch ist es wortreich! Diese Antwort verwendet fetch()eine versprechungsbasierte Abruf-API, die in modernen Browsern vorhanden ist. Versprechen funktionieren, indem zu Beginn Handler für asynchrone Aktionen eingerichtet werden, z. B. Rückrufe, aber besser. Das .then()nimmt eine Funktion an, die mit dem Ergebnis der asynchronen Aktion aufgerufen wird. .then(r=>r.json())Verwendet die .json()Antwortmethode, um das Textarray in eine manipulierbare Variable zu konvertieren. Die zweite Methode ruft .then()nur die erste Antwort ab.

Verwendung:

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])Genießen Sie 11 Zeichen weniger ;-)
Stephan Bijzitter

Ich habe es in Firefox 52 und Chrome 57 versucht, auf dieser Seite, auf der Startseite von Google und unter about: blank, und es werden immer wieder CORS-Fehler angezeigt. Hast du es geschafft, erfolgreich zu arbeiten?
ETHproductions

@ETHproductions Ja, es gibt CORS-Probleme, die Sie auf der Domain suggestqueries.google.com
MayorMonty am

@StephanBijzitter .json()gibt ein Versprechen zurück, es ist aus irgendeinem Grund
asynchron

In der Tat funktioniert es dort, danke!
ETHproductions

1

C #, 192 112 111 Bytes

80 Bytes dank @TheLethalCoder eingespart. Vielen Dank für die Neuformatierung meines Codes, ich wusste nicht, dass es erlaubt ist, den umgebenden Class and Method Body einfach wegzulassen :)

Sparte ein weiteres Byte durch Ersetzen gmadurch hp, da es für das Parsen keine Rolle spielt und es nur ein bisschen Kauderwelsch vor dem Antworttext gibt.

Ich habe die API brachial gezwungen, zu finden gmaund hp.

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

1

Groovy, 122 Bytes

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

Grundsätzlich:

  1. Holen Sie sich den Text vom Endpunkt.

  2. Entfernen Sie das Teil mit den Klammern am Ende. Dies ist keine gültige Syntax.

  3. Analysieren Sie das verbleibende Bit als grooviges Array.

  4. Greifen Sie nach dem zweiten Element des Ergebnisfelds.

Bildbeschreibung hier eingeben


1

PowerShell, 133 115 Byte

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

Probelauf

Windows CMD-Befehlszeile:

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

PowerShell-Konsole:

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

1

R, 111 Bytes

Es ist lange her, dass ich das letzte Mal hier war, aber ich habe es versucht:

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

Verwenden des Pakets jsonlitezum Konvertieren der Zeichenfolge, aus der ein Listenobjekt abgerufen wurde readLines().

Extrahieren Sie anschließend das zweite Element, z. B. (gibt eine Warnung aus, um die wir uns nicht kümmern müssen):

> 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 Bytes

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

Vollständige und formatierte Version:

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();
}

Vielen Dank für den Hinweis zum Verlassen der Methode und des Klassenkörpers!
FatalMerlin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.