EmacsとVimのどちらが良いですか?(Googleの戦い)


26

挨拶、高貴なゴルファー。今日、あなたは最も古くて際立った議論を解決します-EmacsまたはVim?

あなたの課題は、入力として2つの検索用語を使用し、それらの用語のうち、Google検索結果が最も多いものを出力することです。(これは明らかに完全に公平です。どういう意味ですか、偏っていますか?)

入力と出力の例を次に示します。

入力:emacsおよびvim
出力:(vimコメントにまったくフレームウォーを作成しない)

入力: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これは注意が必要です-上記の検索用語には1つの結果があります)

入力:"Abo#ut 4#8,234,8#75,14#7 res#ults"およびAnother testcase
出力:(Another testcaseやはり扱いにくい-結果がないため、検索語が表示されます)

"quoted"「結果なし、代わりに引用符なしで結果を表示する」を返す検索のコーナーケースを処理する必要はありません。これは複雑すぎるからです。同じ数の結果を持つ入力を処理する必要もありません。

これはなので、バイト単位の最短コードが勝ちます!


申し訳ありませんが、受け入れられた答えを変更する必要があります:D
cat

@tacあるいは、代わりにゴルフをすることもできます。;)
ドアノブ

出力/戻り値の柔軟性はどれくらいですか?文字列である必要がありますか、それとも文字列とその結果の数を含む配列、または文字列のみを含む配列にすることができますか?

3
Vimが良く、私は誰もがその何かを信じることができると、この質問に驚いたよりも、それはより良いので、明確さだ
Downgoat

回答:


5

因子305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163バイト

Javaとほぼ同じくらい冗長な言語で、Ruby ...とPowershellを破りました!:D

より良い正規表現、今。@fedeに感謝します。以下のために5バイトoff!

[ 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
誰かがファクターのゴルフ方言を作るべきです。余りにも多くの空白、言葉はとても長い...よくやった、男!
フェデ。

1
unkillable方法をありがとう。実際、PowerShellでは正規表現を使用するよりも短くなります。(まだ正規表現の回答よりも2バイト長い)。私は、それのコマンド名が短いことはほとんどありませんけれどもPowerShellのsuccintを呼び出すことはありません(iwrデフォルトの別名であることを起こるinvoke-webrequestsortのためsort-object、それ以外の場合ははるかに長いものになるだろう、)
ジョナサン・リーチ・ピピン

7

ルビー、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バイト(およびスペース)。

入力は2つの引数として取得されます。

URLの説明:

  • ?nord=1:HTTPからHTTPSへの自動リダイレクトを防止
  • &q=#{URI.escape x}:クエリをエスケープして"動作させる
  • &nfpr=1:自動修正なし

全体のmapターン['emacs','vim'][[2150000, 'emacs'], [14900000, 'vim']]。(あなたが変更することで、これを見ることができる.max[1]の終わりに.inspect。)すると、maxほとんどの結果と1をつかむであろう、取られ、[1]検索語を取得するために使用されます。


検索はThissear#chter#mhasno#results、今興味深いことに、それは2件の結果を見せて:) Googleでこの質問が表示されます(少なくとも私のために!) - google.com/... NBを。「About * results」に一致する正規表現は、このページで見つかった結果を見逃します:(
draegtun 14

私にはうまくいきません。ideone.com/UqEyBn
TheDoctor

@TheDocそれはIdeoneでは動作しません-実際のRubyで実行してください
Doorknob

ruby -ropen-uriファイルではなくコマンドで要求することで、さらに数バイトを節約できます。
Shelvacu

「約1億件の結果」などの検索で、なぜこれ(および他の正規表現の回答)が中断しないのですか?

7

この問題で言及されているテキストエディターのうち、自分で解決できるのはそのうちの1人だけです...

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>

最初の検索語が最初の行にあり、2番目の検索語が2行目にあり、カーソルがバッファーの先頭にあると想定しています。

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 statmentシェルの始まりを書く

    • <C-o><C-u><C-k> 引数を改行で保存します
    • (if(<<C-y><C-y> ifステートメントの開始を記述し、引数の2つのコピーを配置します
    • <M-<><C-n> 2行目に移動する
  2. HTTPマクロを定義します。これにより、引数がGoogle検索URLに変換され、検索結果の数が返されます。

    • <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-embrowse-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> マクロを1回繰り返します。
  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がロードされるバッファーを殺さずに、同じ検索でマクロを2回実行することはできません。バッファを殺す
    • <C-x><k> search<TAB>
    • このリスト内のバッファの1つを選択して強制終了します。
    • 「検索」で始まるすべてのバッファについて繰り返します
  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であることを示すはずです)。
ドミニク

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が十分に冗長ではないかのように
cat

あなたがそうしないとグーグルは403を与えるからです。
SuperJedi224

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]

ラムダを何かに割り当てて呼び出します。

要求ライブラリを使用します

ゴルフをしていない:

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を
返しますが

@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.o

彼らがそれを「括弧の海で失われた」と呼ぶ理由があります。

ゴルフをしていない:

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