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'?)

Це , тож може виграти найкоротший код і процвітати найкращий програміст ...


3
Я б стандартизував ім'я клієнта, щоб зробити це справедливим
— Beta Decay

7
Чому сувора URL-адреса? Доки використовується sugqueries.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 Винен у цьому Minecraft.
— JakeSteam

@MistahFiggins Можливо, вони просто хочуть make(1) слиз .
— Арміній

12

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

  • -4 байти завдяки tsh
  • -2 байти завдяки Ian Emnace
  • -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, він не працює, але працює добре, якщо мій .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

2
.then(r=>r.json()).then(r=>r[1][0])-> .then(r=>r.json()[1][0])Насолоджуйтесь на 11 символів менше ;-)
— Stephan Bijzitter

Я намагався в Firefox 52 та Chrome 57, на цій сторінці, домашній сторінці Google, і про: blank, і я просто отримую помилки CORS. Ви змусили його успішно працювати?
— ETHproductions

@ETHproductions Так, виникають проблеми з CORS, їх потрібно виконати на домені predlagaqueries.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];

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. Проаналізуйте залишився біт як матовий масив.

  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'

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

Дякуємо за підказку про залишення методики та класу!
— FatalMerlin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.