Divertimento con completamento automatico di Google


16

Il tuo compito è creare un programma che, data una stringa di input, produrrà il primo risultato del completamento automatico di Google per quella ricerca. Il formato di input / output dipende da te.

Regole

  1. Il tuo programma deve prendere 1 input, una stringa e produrre il risultato dei suggerimenti di completamento automatico / riempimento automatico di Google migliori. Il formato di input / output dipende da te. Assicurati solo di menzionare il tuo formato I / O.
  2. Ovviamente, è consentito l'accesso a Internet.
  3. Gli accorciatori di URL (come bit.ly, TinyURL, ecc.) Sono severamente vietati . Dovresti recuperare i risultati del completamento automatico da questo URL: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query o http://google.com/complete/search?client=your_browser&q=your_query . Puoi assumere qualsiasi nome di browser (o stringa, per quella materia) per client. Nel programma che ho scritto , presumo Chrome. Qualsiasi nome o stringa del browser dovrebbe funzionare. È consentito passare qualsiasi opzione alla pagina Web purché si utilizzi una variante di http://suggestqueries.google.com/complete/search .
  4. Fornire una spiegazione del funzionamento del programma. Non è obbligatorio, ma lo consiglio vivamente.
  5. Tutte le scappatoie standard sono severamente vietate .

Casi test

Questi sono in costante evoluzione, quindi modifica questo post se diventano obsoleti.

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

Questo è , quindi può vincere il codice più breve e prosperare il miglior programmatore ...


3
Vorrei standardizzare un nome cliente, per renderlo giusto
Decadimento beta

7
Perché l'URL rigoroso? Finché viene utilizzato suggestqueries.google.com, senza alcun accorciatore di URL, non vedo alcun problema.
Dennis,

In particolare, se possiamo usare output=toolbar, non dobbiamo affatto specificare un client.
Dennis,

2
@ mınxomaτ ma perché no https -> http(salva 1 byte), rimuovi www.(salva 4 byte), google.com -> google.us(salva 1 byte) o anche google.com -> g.cn(salva 6 byte; non sono sicuro del perché funzioni ancora, ma sembra che funzioni ancora nel 20170424)
tsh

3
I suggerimenti di ricerca non sono diversi per utenti e regioni diversi? Non credo che avere casi di test standard funzioni davvero per questo.
MrZander

Risposte:


8

Zsh + coreutils + w3m, 88 71 68 byte

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

Il passaggio da Bash a Zsh ha salvato 3 byte.

Grazie a @FatalMerlin per l'URL più breve, risparmiando 17 byte!

Esecuzione del campione

$ 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
Di tutte le cose, perché "rendere melma" il primo suggerimento? Quante persone là fuori fanno melma mentre parliamo?
MildlyMilquetoast,

27
Nessun indizio. Era come aumentare il tuo QI mangiando bambini di talento per un po ', quindi lo considero un miglioramento.
Dennis,

Dang, adoro w3m. Mi permette di navigare senza distrazioni ed è semplicemente abbastanza bello.
ckjbgames

1
@MistahFiggins Blame Minecraft per quello.
JakeSteam,

@MistahFiggins Forse tutti vogliono solo make(1) melma .
Arminius,

12

Vim 8 + unimpaired.vim , 93 89 85 70 73 71 byte

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

Come bonus, gli ultimi byte sembrano farti l'occhiolino ;DDal momento che contiene caratteri non stampabili, la spiegazione contiene sostituzioni (e ho sostituito la parte pre-querystring dell'URL con [url], per brevità):

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

Per quanto riguarda l'esecuzione, funziona bene se lo salvi su un file chiamato scripted esegui vim -s script input.txtalmeno su macOS. Non funziona se aggiungi -u NONE, ma funziona bene se il mio .vimrcè vuoto. Suppongo che stia usando qualcosa dal sistema .vimrcper far funzionare l'URL. Ciò significa, tuttavia, che non funziona in V, quindi nessun collegamento TIO.

Alcuni altri casi di test:

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

Quello di cui ho davvero bisogno è un modo per aprire un URL con spazi all'interno. Sostituirli con i +primi è semplicemente troppi byte!


1
lo spazio dovrebbe essere sostituito dal segno più +?
TSH

1
@tsh hai ragione! Ora qualcuno mi dice come posso salvare 2 byte e battere Dennis :)
Brian McCutchon

per far funzionare netrw è necessariofiletype plugin on
tbodt

1
È possibile incollare il "registro (impostazione predefinita) nella modalità di inserimento / comando facendo <Cr>". È possibile radere alcuni byte facendo :r [url]?client=opera&q=^R"invece di q:ir [url]?client=opera&q=<esc>p. ^Rè il byte effettivo inviato quando si preme <Cr>, non i tasti ^e Rinsieme, quindi conta solo come un byte.
Ian Emnace,

1
Quando conto i byte ottengo 88. Inoltre puoi salvare i byte cambiando l'URL in http://google.com/complete/search?client=hp&q=your_query( client=gma=> JSON semplice e testo più corto.).
FatalMerlin

7

Python + richieste 121 117 103 byte

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

5

JavaScript, 109 byte

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

Promise, devi amarlo, ma l'uomo è prolisso! Questa risposta utilizza fetch()un'API di recupero basata sulla promessa presente nei browser moderni. Promette di lavorare stabilendo gestori per le azioni asincrone all'inizio, come i callback, ma meglio. Il.then() prende una funzione che verrà chiamata con il risultato dell'azione asincrona. .then(r=>r.json())utilizza il .json()metodo di risposta per convertire l'array di testo in una variabile manipolabile, il secondo .then()estrae semplicemente la prima risposta.

Uso:

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])Divertiti con 11 caratteri in meno ;-)
Stephan Bijzitter il

Ho provato in Firefox 52 e Chrome 57, in questa pagina, nella home page di Google, e su: vuoto, e continuo a ricevere errori CORS. Hai ottenuto per funzionare con successo?
ETHproductions

@ETHproductions Sì, ci sono problemi CORS, è necessario eseguire sul dominio suggestqueries.google.com
MayorMonty

@StephanBijzitter .json()restituisce una promessa, è asincrona, per qualche motivo
MayorMonty

In effetti funziona lì, grazie!
ETHproductions

1

C #, 192 112 111 byte

80 byte salvati grazie a @TheLethalCoder. Grazie per aver riformattato il mio codice, non sapevo che fosse permesso lasciare solo il corpo della classe e del metodo circostante :)

Salvato un altro byte sostituendolo gmahpHa con , poiché non ha importanza per l'analisi e c'è solo un po 'incomprensibile davanti al corpo della risposta.

Ho letteralmente costretto l'API a trovare gmae hp.

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

1

Groovy, 122 byte

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

Fondamentalmente:

  1. Ottieni il testo dall'end-point.

  2. Rimuovere la parte con le parentesi alla fine, questa non è sintassi valida.

  3. Analizzare il bit rimanente come un array groovy.

  4. Prendi il secondo elemento dell'array dei risultati.

inserisci qui la descrizione dell'immagine


1

PowerShell, 133 115 byte

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

Esecuzione del campione

Riga di comando CMD di Windows:

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

Console di PowerShell:

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

1

R, 111 byte

Molto tempo dall'ultima volta che sono venuto qui ma ho provato:

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

Utilizzo del pacchetto jsonliteper convertire la stringa recuperata dareadLines() in un oggetto elenco.

Successivamente estrai il secondo elemento, ad es. (Dà un avvertimento che non dobbiamo preoccuparci):

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

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

Versione completa e formattata:

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

Grazie per il suggerimento sulla partenza del Method and Class Body!
FatalMerlin,
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.