Cái nào tốt hơn - Emacs hay Vim? (Cuộc chiến của Google)


26

Chúc mừng, người chơi golf mã cao quý. Hôm nay bạn sẽ giải quyết các cuộc tranh luận cổ xưa và nổi bật nhất - Emacs hay Vim?

Thách thức của bạn là lấy hai thuật ngữ tìm kiếm làm đầu vào và đầu ra những thuật ngữ nào có kết quả tìm kiếm nhiều nhất trên Google. (Điều này rõ ràng là hoàn toàn công bằng. Ý bạn là gì, thiên vị?)

Dưới đây là một số ví dụ đầu vào và đầu ra:

Đầu vào: emacsvim
Đầu ra: vim(hoàn toàn không tạo ra bất kỳ flamewar nào trong các bình luận)

Đầu vào: googlemicrosoft
đầu ra:google

Đầu vào: code golf stack exchangecode review stack exchange
Đầu ra: code golf stack exchange(yeah!)

Và đây là một số trường hợp cạnh chỉ để giải trí (và để thử nghiệm các giải pháp của bạn):

Đầu vào: About 1,000,000 resultsAbout 100,000 results
đầu ra:About 100,000 results

Đầu vào: This will autocotrectAnother testcase
Đầu ra: Another testcase(nếu bạn không xem xét tự động, thì cái đầu tiên sẽ thắng)

Đối với các trường hợp kiểm tra sau, trước tiên bạn phải xóa các #dấu hiệu trong cụm từ tìm kiếm, vì chúng dựa vào thuật ngữ có số lượng kết quả cụ thể và đăng thuật ngữ ở đây sẽ làm hỏng điều đó.

Đầu vào: Thissear#chter#mhasno#resultsAnother testcase
Đầu ra: Another testcase(chỉ là một thử nghiệm cho kết quả bằng không)

Đầu vào: "These exact wo#rds do#n't exi#st# on the Internet"Another testcase
Đầu ra: Another testcase(thử nghiệm ")

Đầu vào: Abo#ut 1,65#2,85#3,2#86 re#sultsAnother testcase
Đầu ra: Another testcase(cái này rất khó - thuật ngữ tìm kiếm ở trên có một kết quả)

Đầu vào: "Abo#ut 4#8,234,8#75,14#7 res#ults"Another testcase
Đầu ra: Another testcase(cũng khó - không có kết quả, vì vậy nó sẽ hiển thị cụm từ tìm kiếm)

Bạn không cần phải xử lý trường hợp góc "quoted"tìm kiếm trả về "Không có kết quả, thay vào đó hiển thị kết quả mà không có dấu ngoặc kép" vì điều đó sẽ quá phức tạp. Bạn cũng không cần phải xử lý các đầu vào có cùng số lượng kết quả.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!


Psst ... bạn nên thay đổi câu trả lời được chấp nhận: D
cat

@tac Thay vào đó, tôi có thể chơi golf thay thế, điều mà tôi đã làm. ;)
Doorknob

Giá trị đầu ra / trả lại linh hoạt như thế nào? Liệu nó có phải là một chuỗi hay nó có thể là một mảng chứa chuỗi và số lượng kết quả mà nó có hoặc một mảng chỉ chứa chuỗi?
mèo

3
rõ ràng hơn vim là tốt hơn Tôi đã ngạc nhiên về câu hỏi này mà bất cứ ai cũng có thể tin rằng một cái gì đó tốt hơn
Downgoat

Câu trả lời:


5

Yếu tố , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 byte

Một ngôn ngữ gần như dài dòng như Java, đánh bại Ruby ... và Powershell! : D

Regex tốt hơn, bây giờ. Cảm ơn @fede s. giảm 5 byte!

[ 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 ]

Hoặc 159 157 nếu đầu ra có thể như { "vim" 9782948234 }sau:

[ 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 ]

Mặt khác, nếu chúng ta muốn không thành công, với 199 196 193 byte :

[ 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 ]

Không thể thực hiện được vì nó phân tích cú pháp HTML, vì vậy cách mạnh mẽ hơn các câu trả lời bằng regex.


1
Và trăn. Tốt cho yếu tố. : P
Rɪᴋᴇʀ

@EasterlyIrk rất gần nhưng đến nay
mèo

@EasterlyIrk Tôi đã làm nó!
mèo

1
Ai đó nên tạo ra một phương ngữ chơi gôn Factor, rất nhiều khoảng trắng, từ quá dài ... Tốt lắm, anh bạn!
fede s.

