Google Autocomplete Fun

16

Su tarea es crear un programa que, dada una cadena de entrada, generará el primer resultado de autocompletado de Google para esa búsqueda. El formato de entrada / salida depende de usted.

Reglas

  1. Su programa debe tomar 1 entrada, una cadena y generar el resultado principal de sugerencias de autocompletado / autocompletado de Google. El formato de entrada / salida depende de usted. Solo asegúrese de mencionar cuál es su formato de E / S.
  2. Obviamente, el acceso a Internet está permitido.
  3. Los acortadores de URL (como bit.ly, TinyURL, etc.) están estrictamente prohibidos . Debe obtener sus resultados de autocompletar de esta 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 . Se le permite asumir cualquier nombre de navegador (o cadena, para el caso) para client. En el programa que escribí , supongo que Chrome. Cualquier nombre o cadena del navegador debería funcionar. Puede pasar cualquier opción a la página web siempre que utilice alguna variante de http://suggestqueries.google.com/complete/search .
  4. Proporcione una explicación de cómo funciona su programa. No es obligatorio, pero lo recomiendo encarecidamente.
  5. Todas las lagunas estándar están estrictamente prohibidas .

Casos de prueba

Estos están cambiando constantemente, así que edite esta publicación si no están actualizados.

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

Este es el , por lo que puede ganar el código más corto y prosperar el mejor programador ...

ckjbgames
fuente
3
Estandarizaría el nombre de un cliente, para hacerlo justo
Decaimiento Beta
77
¿Por qué la URL estricta? Mientras se utilice sugerencia.google.com, sin acortadores de URL, no veo ningún problema.
Dennis
En particular, si podemos usar output=toolbar, no tenemos que especificar un cliente en absoluto.
Dennis
2
@ mınxomaτ pero por qué no https -> http(guardar 1 byte), eliminar www.(guardar 4 bytes), google.com -> google.us(guardar 1 byte) o incluso google.com -> g.cn(guardar 6 bytes; no estoy seguro de por qué esto todavía funciona, pero parece que todavía funciona en 20170424)
tsh
3
¿Las sugerencias de búsqueda no son diferentes para diferentes usuarios y regiones? No creo que tener casos de prueba estándar realmente funcione para esto.
MrZander

Respuestas:

8

Zsh + coreutils + w3m, 88 71 68 bytes

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

Cambiar de Bash a Zsh ahorró 3 bytes.

¡Gracias a @FatalMerlin por la URL más corta, ahorrando 17 bytes!

Ejecución de la muestra

$ 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
Dennis
fuente
3
De todas las cosas, ¿por qué "hacer limo" es la primera sugerencia? ¿Cuántas personas hay afuera haciendo limo mientras hablamos?
MildlyMilquetoast
27
Ninguna pista. Fue cómo elevar su coeficiente intelectual comiendo niños superdotados durante un tiempo, por lo que consideraría esto una mejora.
Dennis
Dang, me encanta w3m. Me permite navegar sin distracciones y es genial.
ckjbgames
1
@MistahFiggins Culpa a Minecraft por eso.
JakeSteam
@MistahFiggins Tal vez todos solo quieren make(1) limo .
Arminio
12

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

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

Como beneficio adicional, los últimos bytes parecen que le están guiñando el ojo. ;DDado que esto contiene caracteres que no se imprimen, la explicación contiene sustituciones (y he reemplazado la parte de la url previa a la consulta con [url], por brevedad):

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

En cuanto a la ejecución, funciona bien si la guarda en un archivo llamado scripty se ejecuta convim -s script input.txt macOS, al menos. No funciona si agrega -u NONE, pero funciona bien si mi .vimrcestá vacío. Supongo que está usando algo del sistema .vimrcpara hacer que las URL funcionen. Esto significa, sin embargo, que no funciona en V, por lo que no hay enlace TIO.

Algunos casos de prueba más:

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

