Code Golf: การแยกผลลัพธ์ของ Google


16

เมื่อคุณค้นหาบางอย่างใน google ภายในหน้าผลลัพธ์ผู้ใช้สามารถเห็นลิงค์สีเขียวสำหรับหน้าแรกของผลการค้นหา

ในรูปแบบที่สั้นที่สุดที่เป็นไปได้ไบต์ใช้ภาษาใด ๆ แสดงลิงค์เหล่านั้นไปยัง stdout ในรูปแบบของรายการ นี่คือตัวอย่างสำหรับผลลัพธ์แรกของแบบสอบถามการแลกเปลี่ยนสแต็ก:

การจับภาพหน้าจอ

อินพุต:

คุณเลือก: URL ( www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8) หรือเพียงแค่stackexchange

ผลผลิต:

french.stackexchange.com/, stackoverflow.com/, fr.wikipedia.org/wiki/Stack_Exchange_Network, en.wikipedia.org/wiki/Stack_Exchange,...

กฎ:

  • คุณอาจจะใช้ shorteners URL หรือเครื่องมือค้นหาอื่น ๆ / APIs ตราบใดที่ผลจะเป็นเช่นเดียวกับการค้นหาhttps://www.google.com

  • ไม่เป็นไรหากโปรแกรมของคุณมีผลข้างเคียงเช่นการเปิดเว็บเบราว์เซอร์เพื่อให้สามารถอ่านหน้า Google html / js ที่เป็นความลับได้เมื่อมีการแสดงผล

  • คุณสามารถใช้ปลั๊กอินของเบราว์เซอร์ userscripts ...

  • หากคุณไม่สามารถใช้ stdout ให้พิมพ์ไปที่หน้าจอด้วยเช่น การแจ้งเตือนป๊อปอัพหรือจาวาสคริปต์!

  • คุณไม่ต้องการสิ้นสุด / หรือ http เริ่มต้น: //

  • คุณไม่ควรแสดงลิงค์อื่น ๆ

  • รหัสที่สั้นที่สุดชนะ!

  • โชคดี !

แก้ไข: กอล์ฟนี้สิ้นสุดในวันที่ 07/08/15


เมื่อคุณใช้google.frเราจะต้องใช้สิ่งนั้นด้วยหรือไม่
Beta Decay

คุณสามารถใช้ google ที่คุณต้องการ ฉันเป็นคนฝรั่งเศสดังนั้นฉันจึงใช้. fr แต่คุณสามารถใช้. com หรือ. ทุกอย่าง :) ไม่สำคัญ
WayToDoor

และ URL ที่สั้นลงเช่นgogle.deใช้ได้หรือไม่
Beta Decay

คุณอาจใช้เครื่องมือย่อ URL หรือเครื่องมือค้นหาอื่น ๆ / API ตราบใดที่ผลลัพธ์นั้นเหมือนกับการค้นหาgoogle.comดังนั้นใช่
WayToDoor

6
ในกรณีที่คุณถูกล่อลวง: จำไว้ว่าคุณไม่สามารถแยก HTML ด้วย regex
Luis Mendo

คำตอบ:


17

Bash + grep + lynx, 38

เนื่องจากเราสามารถเปิดเว็บเบราว์เซอร์แล้วฉันจะใช้lynx:

lynx -dump $1|grep -Po '(?<=d:)[^&]+'

(ขอบคุณ @manatwork สำหรับgrepการใช้งานแทนsed)

เราส่งผ่าน URL ทั้งหมดเป็นพารามิเตอร์:

$ ./gr.sh "www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8"
http://stackexchange.com/
https://en.wikipedia.org/wiki/Stack_Exchange
https://twitter.com/stackexchange
https://play.google.com/store/apps/details?id=com.stackexchange.marvin
https://github.com/StackExchange/StackExchange.Redis
https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Basics.md
https://www.crunchbase.com/organization/stack-exchange
$ 

ซึ่งให้รายการเช่นเดียวกับ:

ป้อนคำอธิบายรูปภาพที่นี่


นั่นเป็นประโยชน์: D
Beta Decay

3
sedดี. sedยาว. ลอง GNU grep:grep -Po '(?<=d:)[^&]+'
จัดการ

@ การจัดการใช่แน่นอน - ขอบคุณ!
Digital Trauma