1
Cảm ơn bạn cho unkillablephương pháp. Nó thực sự ngắn hơn trong powershell so với sử dụng regex. (Vẫn còn 2 byte dài hơn câu trả lời regex của bạn). Tôi sẽ không gọi succint PowerShell tuy nhiên, nó tên lệnh là hiếm khi ngắn ( iwrsẽ xảy ra là một bí danh mặc định cho invoke-webrequestsortcho sort-object, nếu không nó muốn được rằng lâu hơn nữa)
Jonathan Leech-Pepin

7

Ruby, 203 180 byte

->*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 byte cho -ropen-uricờ (cộng với không gian).

Đầu vào được lấy làm hai đối số.

Giải thích về URL:

  • ?nord=1: ngăn tự động chuyển hướng từ HTTP sang HTTPS
  • &q=#{URI.escape x}: thoát khỏi truy vấn để "làm việc
  • &nfpr=1: không tự động sửa

Toàn bộ mapbiến ['emacs','vim']thành [[2150000, 'emacs'], [14900000, 'vim']]. (Bạn có thể thấy điều này bằng cách thay đổi .max[1]ở cuối.inspect .) Sau đó, cái maxđược lấy, cái sẽ lấy cái có nhiều kết quả nhất và [1]được sử dụng để lấy cụm từ tìm kiếm.


Tìm kiếm Thissear#chter#mhasno#resultsbây giờ sẽ hiển thị câu hỏi này trên Google :) Điều thú vị là nó hiển thị 2 kết quả (ít nhất là đối với tôi!) - google.com/ Quảng NB. Bất kỳ biểu thức chính nào phù hợp với "Giới thiệu * kết quả" sẽ bỏ lỡ kết quả tìm thấy trên trang này :(
Drainegtun

Nó không làm việc cho tôi. ideone.com/UqEyBn
TheDoctor

@TheDoc Nó không hoạt động trên Ideone - chạy nó trên Ruby thực tế
Doorknob

Bạn có thể lưu thêm một vài byte bằng cách yêu cầu trong lệnh ruby -ropen-urithay vì trong tệp.
Shelvacu

Tại sao điều này (và các câu trả lời regex khác) lại phá vỡ các tìm kiếm như "Khoảng 100.000.000 kết quả"?
con mèo

7

Trong số các trình soạn thảo văn bản được đề cập trong vấn đề này, chỉ một trong số họ có thể tự giải quyết vấn đề này ...

Emacs: 137 tổ hợp phím

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

Nó hy vọng các cụm từ tìm kiếm đầu tiên nằm trên dòng đầu tiên và các cụm từ tìm kiếm thứ hai nằm trên dòng thứ hai, với con trỏ ở đầu bộ đệm.

Đối với những người không quen thuộc với Emacs,

  • C-scó nghĩa là Ctrl-S.
  • M-zcó nghĩa là Alt-Z( Altcó khả năng là khóa meta của bạn)
  • M-<có nghĩa là Alt-<hoặcAlt-Shift-,
  • C-S-e có nghĩa Ctrl-Shift-e

Đối với những người quen thuộc với Emacs,

  • Bắt đầu emacs với emacs -q. Điều đó không tải .emacstập tin của bạn , vì vậy bất kỳ gói ưa thích nào sẽ không phù hợp với điều này.

Giải trình

  1. Viết phần đầu của vỏ statisp elisp

    • <C-o><C-u><C-k> Lưu các đối số với một dòng mới
    • (if(<<C-y><C-y> Viết phần bắt đầu của câu lệnh if và đặt 2 bản sao của các đối số
    • <M-<><C-n> Di chuyển đến dòng thứ hai
  2. Xác định macro HTTP. Thao tác này chuyển đổi đối số thành URL tìm kiếm của Google và sau đó trả về số lượng kết quả tìm kiếm.

    • <F3> Bắt đầu xác định macro bàn phím
    • <C-a> Di chuyển đến đầu của cụm từ tìm kiếm.
    • http://google.com/search?nfpr=1&q= Chuẩn bị URL tìm kiếm
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> Thay thế tất cả các khoảng trắng bằng dấu +.
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>Emacs lấy HTML thô ( b-emviết tắt của browse-url-emacs)
    • <C-x><C-q> Làm cho tệp có thể ghi được (bắt buộc để macro không bị lỗi)
    • <C-s><RET>ts"><RET> Di chuyển đến số lượng kết quả div (cần thực hiện tìm kiếm thông thường vì macro emacs dựa vào isearch để hoạt động)
    • <M-z><Cắt văn bản của diff (đây là lý do tại sao bắt buộc)
    • <C-x>0 Chuyển về bộ đệm ban đầu
    • <C-y>0 r;; Đặt kết quả trở lại dòng ('0 r' không xử lý kết quả)
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; Trích xuất số từ chuỗi.
    • <C-S-a><M-x><up><up><RET>,<RET><RET> Dấu phẩy ra khỏi số
    • <F4> Kết thúc macro bàn phím
  3. Di chuyển xuống và thực hiện macro bàn phím trên dòng tiếp theo.

    • <C-n> Đi đến dòng tiếp theo
    • <F4> Lặp lại macro một lần.
  4. Kết thúc câu lệnh elisp và thực hiện nó

    • <C-e>)(next-line)()) Kết thúc tuyên bố elisp
    • <C-x><C-e> Đánh giá lệnh elisp
    • <C-n><C-a><C-k> Giết người chiến thắng
    • <C-x>h<DEL> Xóa mọi thứ khác
    • <C-y> Dán đối số chiến thắng

