Google Autocomplete Fun

16

Ваша задача - создать программу, которая с учетом введенной строки выведет первый результат автозаполнения Google для этого поиска. Формат ввода / вывода зависит от вас.

правила

  1. Ваша программа должна взять 1 ввод, строку и вывести верхний результат предложений автозаполнения / автозаполнения Google. Формат ввода / вывода зависит от вас. Просто обязательно укажите, какой у вас формат ввода / вывода.
  2. Очевидно, что доступ в Интернет разрешен.
  3. Сокращения URL (например, bit.ly, TinyURL и т. Д.) Строго запрещены . Вы должны получить результаты автозаполнения с этого URL: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query или http://google.com/complete/search?client=your_browser&q=your_query . Вам разрешено принимать любое имя браузера (или строку, если на то пошло) для client. В программе, которую я написал , я предполагаю, что Chrome. Любое имя браузера или строка должны работать. Вам разрешается передавать любые параметры на веб-страницу, если вы используете какой-либо вариант http://suggestqueries.google.com/complete/search .
  4. Пожалуйста, объясните, как работает ваша программа. Это не обязательно, но я настоятельно советую это.
  5. Все стандартные лазейки строго запрещены .

Тестовые случаи

Они постоянно меняются, поэтому отредактируйте этот пост, если он устарел.

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

Это , так что может победить самый короткий код и лучший программист ...

ckjbgames
источник
3
Я бы стандартизировал имя клиента, чтобы оно было честным
Beta Decay,
7
Почему строгий URL? Пока используется offerqueries.google.com, без каких-либо укорачивателей URL, я не вижу никаких проблем.
Деннис
В частности, если мы можем использовать output=toolbar, нам не нужно указывать клиента вообще.
Деннис
2
@ mınxomaτ, но почему бы и нет https -> http(сохранить 1 байт), удалить www.(сохранить 4 байта), google.com -> google.us(сохранить 1 байт) или даже google.com -> g.cn(сохранить 6 байт; я не уверен, почему это все еще работает, но кажется, что оно все еще работает в 20170424)
TSH
3
Разве поисковые предложения не отличаются для разных пользователей и регионов? Я не думаю, что наличие стандартных тестовых случаев действительно работает для этого.
MrZander

Ответы:

8

Zsh + coreutils + w3m, 88 71 68 байт

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

Переключение с Bash на Zsh позволило сэкономить 3 байта.

Спасибо @FatalMerlin за более короткий URL, сэкономив 17 байт!

Пробный прогон

$ 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
Почему «сделать слизь» первым предложением? Сколько людей там делают слизь, когда мы говорим?
MildlyMilquetoast
27
Понятия не имею. Это было то, как поднять свой iq, съев немного одаренных детей , так что я бы посчитал это улучшением.
Деннис
Черт, я люблю w3m. Это позволяет мне просматривать без отвлекающих факторов, и это очень круто.
ckjbgames
1
@MistahFiggins Винить Майнкрафт в этом.
JakeSteam
@MistahFiggins Может быть, они все просто хотят make(1) слизи .
Арминий
12

Vim 8 + unimpaired.vim , 93 89 85 70 73 71 байт

  • -4 байта благодаря тш
  • -2 байта благодаря Яну Эмнасу
  • -2 байта благодаря FatalMerlin
  • -1 байт благодаря tsh / ckjbgames
:s/ /+/g
D:e http://google.us/complete/search?client=gma&q="
d3f";D]yy

В качестве бонуса последние байты выглядят так, будто они подмигивают вам. ;DТак как в нем содержатся непечатаемые символы, объяснение содержит подстановки ( [url]для краткости я заменил часть URL-адреса, предшествующую строке запроса , для краткости):

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

Что касается запуска, то он работает нормально, если вы сохраните его в файле с именем scriptи vim -s script input.txtпо крайней мере на MacOS. Это не сработает, если вы добавите -u NONE, но работает нормально, если my .vimrcпусто. Я предполагаю, что он использует что-то из системы, .vimrcчтобы заставить вещи URL работать. Это означает, однако, что он не работает в V, поэтому нет ссылки TIO.

