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.