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


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

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!


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]

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

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];

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


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]}

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'

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

Obrigado pela dica sobre deixar o método e o corpo da classe!
— FatalMerlin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.