Еще несколько тестов:

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

Что мне действительно нужно, так это способ открыть URL с пробелами в нем. Замена их +первым - это слишком много байтов!

Брайан Маккатон
источник
1
следует ли заменить пробел знаком плюс +?
TSH
1
@tsh Ты прав! Теперь кто-нибудь скажет мне, как я могу сохранить 2 байта и победить Денниса :)
Брайан МакКатчон
для работы netrw вам нужноfiletype plugin on
tbodt
1
Вы можете вставить «регистр (по умолчанию) в режиме вставки / команды, выполнив <Cr>». Вы можете сбрить несколько байтов, выполнив :r [url]?client=opera&q=^R"вместо q:ir [url]?client=opera&q=<esc>p. ^Rэто фактический байт, отправленный при нажатии клавиши <Cr>, а не клавиши ^и все Rвместе, поэтому он считается только одним байтом.
Ян Эмнас
1
Когда я подсчитываю байты, я получаю 88. Также вы можете сохранить байты, изменив URL на http://google.com/complete/search?client=hp&q=your_query( client=gma=> Простой JSON и более короткий текст.).
FatalMerlin
5

JavaScript, 109 байт

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

Promise, ты должен любить это, но человек это многословно! В этом ответе используется fetch()API извлечения на основе обещаний, присутствующий в современных браузерах. Обещания работают, устанавливая обработчики для асинхронных действий в начале, таких как обратные вызовы, но лучше. .then()Принимает функцию , которая будет вызываться в результате действий асинхронных. .then(r=>r.json())использует .json()метод ответа для преобразования текстового массива в управляемую переменную, второй .then()просто извлекает первый ответ.

Использование:

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
источник
2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Наслаждайтесь на 11 символов меньше ;-)
Stephan Bijzitter
Я пробовал в Firefox 52 и Chrome 57, на этой странице, на главной странице Google, и about: blank, и я просто продолжаю получать ошибки CORS. Вы добились успеха?
ETHproductions
@ETHproductions Да, есть проблемы с CORS, вы должны выполнить их на домене offerqueries.google.com
MayorMonty
@StephanBijzitter .json()возвращает Обещание, по какой-то причине оно асинхронное
MayorMonty
Это действительно работает, спасибо!
ETHproductions
1

C #, 192 112 111 байт

Сохранено 80 байт благодаря @TheLethalCoder. Спасибо за переформатирование моего кода, я не знал, что было разрешено просто оставить без внимания окружающее тело класса и метода :)

Сохранил другой байт, заменив gmaего hp, так как это не имеет значения для разбора, и перед телом ответа есть лишь некоторая тарабарщина.

Я в буквальном смысле грубо заставил API найти gmaи hp.

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

Groovy, 122 байта

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

В принципе:

  1. Получить текст с конечной точки.

  2. Удалите деталь с квадратными скобками в конце, это неверный синтаксис.

  3. Разобрать оставшийся бит как массив Groovy.

  4. Возьмите второй элемент массива результатов.

введите описание изображения здесь

Урна волшебного осьминога
источник
1

PowerShell, 133 115 байт

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

Пробный прогон

Командная строка Windows CMD:

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

Консоль PowerShell:

'code golf l'|%{([net.webclient]::new().downloadstring("http://google.com/complete/search?client=gma&q=$_")|convertfrom-json)[1][0]}
Андрей Одегов
источник
1

R 111 байтов

С тех пор, как я в последний раз приезжал сюда, но давал ему шанс:

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

Использование пакета jsonliteдля преобразования выбранной строки readLines()в объект списка.

Затем извлеките второй элемент, например (дает предупреждение, что нам не нужно заботиться):

> 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
источник
0

C #, 127 байт

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

Полная и отформатированная версия:

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
источник
Спасибо за подсказку об уходе из метода и тела класса!
FatalMerlin