Tự chạy

May mắn thay, bạn không phải gõ tất cả các tổ hợp phím đó một cách hoàn hảo! Thịt và khoai tây là tất cả trong một macro mà bạn có thể chỉ cần sao chép và dán. Macro có thể được sao chép và dán vào emacs!

1. Chỉnh sửa macro bàn phím <C-x><C-k><C-e>
2. Đưa phần này vào toàn bộ bộ đệm (nên dán <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. Nhập <C-c><C-c>để lưu macro.
  2. Nếu làm theo các bước giải thích, hãy thay thế bước 2 bằng <F4>để chạy macro (hoặc chỉ tự chạy nó để thử)

Hãy cẩn thận

  1. Bạn không thể chạy macro trên cùng một tìm kiếm hai lần mà không làm chết bộ đệm mà HTML được tải vào. Giết bộ đệm
    • <C-x><k> search<TAB>
    • Chọn một trong những bộ đệm trong danh sách này để giết.
    • Lặp lại cho tất cả các bộ đệm bắt đầu bằng "tìm kiếm"
  2. Nếu bạn chạy macro quá nhiều, Google sẽ nghĩ bạn là một robot và chặn quyền truy cập vào thời gian
    • Nếu macro trả về một cái gì đó như thế <input type="submit" name="submit" value="Submit"...>, thì điều này có thể xảy ra.
    • Bạn có thể xác nhận nó bằng cách xem HTML thô ( <C-x><C-b>và chọn bộ đệm có cụm từ tìm kiếm trong đó).
    • Nếu bạn thấy nội dung về robot và captcha, thì Google sẽ chặn bạn. Đó không phải lỗi của tôi.

Điều này thực sự mát mẻ! Of the text editors mentioned in the problem, only one of them can solve this on its own...Điều đó có đúng không? Có thực sự không có thư viện HTTP cho vimscript?
con mèo

Ít nhất không có gì trong vanilla vim, nhưng việc googling ngắn không bật lên bất kỳ thư viện HTTP vimscript nào. Tôi không thể tưởng tượng được tại sao mọi người thực sự sẽ viết điều đó khi bạn chỉ cần đọc kết quả curlvà nhận được hiệu quả tương tự. (nhưng sau đó câu trả lời của bạn sẽ chỉ ra rằng đó là vim + curl).
Đaminh A.

3

Java, 828 800 783 744 739 687 byte

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

Mèo thần thánh. Chỉ riêng việc nhập là 79 byte ... có lẽ bạn nên thử Groovy? : P
mèo

1
Tôi thực sự rất thích thú với việc bạn phải tự đặt chuỗi tác nhân người dùng. Giống như, như thể Java không đủ dài dòng
mèo

Bởi vì google cung cấp 403 nếu bạn không.
SuperJedi224

2
Tại sao không lấy đầu vào từ argsthay vì StdIn?
Pavel

2

Trăn 3, 227 226 208 213 226 220 221 206 202 200 198 byte

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]

Chỉ định lambda cho một cái gì đó để gọi nó.

Sử dụng thư viện yêu cầu .

Ung dung:

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]

Điều này không hoạt động trên máy của tôi ngay cả sau khi cài đặt các yêu cầu:NameError: name 'quote' is not defined
Shelvacu

@shelvacu Rất tiếc, tôi thông minh, tôi đã quên thay đổi quotetrở lại urllib.parse.quotesau khi nhập tuyệt đối.
mèo

bạn đã kiểm tra cái này chưa? Nó cũng giống như google.co/search cho 404 trong khi công trình google.com/search
Shelvacu

@shelvacu vâng, tôi đã thử nó, nó cho kết quả giống như câu trả lời của ruby ​​và câu hỏi nói.
con mèo

1

Powershell, 175 , 172 byte

($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]

Hiển thị điểm số cũng như tên sẽ cắt thêm 2 byte.

Điều này sử dụng unkillabletính năng tương tự như câu trả lời 196 Byte Yếu tố (HTML phân tích) và cắt giảm từ câu trả lời regex trước đó.


1

Vợt, 360 337 byte

#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

Có một lý do mà họ gọi nó là Lạc vào biển cha mẹ.

Ung dung:

#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 <))
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.