ไหนดีกว่ากัน - Emacs หรือ Vim (การต่อสู้ของ Google)


26

สวัสดีนักกอล์ฟโค้ดโนเบิล วันนี้คุณจะแก้ปัญหาการโต้วาทีที่เก่าแก่และโดดเด่นที่สุด - Emacs หรือ Vim?

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

นี่คือตัวอย่างอินพุตและเอาต์พุต:

อินพุต: emacsและvim
เอาต์พุต: vim(โดยสิ้นเชิงไม่สร้าง flamewars ใด ๆ ในความคิดเห็น)

อินพุต: googleและmicrosoft
เอาต์พุต:google

อินพุต: code golf stack exchangeและcode review stack exchange
เอาท์พุท: code golf stack exchange(ใช่!)

และนี่คือบางกรณีที่ขอบเพื่อความสนุกสนาน (และสำหรับการทดสอบโซลูชันของคุณ):

อินพุต: About 1,000,000 resultsและAbout 100,000 results
เอาต์พุต:About 100,000 results

อินพุต: This will autocotrectและAnother testcase
เอาท์พุท: Another testcase(หากคุณไม่พิจารณาการแก้ไขอัตโนมัติการแก้ไขแรกจะชนะ)

สำหรับกรณีทดสอบต่อไปนี้คุณต้องลบ#เครื่องหมายในคำค้นหาก่อนเนื่องจากต้องใช้คำที่มีจำนวนผลลัพธ์เฉพาะและโพสต์คำที่นี่จะทำลาย

อินพุต: Thissear#chter#mhasno#resultsและAnother testcase
เอาต์พุต: Another testcase(เพียงทดสอบเพื่อหาผลลัพธ์เป็นศูนย์)

อินพุต: "These exact wo#rds do#n't exi#st# on the Internet"และAnother testcase
เอาต์พุต: Another testcase(การทดสอบ")

อินพุต: Abo#ut 1,65#2,85#3,2#86 re#sultsและAnother testcase
ผลลัพธ์: Another testcase(อันนี้มีเล่ห์เหลี่ยม - คำค้นหาด้านบนมีผลลัพธ์เดียว)

อินพุต: "Abo#ut 4#8,234,8#75,14#7 res#ults"และAnother testcase
ผลลัพธ์: Another testcase(หากิน - ไม่มีผลลัพธ์ดังนั้นจึงแสดงคำค้นหา)

คุณไม่จำเป็นต้องจัดการกับตัวพิมพ์เล็ก ๆ ของ"quoted"การค้นหาที่ส่งคืน "ไม่มีผลลัพธ์แสดงผลลัพธ์โดยไม่มีเครื่องหมายคำพูดแทน" เพราะนั่นอาจซับซ้อนเกินไป คุณไม่จำเป็นต้องจัดการอินพุตด้วยผลลัพธ์จำนวนเดียวกัน

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ!


Psst ... คุณควรเปลี่ยนคำตอบที่ยอมรับ: D
cat

@tac อีกทางหนึ่งฉันสามารถเล่นกอล์ฟแทนซึ่งฉันทำได้ ;)
Doorknob

ความยืดหยุ่นในการส่งออก / คืนค่า? มันจะต้องเป็นสตริงหรืออาจเป็นอาร์เรย์ที่มีสตริงและจำนวนผลลัพธ์ที่มีหรืออาร์เรย์ที่มีเพียงสตริง?
แมว

3
ชัดเจนกว่าเสียงเรียกเข้าจะดีกว่าฉันรู้สึกประหลาดใจกับคำถามนี้ที่ทุกคนสามารถเชื่อได้ว่าบางสิ่งจะดีกว่า
Downgoat

คำตอบ:


5

ปัจจัย , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 ไบต์

ภาษาเกือบจะเป็น verbose เช่น Java เต้น Ruby ... และ Powershell! : D

regex ที่ดีขึ้นตอนนี้ ขอบคุณ@fede s สำหรับ5 ไบต์ปิด!

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend http-get R/ s">About [\d,]+/ first-match " "split second 10 >base ] map zip [ last ] sort-with last first ]

หรือ159 157ถ้าผลลัพธ์สามารถเป็นเช่น{ "vim" 9782948234 }:

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend http-get R/ s">About [\d,]+/ first-match " "split second 10 >base ] map zip [ last ] sort-with last ]

ในทางกลับกันถ้าเราต้องการที่จะไม่มีความสามารถสำหรับ199 196 193 ไบต์ :

[ dup [ url-encode "google.com/search?nfpr=1&q="prepend scrape-html nip dup "resultStats"find-by-id-between second text>> " "split second string>number ] map zip [ last ] sort-with last first ]

