ความสนุกในการเติมข้อความอัตโนมัติของ Google


16

งานของคุณคือการสร้างโปรแกรมซึ่งรับสายป้อนข้อมูลจะส่งออกผลลัพธ์การเติมข้อความอัตโนมัติครั้งแรกของ Google สำหรับการค้นหานั้น รูปแบบของอินพุต / เอาต์พุตขึ้นอยู่กับคุณ

กฎระเบียบ

  1. โปรแกรมของคุณจะต้องมี 1 อินพุตสตริงและส่งผลลัพธ์ผลลัพธ์การแนะนำการเติมข้อความอัตโนมัติ / การเติมข้อความอัตโนมัติของ Google อันดับต้น ๆ รูปแบบของอินพุต / เอาต์พุตขึ้นอยู่กับคุณ โปรดอย่าลืมระบุว่ารูปแบบ I / O ของคุณคืออะไร
  2. เห็นได้ชัดว่าการเข้าถึงอินเทอร์เน็ตได้รับอนุญาต
  3. shorteners 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 ตราบใดที่มีการใช้ Suggqueries.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)
Arminius

12

เป็นกลุ่ม 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 ไบต์และชนะเดนนิส :)
ไบรอัน McCutchon

สำหรับ netrw ในการทำงานที่คุณต้องการfiletype plugin on
tbodt

1
คุณสามารถวาง "register (ค่าเริ่มต้น) ในโหมด insert / command ได้โดยทำ <Cr>" คุณสามารถโกนไม่กี่ไบต์โดยทำแทน:r [url]?client=opera&q=^R" เป็นไบต์ที่แท้จริงที่ส่งเมื่อคุณกด <Cr> ไม่ใช่ปุ่มและร่วมกันดังนั้นจึงนับเป็นหนึ่งไบต์เท่านั้น q:ir [url]?client=opera&q=<esc>p^R^R
Ian Emnace

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คุณต้องรักมัน แต่ผู้ชายมัน verbose! คำตอบนี้ใช้fetch()API การดึงข้อมูลตามสัญญาที่มีอยู่ในเบราว์เซอร์สมัยใหม่ สัญญาทำงานโดยสร้างตัวจัดการสำหรับการดำเนินการ async ที่จุดเริ่มต้นเช่นการโทรกลับ แต่ดีกว่า .then()ต้องใช้ฟังก์ชั่นซึ่งจะเรียกว่ามีผลมาจากการกระทำ async ฯ .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 และ about: blank และฉันเพิ่งได้รับข้อผิดพลาด CORS คุณเคยทำงานให้สำเร็จหรือไม่?
ETHproductions

@ETHproductions ใช่มีปัญหา CORS คุณต้องดำเนินการในโดเมนที่แนะนำquery.google.com
MayorMonty

@StephanBijzitter .json()ส่งคืน Promise เป็น async ด้วยเหตุผลบางอย่าง
MayorMonty

มันใช้งานได้จริงขอบคุณ!
ETHproductions

1

C #, 192 112 111 Bytes

บันทึก 80 ไบต์ด้วย @TheLethalCoder ขอบคุณสำหรับการฟอร์แมตโค้ดของฉันฉันไม่รู้ว่ามันได้รับอนุญาตให้ออกจากคลาสและเมธอด :)

บันทึกไบต์อื่นโดยแทนที่gmaด้วยhpเนื่องจากไม่สำคัญสำหรับการวิเคราะห์คำ

ฉัน litterally เดรัจฉานบังคับ API เพื่อค้นหาและ gmahp

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. แยกบิตที่เหลือเป็นอาร์เรย์ Groovy

  4. คว้าองค์ประกอบที่สองของอาร์เรย์ผลลัพธ์

enter image description here


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

'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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.