Lo que realmente necesito es una forma de abrir una URL con espacios en ella. ¡Reemplazarlos por +primero es demasiados bytes!

Brian McCutchon
fuente
1
¿Debe reemplazarse el espacio con un signo más +?
tsh
1
@tsh Tienes razón! Ahora alguien me dice cómo puedo guardar 2 bytes y vencer a Dennis :)
Brian McCutchon
para que netrw trabaje lo que necesitafiletype plugin on
tbodt
1
Puede pegar el "registro (predeterminado) en modo de inserción / comando haciendo <Cr>". Puede reducir algunos bytes haciendo en :r [url]?client=opera&q=^R"lugar de q:ir [url]?client=opera&q=<esc>p. ^Res el byte real enviado cuando presiona <Cr>, no las teclas ^y Rjuntas, por lo que solo cuenta como un byte.
Ian Emnace
1
Cuando cuento los bytes obtengo 88. También puede guardar bytes cambiando la URL a http://google.com/complete/search?client=hp&q=your_query( client=gma=> JSON simple y texto más corto).
FatalMerlin
7

Python + solicitudes 121 117 103 bytes

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

JavaScript, 109 bytes

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

Promise, tienes que amarlo, pero hombre, ¡es detallado! Esta respuesta utiliza fetch(), una API de recuperación basada en promesas presente en los navegadores modernos. Las promesas funcionan al establecer controladores para acciones asíncronas al principio, como devoluciones de llamada, pero mejor. La .then()toma una función que será llamada con el resultado de la acción asíncrona. .then(r=>r.json())utiliza el .json()método de respuesta para convertir la matriz de texto en una variable manipulable, el segundo .then()simplemente extrae la primera respuesta.

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
AlcaldeMonty
fuente
2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Disfruta de 11 caracteres menos ;-)
Stephan Bijzitter
Lo he intentado en Firefox 52 y Chrome 57, en esta página, en la página de inicio de Google, y sobre: ​​en blanco, y sigo recibiendo errores CORS. ¿Lo has conseguido para funcionar con éxito?
ETHproductions
@ETHproductions Sí, hay problemas de CORS, debe ejecutar en el dominio sugierequeries.google.com
MayorMonty
@StephanBijzitter .json()devuelve una promesa, es asíncrono, por alguna razón
MayorMonty
De hecho funciona allí, gracias!
ETHproductions
1

C #, 192 112 111 Bytes

Ahorró 80 bytes gracias a @TheLethalCoder. Gracias por volver a formatear mi código, no sabía que estaba permitido dejar de lado el cuerpo de clase y método circundante :)

Se guardó otro byte al reemplazar gma porhp , ya que no importa para el análisis y solo hay algunas tonterías ante el cuerpo de respuesta.

Literalmente forcé brutalmente a la API a encontrar gmay hp.

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

Groovy, 122 bytes

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

Básicamente:

  1. Obtenga el texto desde el punto final.

  2. Elimine la parte con los corchetes al final, esta no es una sintaxis válida.

  3. Analiza el bit restante como una matriz maravillosa.

  4. Agarra el segundo elemento de la matriz de resultados.

ingrese la descripción de la imagen aquí

Urna de pulpo mágico
fuente
1

PowerShell, 133115 bytes

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

Ejecución de la muestra

Línea de comando CMD de Windows:

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

Consola PowerShell:

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

R, 111 bytes

Mucho tiempo desde la última vez que vine aquí, pero intentándolo:

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

Usar el paquete jsonlitepara convertir la cadena obtenida readLines()en un objeto de lista.

Posteriormente extraiga el segundo elemento, por ejemplo (da una advertencia de que no tenemos que preocuparnos):

> 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'
Billywob
fuente
0

C #, 127 bytes

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

Versión completa y formateada:

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();
}
TheLethalCoder
fuente
¡Gracias por la pista sobre dejar el Método y el Cuerpo de Clase!
FatalMerlin