ไม่สามารถทำได้เพราะแยกวิเคราะห์ HTML ดังนั้นจะมีประสิทธิภาพมากกว่าคำตอบโดยใช้ regex


1
และหลาม ดีสำหรับปัจจัย : P
Rɪᴋᴇʀ

@ElylyIrk ใกล้จนยัง
แมว

@ElylyIrk ฉันทำมัน!
แมว

1
ใครบางคนควรสร้างสำเนียงการเล่นกอล์ฟแบบสเปคตรัม, พื้นที่ว่างมาก, คำพูดนานมาก ... ทำได้ดีมากมนุษย์!
fede s

1
ขอบคุณสำหรับunkillableวิธีการ จริงๆแล้วมันสั้นกว่าในการใช้ powerhell มากกว่าการใช้ regex (ยังคงมีความยาวมากกว่าคำตอบ regex ของคุณ 2 ไบต์) ฉันจะไม่เรียก succint PowerShell แม้ว่ามันชื่อคำสั่งจะไม่ค่อยสั้น ( iwrเกิดขึ้นจะเป็นนามแฝงเริ่มต้นสำหรับinvoke-webrequestและsortสำหรับsort-objectมิฉะนั้นมันจะเป็นที่มากอีกต่อไป)
โจนาธานปลิง-Pepin

7

Ruby, 203 180 ไบต์

