Google Tự động hoàn thành


16

Nhiệm vụ của bạn là tạo một chương trình, với một chuỗi đầu vào, sẽ đưa ra kết quả tự động hoàn thành đầu tiên của Google cho tìm kiếm đó. Các định dạng của đầu vào / đầu ra là tùy thuộc vào bạn.

Quy tắc

  1. Chương trình của bạn phải nhận 1 đầu vào, một chuỗi và xuất kết quả đề xuất tự động điền / tự động điền hàng đầu của Google. Các định dạng của đầu vào / đầu ra là tùy thuộc vào bạn. Chỉ cần chắc chắn đề cập đến định dạng I / O của bạn là gì.
  2. Rõ ràng, truy cập Internet được cho phép.
  3. Các công cụ rút ngắn URL (như bit.ly, TinyURL, v.v.) không được phép . Bạn nên tìm nạp kết quả tự động hoàn thành của mình từ URL này: http://suggestqueries.google.com/complete/search?client=your_browser&q=your_query hoặc http://google.com/complete/search?client=your_browser&q=your_query . Bạn được phép giả sử bất kỳ tên trình duyệt (hoặc chuỗi, cho vấn đề đó) cho client. Trong chương trình tôi đã viết , tôi giả sử Chrome. Bất kỳ tên trình duyệt hoặc chuỗi nên hoạt động. Bạn được phép chuyển bất kỳ tùy chọn nào cho trang web miễn là bạn đang sử dụng một số biến thể của http://suggestqueries.google.com/complete/search .
  4. Vui lòng cung cấp một lời giải thích về cách chương trình của bạn hoạt động. Nó không bắt buộc, nhưng tôi khuyên bạn nên nó.
  5. Tất cả các sơ hở tiêu chuẩn đều bị nghiêm cấm .

Các trường hợp thử nghiệm

Chúng liên tục thay đổi, vì vậy hãy chỉnh sửa bài đăng này nếu những thứ này trở nên lỗi thời.

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

Đây là , vì vậy có thể đoạn mã ngắn nhất sẽ thắng và người lập trình giỏi nhất ...


3
Tôi sẽ chuẩn hóa một tên khách hàng, để làm cho nó công bằng
Beta Decay

7
Tại sao URL nghiêm ngặt? Miễn là suggestqueries.google.com được sử dụng, không có bất kỳ công cụ rút ngắn URL nào, tôi không thấy bất kỳ vấn đề nào.
Dennis

Đặc biệt, nếu chúng tôi có thể sử dụng output=toolbar, chúng tôi hoàn toàn không phải chỉ định một khách hàng.
Dennis

2
@ mınxomaτ nhưng tại sao không https -> http(lưu 1 byte), xóa www.(lưu 4 byte), google.com -> google.us(lưu 1 byte) hoặc thậm chí google.com -> g.cn(lưu 6 byte; tôi không chắc tại sao điều này vẫn hoạt động, nhưng có vẻ như nó vẫn hoạt động vào năm 20170424)
tsh

3
Không tìm kiếm đề xuất khác nhau cho người dùng và khu vực khác nhau? Tôi không nghĩ rằng có trường hợp thử nghiệm tiêu chuẩn thực sự làm việc cho điều này.
MrZander

Câu trả lời:


8

Zsh + coreutils + w3m, 88 71 68 byte

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

Chuyển từ Bash sang Zsh đã lưu 3 byte.

Cảm ơn @FirthMerlin cho URL ngắn hơn, tiết kiệm 17 byte!

Chạy mẫu

$ 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
Trong tất cả mọi thứ, tại sao "làm slime" là gợi ý đầu tiên? Có bao nhiêu người ngoài kia đang làm slime như chúng ta nói?
MildlyMilquetoast

27
Không có manh mối. Đó là cách nuôi iq của bạn bằng cách ăn những đứa trẻ có năng khiếu trong một thời gian, vì vậy tôi coi đây là một sự cải thiện.
Dennis

Dang, tôi yêu w3m. Nó cho phép tôi duyệt mà không bị phân tâm và nó hoàn toàn tuyệt vời.
ckjbgames

1
@MistahFiggins Đổ lỗi cho Minecraft vì điều đó.
JakeSteam

@MistahFiggins Có lẽ tất cả họ chỉ muốn làm make(1) slime .
Arminius

12

Vim 8 + không có ấn tượng.vim , 93 89 85 70 73 71 byte

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

Như một phần thưởng, các byte cuối cùng trông giống như chúng đang nháy mắt với bạn ;DVì phần này chứa các ký tự không in, phần giải thích chứa các thay thế (và tôi đã thay thế phần chuỗi truy vấn trước của url bằng [url], cho ngắn gọn):

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

