Diversão do preenchimento automático do Google

16

Sua tarefa é criar um programa que, com uma sequência de entrada, produza o primeiro resultado de preenchimento automático do Google para essa pesquisa. O formato da entrada / saída é com você.

Regras

  1. Seu programa deve receber 1 entrada, uma sequência e gerar o resultado principal das sugestões de preenchimento automático / preenchimento automático do Google. O formato da entrada / saída é com você. Apenas certifique-se de mencionar qual é o seu formato de E / S.
  2. Obviamente, é permitido acessar a Internet.
  3. Os encurtadores de URL (como bit.ly, TinyURL etc.) são estritamente proibidos . Você deve buscar seus resultados de preenchimento automático neste 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 . Você tem permissão para assumir qualquer nome de navegador (ou string, nesse caso) client. No programa que escrevi , assumo o Chrome. Qualquer nome ou string do navegador deve funcionar. Você tem permissão para passar quaisquer opções para a página da Web, desde que esteja usando alguma variante do http://suggestqueries.google.com/complete/search .
  4. Forneça uma explicação de como seu programa funciona. Não é obrigatório, mas eu recomendo fortemente.
  5. Todas as brechas padrão são estritamente proibidas .

Casos de teste

Eles estão constantemente mudando; portanto, edite esta postagem se ela estiver desatualizada.

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

Este é o , para que o código mais curto ganhe e o melhor programador prospere ...

ckjbgames
fonte
3
Eu padronizaria o nome de um cliente, para torná-lo justo.
Decay Beta 23/04
7
Por que o URL estrito? Desde que sugestãoqueries.google.com seja usada, sem nenhum encurtador de URL, não vejo problemas.
Dennis
Em particular, se pudermos usar output=toolbar, não precisamos especificar um cliente.
Dennis
2
@ mınxomaτ mas por que não https -> http(salvar 1 byte), remover www.(salvar 4 bytes), google.com -> google.us(salvar 1 byte) ou até mesmo google.com -> g.cn(salvar 6 bytes; não sei por que isso ainda funciona, mas parece que ainda está funcionando em 20170424)
TSH
3
As sugestões de pesquisa não são diferentes para diferentes usuários e regiões? Eu não acho que ter casos de teste padrão realmente funcione para isso.
precisa saber é o seguinte

Respostas:

8

Zsh + coreutils + w3m, 88 71 68 bytes

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

Mudar de Bash para Zsh economizou 3 bytes.

Obrigado a @FatalMerlin pelo URL mais curto, economizando 17 bytes!

Amostra de execução

$ 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
fonte
3
De todas as coisas, por que "tornar o lodo" a primeira sugestão? Quantas pessoas estão por aí fazendo lodo enquanto falamos?
MildlyMilquetoast
27
Nenhuma pista. Era como aumentar seu QI comendo crianças superdotadas por um tempo, então consideraria isso uma melhoria.
Dennis19 /
Dang, eu amo w3m. Isso permite que eu navegue sem distrações e é bem legal.
Ckjbgames
1
@MistahFiggins Culpa o Minecraft por isso.
precisa saber é o seguinte
@MistahFiggins Talvez todos eles só querem make(1) lodo .
Arminius
12

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

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

Como bônus, os últimos bytes parecem estar piscando para você. ;DComo contém caracteres não imprimíveis, a explicação contém substituições (e substituímos a parte da URL da pré-consulta por [url], por questões de brevidade):

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

No que diz respeito à execução, funciona bem se você salvá-lo em um arquivo chamado scripte executado vim -s script input.txtno macOS, pelo menos. Não funciona se você adicionar -u NONE, mas funciona bem se o meu .vimrcestiver vazio. Suponho que ele esteja usando algo do sistema .vimrcpara fazer o material da URL funcionar. Isso significa, no entanto, que ele não funciona em V, portanto, nenhum link TIO.

Mais alguns casos de teste:

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

O que eu realmente preciso é de uma maneira de abrir uma URL com espaços nela. Substituí-los por +primeiro é apenas muitos bytes!

Brian McCutchon
fonte
1
o espaço deve ser substituído pelo sinal de mais +?
TSH
1
@tsh Você está certo! Agora alguém me dizer como posso salvar 2 bytes e bateu Dennis :)
Brian McCutchon
para netrw de trabalho que você precisafiletype plugin on
tbodt
1
Você pode colar o "registrador (padrão) no modo de inserção / comando executando <Cr>". Você pode economizar alguns bytes fazendo isso em :r [url]?client=opera&q=^R"vez de q:ir [url]?client=opera&q=<esc>p. ^Ré o byte real enviado quando você pressiona <Cr>, não as teclas ^e Rjuntos, portanto, conta apenas como um byte.
Ian Emnace
1
Quando conto os bytes , obtenho 88. Além disso, você pode salvar os bytes alterando a URL para http://google.com/complete/search?client=hp&q=your_query( client=gma=> JSON sem formatação e texto mais curto.).
FatalMerlin
7

Python + solicita 121 117 103 bytes

from requests import*
lambda s:get("http://google.com/complete/search?client=gma&q="+s).json()[1][0][0]
ovs
fonte
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, você tem que amar, mas o homem é detalhado! Esta resposta usa fetch()uma API de busca baseada em promessa, presente em navegadores modernos. As promessas funcionam estabelecendo manipuladores para ações assíncronas no início, como retornos de chamada, mas melhor. O .then()assume uma função que será chamada com o resultado da ação assíncrona. .then(r=>r.json())usa o .json()método de resposta para converter a matriz de texto em uma variável manipulável, a segunda .then()apenas puxa a primeira resposta.

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
MayorMonty
fonte
2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Desfrute de 11 caracteres menos ;-)
Stephan Bijzitter
Eu tentei no Firefox 52 e Chrome 57, nesta página, a página inicial do Google e sobre: ​​blank, e continuo recebendo erros de CORS. Você conseguiu que funcionasse com sucesso?
ETHproductions
@ETHproductions Sim, há problemas de CORS, você deve executar no domínio sugestãoqueries.google.com
MayorMonty 24/04/19
@StephanBijzitter .json()retorna uma promessa, é assíncrona, por algum motivo
MayorMonty
Na verdade, funciona lá, obrigado!
ETHproductions
1

C #, 192 112 111 bytes

Economizou 80 bytes graças a @TheLethalCoder. Obrigado por reformatar meu código, eu não sabia que era permitido deixar de fora o corpo de classe e método circundante :)

Salve outro Byte substituindo gmapor hp, pois isso não importa para a análise e há apenas algumas bobagens antes do corpo da resposta.

Eu literalmente forcei a API a encontrar gmae hp.

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

Groovy, 122 bytes

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

Basicamente:

  1. Obtenha o texto do ponto final.

  2. Remova a peça com os colchetes no final, isso não é uma sintaxe válida.

  3. Analise o bit restante como uma matriz groovy.

  4. Pegue o segundo elemento da matriz de resultados.

insira a descrição da imagem aqui

Urna de polvo mágico
fonte
1

PowerShell, 133 115 bytes

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

Amostra de execução

Linha de comando do 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 do PowerShell:

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

R, 111 bytes

Muito tempo desde a última vez que vim aqui, mas tentei:

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

Usando o pacote jsonlitepara converter a string buscada readLines()em um objeto de lista.

Em seguida, extraia o segundo elemento, por exemplo (emite um aviso que não precisamos nos preocupar):

> 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
fonte
0

C #, 127 bytes

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

Versão completa e formatada:

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
fonte
Obrigado pela dica sobre deixar o método e o corpo da classe!
FatalMerlin