Amusement de saisie semi-automatique Google

16

Votre tâche consiste à créer un programme qui, étant donné une chaîne d'entrée, produira le premier résultat de saisie semi-automatique de Google pour cette recherche. Le format des entrées / sorties dépend de vous.

Règles

  1. Votre programme doit prendre 1 entrée, une chaîne et produire le résultat principal des suggestions de saisie semi-automatique / de remplissage automatique de Google. Le format des entrées / sorties dépend de vous. N'oubliez pas de mentionner votre format d'E / S.
  2. De toute évidence, l'accès à Internet est autorisé.
  3. Les raccourcisseurs d'URL (comme bit.ly, TinyURL, etc.) sont strictement interdits . Vous devez récupérer vos résultats de saisie semi-automatique à partir de cette URL: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query ou http://google.com/complete/search?client=your_browser&q=your_query . Vous êtes autorisé à assumer n'importe quel nom de navigateur (ou chaîne, d'ailleurs) pour client. Dans le programme que j'ai écrit , je suppose que Chrome. Tout nom ou chaîne de navigateur devrait fonctionner. Vous êtes autorisé à transmettre toutes les options à la page Web tant que vous utilisez une variante de http://suggestqueries.google.com/complete/search .
  4. Veuillez expliquer le fonctionnement de votre programme. Ce n'est pas obligatoire, mais je le conseille vivement.
  5. Toutes les failles standard sont strictement interdites .

Cas de test

Celles-ci changent constamment, alors modifiez ce message si elles deviennent obsolètes.

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

C'est du , alors que le code le plus court gagne et que le meilleur programmeur prospère ...

ckjbgames
la source
3
Je voudrais normaliser un nom de client, pour le rendre juste
Beta Decay
7
Pourquoi l'URL stricte? Tant que suggestqueries.google.com est utilisé, sans raccourcisseur d'URL, je ne vois aucun problème.
Dennis
En particulier, si nous pouvons utiliser output=toolbar, nous n'avons pas du tout besoin de spécifier un client.
Dennis
2
@ mınxomaτ mais pourquoi pas https -> http(enregistrer 1 octet), supprimer www.(enregistrer 4 octets), google.com -> google.us(enregistrer 1 octet) ou même google.com -> g.cn(enregistrer 6 octets; je ne sais pas pourquoi cela fonctionne toujours, mais il semble que cela fonctionne toujours en 20170424)
tsh
3
Les suggestions de recherche ne sont-elles pas différentes selon les utilisateurs et les régions? Je ne pense pas que les scénarios de test standard fonctionnent vraiment pour cela.
MrZander

Réponses:

8

Zsh + coreutils + w3m, 88 71 68 octets

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

Le passage de Bash à Zsh a permis d'économiser 3 octets.

Merci à @FatalMerlin pour l'URL plus courte, économisant 17 octets!

Exemple d'exécution

$ 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
la source
3
De toutes choses, pourquoi "faire de la boue" la première suggestion? Combien de personnes font de la boue en ce moment?
MildlyMilquetoast
27
Aucune idée. C'était comment élever votre QI en mangeant des enfants doués pendant un certain temps, donc je considérerais cela comme une amélioration.
Dennis
Dang, j'adore w3m. Cela me permet de naviguer sans distractions et c'est tout simplement assez cool.
ckjbgames
1
@MistahFiggins Blame Minecraft pour celui-là.
JakeSteam
@MistahFiggins Peut-être qu'ils veulent tous simplement make(1) slime .
Arminius
12

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

  • -4 octets grâce à tsh
  • -2 octets grâce à Ian Emnace
  • -2 octets grâce à FatalMerlin
  • -1 octet grâce à tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

En prime, les derniers octets semblent vous faire un clin d' ;Dœil.Comme cela contient des caractères non imprimables, l'explication contient des substitutions (et j'ai remplacé la partie pré-requête de l'url par [url], pour plus de brièveté):

: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 ce qui concerne l'exécution, cela fonctionne très bien si vous l'enregistrez dans un fichier nommé scriptet exécuté avec vim -s script input.txtau moins sur macOS. Cela ne fonctionne pas si vous ajoutez -u NONE, mais cela fonctionne très bien si my .vimrcest vide. Je suppose qu'il utilise quelque chose du système .vimrcpour faire fonctionner les trucs URL. Cela signifie cependant que cela ne fonctionne pas en V, donc pas de lien TIO.

Quelques cas de test supplémentaires:

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

Ce dont j'ai vraiment besoin, c'est d'un moyen d'ouvrir une URL avec des espaces. Les remplacer par le +premier est tout simplement trop d'octets!

Brian McCutchon
la source
1
l'espace doit-il être remplacé par le signe plus +?
tsh
1
@tsh Vous avez raison! Maintenant, quelqu'un me dit comment je peux économiser 2 octets et battre Dennis :)
Brian McCutchon
pour que netrw fonctionne, vous avez besoinfiletype plugin on
tbodt
1
Vous pouvez coller le "registre (par défaut) en mode insertion / commande en faisant <Cr>". Vous pouvez raser quelques octets en faisant :r [url]?client=opera&q=^R"au lieu de q:ir [url]?client=opera&q=<esc>p. ^Rest l'octet réel envoyé lorsque vous appuyez sur <Cr>, pas sur les touches ^et Rensemble, il ne compte donc que pour un octet.
Ian Emnace
1
Lorsque je compte les octets, j'obtiens 88. Vous pouvez également enregistrer des octets en changeant l'URL en http://google.com/complete/search?client=hp&q=your_query( client=gma=> JSON ordinaire et texte plus court.).
FatalMerlin
7

Python + demande 121 117 103 octets

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

JavaScript, 109 octets

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

Promise, tu dois l'aimer, mais l'homme est-il verbeux! Cette réponse utilise fetch()une API de récupération basée sur les promesses présente dans les navigateurs modernes. Les promesses fonctionnent en établissant des gestionnaires pour les actions asynchrones au début, comme les rappels, mais en mieux. La .then()prend une fonction qui sera appelée avec le résultat de l'action async. .then(r=>r.json())utilise la .json()méthode de réponse pour convertir le tableau de texte en une variable manipulable, la seconde .then()extrait simplement la première réponse.

Usage:

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
MayorMonty
la source
2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Profitez de 11 caractères de moins ;-)
Stephan Bijzitter
J'ai essayé dans Firefox 52 et Chrome 57, sur cette page, la page d'accueil de Google, et sur: vide, et je continue de recevoir des erreurs CORS. L'avez-vous réussi à fonctionner?
ETHproductions
@ETHproductions Oui, il y a des problèmes CORS, vous devez exécuter sur le domaine suggestqueries.google.com
MayorMonty
@StephanBijzitter .json()retourne une promesse, c'est asynchrone, pour une raison quelconque
MayorMonty
En effet cela fonctionne là-bas, merci!
ETHproductions
1