->*s{s.map{|x|[(open("http://www.google.com/search?nord=1&q=#{URI.escape x}&nfpr=1").read.match(/s">(About )?([\d,]+) result/)||[?0])[-1].split(?,).join.to_i,x]}.max[1]}

+11 ไบต์สำหรับการ-ropen-uriตั้งค่าสถานะ (บวกช่องว่าง)

อินพุตถูกใช้เป็นอาร์กิวเมนต์สองตัว

คำอธิบาย URL:

  • ?nord=1: ป้องกันการเปลี่ยนเส้นทางอัตโนมัติจาก HTTP เป็น HTTPS
  • &q=#{URI.escape x}: หนีดังนั้นแบบสอบถาม"s ทำงาน
  • &nfpr=1: ไม่มีการแก้ไขอัตโนมัติ

ทั้งmapผลัดกันเข้าไป['emacs','vim'] [[2150000, 'emacs'], [14900000, 'vim']](คุณสามารถดูสิ่งนี้ได้โดยเปลี่ยนค่า.max[1]ในตอนท้ายเป็น.inspect.) จากนั้นmaxจะดำเนินการซึ่งจะคว้าผลลัพธ์ที่มีผลลัพธ์มากที่สุดและ[1]ใช้ในการรับข้อความค้นหา


การค้นหาThissear#chter#mhasno#resultsจะแสดงคำถามนี้ใน Google :) น่าสนใจที่จะแสดงผลลัพธ์ 2 รายการ (สำหรับฉันอย่างน้อย!) - google.com/… NB regex ที่ตรงกับ "About * results" ใด ๆ จะพลาดผลลัพธ์ที่พบในหน้านี้ :(
draegtun

มันไม่ทำงานสำหรับฉัน ideone.com/UqEyBn
TheDoctor

@TheDoc มันไม่ทำงานใน Ideone - ใช้มันใน Ruby จริง
Doorknob

คุณสามารถบันทึกอีกสองสามไบต์ได้โดยกำหนดให้ใช้คำสั่งruby -ropen-uriแทนในไฟล์
Shelvacu

เหตุใดจึงไม่ (และคำตอบ regex อื่น ๆ ) นี้จะหยุดการค้นหาเช่น "ประมาณ 100,000,000 ผล"
แมว

7

จากเครื่องมือแก้ไขข้อความที่กล่าวถึงในปัญหามีเพียงหนึ่งคนเท่านั้นที่สามารถแก้ปัญหานี้ได้ด้วยตนเอง ...

Emacs: 137 การกดแป้น

<C-o><C-u><C-k>(if(<<C-y><C-y><M-<><C-n><F3><C-a>http://google.com/search?nfpr=1&q=<C-S-e><M-x>r-st<RET> <RET>+<RET><C-a><C-k><M-x>b-em<RET><C-y><RET><C-x><C-q><C-s><RET>ts"><RET><M-z><<C-x>0<C-y>0 r<C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k><C-S-a><M-x><up><up><RET>,<RET><RET><F4><C-n><F4><C-e>)(next-line)())<C-x><C-e><C-n><C-a><C-k><C-x>h<DEL><C-y>

คาดว่าคำค้นหาแรกจะอยู่ในบรรทัดแรกและคำค้นหาที่สองจะอยู่ในบรรทัดที่สองโดยมีเคอร์เซอร์ที่จุดเริ่มต้นของบัฟเฟอร์

สำหรับผู้ที่ไม่คุ้นเคยกับ Emacs

  • C-s วิธี Ctrl-Sวิธี
  • M-zหมายถึงAlt-Z(Altน่าจะเป็นเมตาคีย์ของคุณ)
  • M-<หมายถึงAlt-<หรือAlt-Shift-,
  • C-S-e วิธี Ctrl-Shift-e

สำหรับผู้ที่คุ้นเคยกับ Emacs

  • emacs emacs -qเริ่มต้นด้วย แต่นั่นไม่ได้โหลด.emacsไฟล์ของคุณดังนั้นแพ็กเกจแฟนซีใด ๆ จะไม่รบกวนสิ่งนี้

คำอธิบาย

  1. เขียนจุดเริ่มต้นของเชลล์อิลิสต์

    • <C-o><C-u><C-k> บันทึกอาร์กิวเมนต์ด้วยการขึ้นบรรทัดใหม่
    • (if(<<C-y><C-y> เขียนจุดเริ่มต้นของคำสั่ง if และวางข้อโต้แย้ง 2 ชุด
    • <M-<><C-n> ย้ายไปที่บรรทัดที่สอง
  2. กำหนดแมโคร HTTP สิ่งนี้จะแปลงอาร์กิวเมนต์เป็น URL การค้นหาของ Google แล้วส่งคืนจำนวนผลลัพธ์การค้นหา

    • <F3> เริ่มต้นกำหนดแมโครแป้นพิมพ์
    • <C-a> เลื่อนไปยังจุดเริ่มต้นของข้อความค้นหา
    • http://google.com/search?nfpr=1&q= เตรียม URL การค้นหาไว้ล่วงหน้า
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> แทนที่ช่องว่างทั้งหมดด้วยเครื่องหมาย +
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>Emacs ดึง HTML แบบดิบ ( b-emย่อมาจากbrowse-url-emacs)
    • <C-x><C-q> ทำให้ไฟล์สามารถเขียนได้ (จำเป็นเพื่อให้แมโครไม่มีข้อผิดพลาด)
    • <C-s><RET>ts"><RET> ย้ายไปที่จำนวนผลลัพธ์ div (ต้องค้นหาตามปกติเนื่องจากมาโคร emacs ใช้ isearch เพื่อทำงาน)
    • <M-z><ตัดเนื้อหาของส่วนต่าง (นี่คือสาเหตุที่จำเป็น)
    • <C-x>0 สลับกลับไปที่บัฟเฟอร์เดิม
    • <C-y>0 r;; นำผลลัพธ์กลับมาที่บรรทัด ('0 r' จะไม่จัดการผลลัพธ์ใด ๆ )
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; แยกตัวเลขจากสตริง
    • <C-S-a><M-x><up><up><RET>,<RET><RET> ลอกเครื่องหมายจุลภาคออกจากจำนวน
    • <F4> เสร็จสิ้นมาโครแป้นพิมพ์
  3. เลื่อนลงและเรียกใช้แมโครแป้นพิมพ์ในบรรทัดถัดไป

    • <C-n> ไปที่บรรทัดถัดไป
    • <F4> ทำซ้ำแมโครหนึ่งครั้ง
  4. เสร็จสิ้นคำสั่ง elisp และดำเนินการ

    • <C-e>)(next-line)()) เสร็จสิ้นคำสั่ง elisp
    • <C-x><C-e> ประเมินคำสั่ง elisp
    • <C-n><C-a><C-k> ฆ่าอาร์กิวเมนต์ที่ชนะ
    • <C-x>h<DEL> ลบทุกอย่างอื่น
    • <C-y> วางอาร์กิวเมนต์ที่ชนะ

วิ่งด้วยตัวเอง

โชคดีที่คุณไม่ต้องพิมพ์การกดแป้นเหล่านั้นทั้งหมดอย่างสมบูรณ์! เนื้อและมันฝรั่งนั้นมีมาโครให้คุณคัดลอกและวางได้ แมโครสามารถคัดลอกและวางลงใน emacs!

1. แก้ไขแมโครแป้นพิมพ์<C-x><C-k><C-e>
2. วางสิ่งนี้ลงในบัฟเฟอร์ทั้งหมด (วางควรเป็น<C-y>)

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-a http://google.com/search?nfpr= 1&q= S-C-e M-x r-st RET SPC RET + RET C-a C-k M-x b-em RET C-y RET C-x C-q C-s RET ts"> RET M-z < C-x 0 C-y 0 SPC r C-a M-C-s [0-9] 5*DEL RET [0-9] RET C-b M-z SPC C-a C-y C-k S-C-a M-x 2*<up> RET , 2*RET
Command: last-kbd-macro
Key: none
Macro:
C-a         ;; move-beginning-of-line
http://google.com/search?nfpr=  ;; self-insert-command * 30
1&q=            ;; self-insert-command * 4
S-C-e
M-x         ;; execute-extended-command
r-st            ;; self-insert-command * 4
RET         ;; newline
SPC         ;; self-insert-command
RET         ;; newline
+           ;; self-insert-command
RET         ;; newline
C-a         ;; move-beginning-of-line
C-k         ;; kill-line
M-x         ;; execute-extended-command
b-em            ;; self-insert-command * 4
RET         ;; newline
C-y         ;; yank
RET         ;; newline
C-x C-q         ;; read-only-mode
C-s         ;; isearch-forward
RET         ;; newline
ts">            ;; self-insert-command * 4
RET         ;; newline
M-z         ;; zap-to-char
<           ;; self-insert-command
C-x 0           ;; delete-window
C-y         ;; yank
0           ;; self-insert-command
SPC         ;; self-insert-command
r           ;; self-insert-command
C-a         ;; move-beginning-of-line
M-C-s           ;; isearch-forward-regexp
RET         ;; newline
[0-9]           ;; self-insert-command * 5
RET         ;; newline
C-b         ;; backward-char
M-z         ;; zap-to-char
SPC         ;; self-insert-command
C-a         ;; move-beginning-of-line
C-y         ;; yank
C-k         ;; kill-line
S-C-a
M-x         ;; execute-extended-command
2*<up>          ;; previous-line
RET         ;; newline
,           ;; self-insert-command
2*RET           ;; newline
  1. พิมพ์<C-c><C-c>เพื่อบันทึกแมโคร
  2. หากทำตามขั้นตอนคำอธิบายให้แทนที่ขั้นตอนที่ 2 ด้วย<F4>เพื่อเรียกใช้แมโคร (หรือเรียกใช้ด้วยตนเองเพื่อลอง)

คำเตือน

  1. คุณไม่สามารถเรียกใช้แมโครในการค้นหาเดียวกันสองครั้งโดยไม่ทำลายบัฟเฟอร์ที่ HTML โหลดเข้ามา ฆ่าบัฟเฟอร์
    • <C-x><k> search<TAB>
    • เลือกหนึ่งในบัฟเฟอร์ในรายการนี้เพื่อฆ่า
    • ทำซ้ำสำหรับบัฟเฟอร์ทั้งหมดที่ขึ้นต้นด้วย "ค้นหา"
  2. หากคุณเรียกใช้มาโครมากเกินไป Google จะคิดว่าคุณเป็นหุ่นยนต์และบล็อกการเข้าถึงสำหรับ atime
    • ถ้ามาโครคืนค่าลักษณะ<input type="submit" name="submit" value="Submit"...>นี้อาจเกิดขึ้นได้
    • คุณสามารถยืนยันได้โดยดูที่ HTML แบบดิบ ( <C-x><C-b>และเลือกบัฟเฟอร์ที่มีข้อความค้นหาอยู่)
    • หากคุณเห็นสิ่งต่าง ๆ เกี่ยวกับหุ่นยนต์และแคปต์ชา Google จะบล็อกคุณ มันไม่ได้เป็นความผิดของฉัน.

นี่มันเจ๋งจริงๆ! Of the text editors mentioned in the problem, only one of them can solve this on its own...มันเป็นเรื่องจริงเหรอ? ไม่มีไลบรารี HTTP สำหรับ vimscript จริง ๆ หรือไม่
แมว

อย่างน้อยไม่มีอะไรใน vanilla vim แต่ googling สั้น ๆ ไม่ปรากฏไลบรารี vimscript HTTP ใด ๆ ฉันไม่สามารถจินตนาการได้ว่าทำไมทุกคนจะเขียนว่าเมื่อคุณสามารถอ่านผลลัพธ์curlและได้รับผลเดียวกัน (แต่จากนั้นคำตอบของคุณควรระบุว่าเป็นกลุ่ม + curl)
Dominic A.

3

Java, 828 800 783 744 739 687 ไบต์

import java.net.*;import java.util.*;import java.util.regex.*;interface G{static Scanner s(String a)throws Exception{URL u=new URL("http://google.com/search?q="+a);HttpURLConnection c=(HttpURLConnection)u.openConnection();c.addRequestProperty("User-Agent","Mozilla/4.0");return new Scanner(c.getInputStream());}static void main(String[]r)throws Exception{String a,b;String c=s(a=r[0]).useDelimiter("\\Z").next(),d=s(b=r[1]).useDelimiter("\\Z").next();Matcher m=Pattern.compile("ut ([0-9,]+) res").matcher(c);m.find();long i=new Scanner(m.group(1)).nextLong();m=Pattern.compile("ut ([0-9,]+) res").matcher(d);m.find();long j=new Scanner(m.group(1)).nextLong();System.out.print(i>j?a:b);}}

แมวศักดิ์สิทธิ์ การนำเข้าเพียงอย่างเดียวคือ 79 ไบต์ ... บางทีคุณควรลอง Groovy : P
cat

1
ฉันได้รับความบันเทิงจากข้อเท็จจริงที่ว่าคุณต้องตั้งค่าสตริงตัวแทนผู้ใช้เอง อย่างกับว่า Java นั้นยังไม่พอ
cat

เพราะ google ให้ 403 ถ้าคุณทำไม่ได้
SuperJedi224

2
ทำไมไม่รับข้อมูลargsแทน StdIn
Pavel

2

Python 3, 227 226 208 213 226 220 221 206 202 200 198 ไบต์

import re,requests as r,urllib.parse as u
lambda*t:sorted(zip(map(lambda a:int(re.findall("s\">About ([\d,]+)",r.get("http://google.com/search?q="+u.quote(a)).text)[0].replace(",","")),t),t))[-1][1]

มอบหมายแลมบ์ดาให้บางสิ่งบางอย่างเพื่อเรียกมันว่า

ใช้ไลบรารีคำร้องขอห้องสมุดการร้องขอ

Ungolfed:

import re, requests as r, urllib.parse as u
lambda*t:
  sorted(
  list(
      zip(map(
              lambda a: int(re.findall("About ([\d,]+)",
               r.get("http://google.com/search?q="+u.quote(a)).text)[0].replace(",","")),
              t
          ),
       t)
   )
)[-1][1]

สิ่งนี้ไม่ทำงานบนเครื่องของฉันแม้หลังจากติดตั้งคำขอ:NameError: name 'quote' is not defined
Shelvacu

@shelvacu โอ๊ะฉันฉลาดฉันลืมเปลี่ยนquoteกลับไปurllib.parse.quoteเป็นหลังจากการนำเข้าแบบสัมบูรณ์
แมว

คุณทดสอบสิ่งนี้หรือไม่? นอกจากนี้ดูเหมือนว่า google.co/search จะให้ 404 ในขณะที่ google.com/search ทำงานได้
Shelvacu

@shelvacu ใช่ฉันทดสอบแล้วมันให้ผลลัพธ์เช่นเดียวกับคำตอบทับทิมและคำถามบอกว่า
แมว

1

Powershell, 175 , 172 bytes

($args|%{[pscustomobject]@{'a'=$_;'b'=[int]((iwr "google.com/search?nord=1&q=$_&nfpr=1").parsedhtml.getelementbyid('resultstats').innertext-split" ")[1]}}|sort -des b).a[0]

การแสดงคะแนนและชื่อจะลดลงอีก 2 ไบต์

สิ่งนี้ใช้unkillableคุณสมบัติเดียวกันกับคำตอบ196 Byte ตัวประกอบ (Parsed HTML) และตัดคำตอบจาก regex ก่อนหน้า


1

แร็กเก็ต, 360 337 ไบต์

#lang racket(require net/url net/uri-codec)(λ(t)(cddr(sort(map list t(map(lambda(a)(string->number(string-replace(list-ref(string-split(car(regexp-match#px"s\">About [\\d,]+ res"(call/input-url(string->url(string-append"http://google.com/search?nfpr=1&q="(uri-encode a)))(curry get-pure-port)port->string)))" ")1)",""")))))#:key cdr <)))

0.o

มีเหตุผลที่พวกเขาเรียกมันว่าหายไปในทะเลแห่งวงเล็บ

Ungolfed:

#lang racket
(require net/url)
(require net/uri-codec)

(define (open-url term)
  (call/input-url
   (string->url (string-append "http://" term))
   (curry get-pure-port #:redirections 5)
   port->string))

(define (get-result term)
  (string->number
   (string-replace
    (list-ref
     (string-split
      (car (regexp-match #px"s\">About [\\d,]+ results" (open-url (string-append "google.com/search?nfpr=1&q=" (uri-encode term)))))
      " ")
     1)
    "," "")))

(define (zip a b) (map list a b))

(define (google-fite terms) (cddr (sort (zip terms (map get-result terms))) #:key cdr <))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.