哪个更好-Emacs还是Vim?(谷歌打架)


26

问候,高贵的高尔夫球手。今天,您将解决最古老,最著名的辩论-Emacs还是Vim?

您面临的挑战是将两个搜索词作为输入,并输出其中哪个词具有最多的Google搜索结果。(这显然是完全公平的。您是什么意思,有偏见?)

以下是一些示例输入和输出:

输入:emacsvim
输出:(vim在注释中完全不产生任何争论)

输入:googlemicrosoft
输出:google

输入:code golf stack exchangecode review stack exchange
输出:(code golf stack exchange是的!)

以下是一些有趣的例子(用于测试您的解决方案):

输入:About 1,000,000 resultsAbout 100,000 results
输出:About 100,000 results

输入:This will autocotrectAnother testcase
输出:(Another testcase如果您不考虑自动更正,那么第一个将获胜)

对于以下测试用例,必须先删除#搜索词中的符号,因为它们依赖于具有特定数量结果的术语,并且在此处张贴该术语会破坏它们。

输入:Thissear#chter#mhasno#resultsAnother 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#sultsAnother testcase
输出:(Another testcase这很棘手-上面的搜索词有一个结果)

输入:"Abo#ut 4#8,234,8#75,14#7 res#ults"Another testcase
输出:(Another testcase也很棘手-没有结果,因此显示搜索项)

您无需处理"quoted"返回“无结果,显示结果时不带引号”的极端情况,因为那样太复杂了。您也不需要处理具有相同数量结果的输入。

这是,因此最短的代码(以字节为单位)将获胜!


抱歉...您应该更改已接受的答案:D

@tac另外,我也可以打高尔夫球。;)
门把手

输出/返回值的灵活性如何?它必须是字符串,还是可以是包含字符串及其结果数量的数组,还是仅包含字符串的数组?

3
它比vim更好,这让我很惊讶,这个问题令我感到惊讶,有人可以相信它是更好的东西
Downgoat 2016年

Answers:


5

因子305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163字节

这种语言几乎和Java一样冗长,击败了Ruby ...和Powershell!:D

现在,更好的正则表达式。感谢@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,因此比使用正则表达式的答案更健壮。


1
和python。对因素有益。:P
Rɪᴋᴇʀ

@EasterlyIrk到目前为止还很近

@EasterlyIrk我做到了!

1
有人应该做一个因子高尔夫球方言,那么多的空格,那么长的单词……干得好,伙计!
fede s。

1
谢谢你的unkillable方法。实际上,在Powershell中它比使用正则表达式要。(但仍比您的正则表达式答案长2个字节)。我不会把PowerShell的succint虽然,它的命令名称是很少短(iwr恰好是默认的别名invoke-webrequestsortsort-object的,否则它会是更长的时间)
乔纳森水蛭佩潘

7

Ruby,203180字节

->*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]}

-ropen-uri标志的+11个字节(加空格)。

输入被当作两个参数。

网址说明:

  • ?nord=1:防止从HTTP自动重定向到HTTPS
  • &q=#{URI.escape x}:转义查询,因此"工作
  • &nfpr=1:没有自动更正

map['emacs','vim'][[2150000, 'emacs'], [14900000, 'vim']]。(您可以通过将.max[1]结尾处的更改为来查看.inspect。)然后,将max采用,它将获取结果最多的一个,并[1]用于获取搜索词。


Thissear#chter#mhasno#results现在,搜索将在Google上显示此问题:)有趣的是,它显示2条结果(至少对我来说是!)- google.com/…注意。任何与“关于*结果”匹配的正则表达式都将丢失在此页面上找到的结果:(
draegtun 2014年

它对我不起作用。ideone.com/UqEyBn
TheDoctor 2014年

@TheDoc在Ideone上不起作用-在实际的Ruby上运行它
Doorknob

您可以通过在命令中ruby -ropen-uri而不是在文件中要求来节省更多的字节。
Shelvacu

为什么这(以及其他正则表达式答案)在“约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-ZAlt可能是您的元密钥)
  • M-<意味着Alt-<Alt-Shift-,
  • C-S-e 手段 Ctrl-Shift-e

对于熟悉Emacs的人,

  • 使用启动Emacs emacs -q。那不会加载您的.emacs文件,因此任何精美的软件包都不会对此造成干扰。

说明

  1. 写下elisp语句外壳的开头

    • <C-o><C-u><C-k> 用换行符保存参数
    • (if(<<C-y><C-y> 编写if语句的开头并放置2个参数副本
    • <M-<><C-n> 移至第二行
  2. 定义HTTP宏。这会将参数转换为Google搜索URL,然后返回搜索结果数。

    • <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>Emacs检索原始HTML(b-em是的缩写browse-url-emacs
    • <C-x><C-q> 使文件可写(必需,因此宏不会出错)
    • <C-s><RET>ts"><RET> 移至div的结果数(需要进行常规搜索,因为emacs宏依靠isearch起作用)
    • <M-z><剪切diff的文本(这就是为什么需要的原因)
    • <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会认为您是机器人,并且会暂时阻止访问
    • 如果宏返回类似的内容<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...那是真的吗?vimscript真的没有HTTP库吗?

原始vim至少没有任何内容,但是简短的谷歌搜索没有弹出任何vimscript HTTP库。我无法想象为什么只有当您阅读的结果curl并获得相同的效果时,才会有人真正写出那个。(但是您的答案应该表明它是vim + 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

1
您必须自己设置用户代理字符串,这一点让我感到非常满意。就像Java不够冗长一样
2016年

因为如果您不提供,Google会给出403。
SuperJedi224 '16

2
为什么不从argsStdIn 那里获取输入呢?
帕维尔

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]

将lambda分配给某些东西以调用它。

使用请求库

取消高尔夫:

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糟糕,我很聪明,我忘quoteurllib.parse.quote在绝对导入后改回。

你测试了吗?看起来google.co/search给出了404,而google.com/search起作用了
Shelvacu

@shelvacu是的,我对其进行了测试,它给出的结果与红宝石答案和问题所给出的结果相同。

1

的powershell,175,172个字节

($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个字节。

它使用与因子答案(已解析的HTML)相同的unkillable功能,并从以前的正则表达式答案中删除。196 Byte


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

他们称其为“迷茫在括号中的海洋”是有原因的。

取消高尔夫:

#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 <))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.