C #, 192 112 111 Octets

80 octets enregistrés grâce à @TheLethalCoder. Merci d'avoir reformaté mon code, je ne savais pas qu'il était autorisé de laisser de côté le corps de classe et de méthode environnant :)

Enregistré un autre octet en le remplaçant gmapar hp, car cela n'a pas d'importance pour l'analyse et il y a juste du charabia devant le corps de la réponse.

J'ai littéralement contraint brutalement l'API à trouver gmaet hp.

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

Groovy, 122 octets

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

Fondamentalement:

  1. Obtenez le texte du point final.

  2. Supprimez la partie avec les crochets à la fin, ce n'est pas une syntaxe valide.

  3. Analyser le bit restant comme un tableau groovy.

  4. Saisissez le deuxième élément du tableau de résultats.

entrez la description de l'image ici

Urne de poulpe magique
la source
1

PowerShell, 133 115 octets

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

Exemple d'exécution

Ligne de commande Windows CMD:

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

Console PowerShell:

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

R, 111 octets

Cela fait longtemps que je ne suis pas venu ici pour la dernière fois, mais j'ai essayé:

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

Utilisation du package jsonlitepour convertir la chaîne récupérée readLines()en un objet liste.

Extraire ensuite le deuxième élément, par exemple (donne un avertissement dont nous n'avons pas à nous soucier):

> 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
la source
0

C #, 127 octets

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

Version complète et formatée:

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
la source
Merci pour la suggestion de quitter le corps de méthode et de classe!
FatalMerlin