Theo như chạy, nó hoạt động tốt nếu bạn lưu nó vào một tệp có tên scriptvà chạy với vim -s script input.txttrên macOS, ít nhất. Nó không hoạt động nếu bạn thêm -u NONE, nhưng nó hoạt động tốt nếu tôi .vimrctrống. Tôi giả sử nó đang sử dụng một cái gì đó từ hệ thống .vimrcđể làm cho công cụ URL hoạt động. Tuy nhiên, điều này có nghĩa là nó không hoạt động trong V, vì vậy không có liên kết TIO.

Một số trường hợp thử nghiệm khác:

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

Điều tôi thực sự cần là một cách để mở một URL có khoảng trắng trong đó. Thay thế chúng bằng +đầu tiên chỉ là quá nhiều byte!


1
không gian nên được thay thế bằng dấu cộng +?
tsh

1
@tsh Bạn nói đúng! Bây giờ ai đó cho tôi biết làm thế nào tôi có thể tiết kiệm 2 byte và đánh bại Dennis :)
Brian McCutchon

để netrw hoạt động bạn cầnfiletype plugin on
tbodt

1
Bạn có thể dán "thanh ghi (mặc định) trong chế độ chèn / lệnh bằng cách thực hiện <Cr>". Bạn có thể cạo một vài byte bằng cách :r [url]?client=opera&q=^R"thay vì q:ir [url]?client=opera&q=<esc>p. ^Rlà byte thực tế được gửi khi bạn nhấn <Cr>, không phải các phím ^Rcùng nhau, vì vậy nó chỉ được tính là một byte.
Ian Emnace

1
Khi tôi đếm số byte tôi nhận được 88. Ngoài ra, bạn có thể lưu byte bằng cách thay đổi URL thành http://google.com/complete/search?client=hp&q=your_query( client=gma=> Plain JSON và văn bản ngắn hơn.).
FatalMerlin

7

Python + yêu cầu 121 117 103 byte

from requests import*
lambda s:get("http://google.com/complete/search?client=gma&q="+s).json()[1][0][0]

5

JavaScript, 109 byte

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

Promise, bạn phải yêu nó, nhưng con người là nó dài dòng! Câu trả lời này sử dụng fetch(), API tìm nạp dựa trên lời hứa có trong các trình duyệt hiện đại. Hứa hẹn làm việc bằng cách thiết lập trình xử lý cho các hành động không đồng bộ ngay từ đầu, như gọi lại, nhưng tốt hơn. Hàm .then()lấy một hàm sẽ được gọi với kết quả của hành động không đồng bộ. .then(r=>r.json())sử dụng .json()phương thức trả lời để chuyển đổi mảng văn bản thành một biến có thể thao tác, lần thứ hai .then()chỉ cần kéo phản hồi đầu tiên.

Sử dụng:

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])Thưởng thức ít hơn 11 ký tự ;-)
Stephan bijzitter

Tôi đã thử trên Firefox 52 và Chrome 57, trên trang này, trang chủ của Google và về: để trống và tôi cứ bị lỗi CORS. Bạn đã nhận được nó để làm việc thành công?
Sản xuất ETH

@ETHproductions Có, có vấn đề về CORS, bạn phải thực thi trên tên miền suggestqueries.google.com
MayorMonty

@StephanBijzitter .json()trả lại một Promise, vì nó không đồng bộ, vì một số lý do
MayorMonty

Quả thực nó hoạt động ở đó, cảm ơn!
Sản xuất ETH

1

C #, 192 112 111 byte

Đã lưu 80 byte nhờ vào @TheLethalCoder. Cảm ơn vì đã định dạng lại mã của tôi, tôi không biết rằng nó được phép rời khỏi Lớp thân và Phương thức xung quanh :)

Đã lưu một Byte khác bằng cách thay thế gmabởi hpvì nó không quan trọng đối với việc phân tích cú pháp và chỉ có một số từ vô nghĩa trước cơ thể phản hồi.

Tôi vô cùng thô bạo - buộc API phải tìm gmahp.

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

1

Groovy, 122 byte

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

Về cơ bản:

  1. Lấy văn bản từ điểm cuối.

  2. Xóa phần có dấu ngoặc ở cuối, đây không phải là cú pháp hợp lệ.

  3. Phân tích bit còn lại dưới dạng một mảng Groovy.

  4. Lấy phần tử thứ hai của mảng kết quả.

nhập mô tả hình ảnh ở đây


1

PowerShell, 133 115 byte

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

Chạy mẫu

Dòng lệnh Windows CMD:

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

Bảng điều khiển PowerShell:

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

1

R, 111 byte

Lâu rồi kể từ lần cuối tôi đến đây nhưng cho nó một phát súng:

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

Sử dụng gói jsonliteđể chuyển đổi chuỗi được tìm nạp từ readLines()một đối tượng danh sách.

Sau đó trích xuất phần tử thứ hai, ví dụ (đưa ra cảnh báo mà chúng ta không phải quan tâm):

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

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

Phiên bản hoàn chỉnh và định dạng:

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

Cảm ơn bạn đã gợi ý về việc rời khỏi Phương thức và Lớp học!
FatalMerlin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.