1
ชื่อคำตอบถูกคัดลอกมาหรือไม่ ;) ไม่มีของbash, lynxหรือsed(และตอนนี้grep) เป็นส่วนหนึ่งของ coreutils
จัดการ

3
ฉันเชื่อว่าคุณสามารถทำได้: lynx -dump $1|grep -Po 'd:\K[^&]+'(ยังไม่ทดลอง)
Jarmex

4

Ruby, 91 77 ไบต์

require'open-uri';open(gets).read.scan(/ed:(.*?)\+/){|x|puts URI.decode x[0]}

จะสั้นกว่านี้ไหมถ้าไม่มีrequires ทั้งหมด โอ๊ะ !!! แก้ไข : ดังนั้นปรากฎฉันไม่ต้องการที่สองต้อง! ขอบคุณ @manatwork ที่ชี้ให้เห็นว่า

เวอร์ชั่นเก่า (ไร้ประโยชน์require):

require'open-uri';require 'uri';open(gets).read.scan(/ed:(.*?)\+/){|x|puts URI.decode x[0]}

กฎอนุญาตให้ใช้ตัวเลือกบรรทัดคำสั่งตราบใดที่คุณนับเช่นกัน: pastebin.com/PnpjnXji (หากคุณรู้สึกว่านี่เป็นสไตล์ที่ไม่เป็นธรรมคุณสามารถใช้เฉพาะการเปลี่ยนแปลงในบล็อกโค้ด)
manatwork

คุณแน่ใจหรือว่าคุณต้องชัดเจนrequire'uri'? ใน 2.1.2 ฉันใช้URIโมดูลกลายเป็นพร้อมใช้งานหลังจากที่ต้องใช้ open-uri
จัดการ

@Manatwork ขอบคุณ! Updated
kirbyfan64sos

เพียงเพื่อความอยากรู้ของฉัน: เหตุผลใดที่จะไม่เปลี่ยนบล็อกรหัสในทางเลือก pastebin ของฉัน? (แน่นอนว่าฉันอยากรู้เกี่ยวกับเหตุผลทางเทคนิคไม่ใช่เหตุผลส่วนตัวถ้านั่นถือคุณกลับ)
จัดการ

@ การบริหารงานที่ฉันต้องการ แต่ฉันขี้เกียจเกินไปที่จะคิดนับไบต์ในขณะนี้ :)
kirbyfan64sos

4

ภาษา Wolfram (Mathematica), 135

StringJoin/@(Cases[URLExecute["www.google.com/search",{"q"->#},"XMLObject"],XMLElement["cite",_,l_]:>l,-1]/.XMLElement["b",_,{s_}]:>s)&

อ่านได้มากขึ้น:

StringJoin/@(Cases[
    URLExecute["www.google.com/search",{"q"->#},"XMLObject"], 
    XMLElement["cite",_,l_]:>l,-1] /. 
    XMLElement["b",_,{s_}]:>s)

ช่องว่างจำเป็นจริงๆเหรอ? โดยพวกเขาได้รับ136 ไบต์
kirbyfan64sos

ไม่จำเป็นเลย ... ฉันควรทำให้มันแน่นขึ้นจริงๆ ..
chuy

คุณสามารถทำอะไรเช่นคำตอบนี้เพื่อย่อให้สั้นลงได้ไหม
Digital Trauma

3

Python 3, 141 ไบต์

ไม่มีคำตอบจาก Digital Trauma แต่มันสนุกที่ได้ทำ regex: D

import re
print('\n'.join(map(lambda x:x[3:],re.findall('te>http[s]?://\w+\.[a-z]+[](/a-z\.)?]+',__import__("requests").get(input()).text))))

สำหรับอินพุตhttp://www.google.com/search?q=stackexchange&ie=utf-8&oe=utf-8เอาต์พุตของโปรแกรม:

https://en.wikipedia.org/wiki/
https://twitter.com/
https://play.google.com/store/apps/details?id...
https://www.crunchbase.com/organization/
https://www.facebook.com/
https://github.com/

ใช้เคล็ดลับของ grc


คุณต้องการใช้จริง__import__หรือไม่?
ckjbgames

นอกจากนี้ยังใช้สร้างแทน[x for x in spam] mapที่จะช่วยให้คุณประหยัดจำนวนไบต์ที่ดี
ckjbgames

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