Mana yang lebih baik - Emacs atau Vim? (Pertarungan Google)

26

Salam, pegolf kode mulia. Hari ini Anda akan menyelesaikan perdebatan paling kuno dan terkemuka - Emacs atau Vim?

Tantangan Anda adalah menggunakan dua istilah pencarian sebagai input, dan menampilkan yang mana dari istilah-istilah tersebut yang memiliki hasil pencarian Google terbanyak. (Ini jelas sangat adil. Apa maksudmu, bias?)

Berikut adalah beberapa contoh input dan output:

Input: emacsdan vim
Output: vim(sama sekali tidak membuat flamewar di komentar)

Input: googledan microsoft
Output:google

Input: code golf stack exchangedan code review stack exchange
Output: code golf stack exchange(yeah!)

Dan berikut adalah beberapa kasus tepi hanya untuk bersenang-senang (dan untuk menguji solusi Anda):

Input: About 1,000,000 resultsdan About 100,000 results
Output:About 100,000 results

Input: This will autocotrectdan Another testcase
Output: Another testcase(jika Anda tidak mempertimbangkan koreksi otomatis, maka yang pertama akan menang)

Untuk kasus pengujian berikut, Anda harus menghapus #tanda - tanda dalam istilah pencarian terlebih dahulu, karena mereka bergantung pada istilah yang memiliki jumlah hasil tertentu dan memposting istilah di sini akan merusaknya.

Input: Thissear#chter#mhasno#resultsdan Another testcase
Output: Another testcase(hanya tes untuk hasil nol)

Input: "These exact wo#rds do#n't exi#st# on the Internet"dan Another testcase
Output: Another testcase(pengujian "s)

Input: Abo#ut 1,65#2,85#3,2#86 re#sultsdan Another testcase
Output: Another testcase(yang ini rumit - istilah pencarian di atas memiliki satu hasil)

Input: "Abo#ut 4#8,234,8#75,14#7 res#ults"dan Another testcase
Output: Another testcase(juga rumit - tidak ada hasil, sehingga menampilkan istilah pencarian)

Anda tidak perlu menangani kasus sudut "quoted"pencarian yang kembali "Tidak ada hasil, sebagai gantinya menunjukkan hasil tanpa tanda kutip" karena itu akan terlalu rumit. Anda juga tidak perlu menangani input dengan jumlah hasil yang sama.

Ini adalah , jadi kode terpendek dalam byte akan menang!

Gagang pintu
sumber
Psst ... Anda harus mengubah jawaban yang diterima: D
cat
@tac Sebagai alternatif, saya dapat menggunakannya sebagai gantinya, yang saya lakukan. ;)
Gagang Pintu
Seberapa fleksibel nilai output / pengembalian? Apakah harus berupa string, atau dapatkah array yang berisi string dan jumlah hasil yang dimilikinya, atau array yang hanya berisi string?
kucing
3
lebih jelas daripada vim lebih baik. Saya terkejut dengan pertanyaan ini bahwa siapa pun dapat percaya bahwa ada sesuatu yang lebih baik
Downgoat

Jawaban:

5

Factor , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 byte

Bahasa yang hampir sama dengan Jawa, mengalahkan Ruby ... dan Powershell! : D

Regex yang lebih baik, sekarang. Terima kasih kepada @fede s. untuk 5 byte 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 ]

Atau 159 157 jika outputnya bisa seperti { "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 ]

Di sisi lain, jika kita ingin tidak dapat diraih, untuk 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 ]

Unkillable karena mem-parsing HTML, jadi jauh lebih kuat daripada jawaban menggunakan regex.

kucing
sumber
1
Dan python. Baik untuk Faktor. : P
Rɪᴋᴇʀ
@EasterlyIrk begitu dekat namun sejauh ini
kucing
@EasterlyIrk saya berhasil!
kucing
1
Seseorang harus membuat dialek golf Faktor, begitu banyak ruang putih, kata-kata begitu lama ... Bagus sekali, bung!
fede s.
1
Terima kasih untuk unkillablemetodenya. Ini sebenarnya lebih pendek di PowerShell daripada menggunakan Regex. (Namun masih 2 byte lebih lama dari jawaban regex Anda). Saya tidak akan menyebut PowerShell Succint, nama perintahnya jarang pendek ( iwrkebetulan alias untuk invoke-webrequestdan sortuntuk sort-object, kalau tidak, itu akan menjadi lebih lama)
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 untuk -ropen-uribendera (plus spasi).

Masukan diambil sebagai dua argumen.

Penjelasan URL:

  • ?nord=1: cegah pengalihan otomatis dari HTTP ke HTTPS
  • &q=#{URI.escape x}: luput dari permintaan so "s work
  • &nfpr=1: tidak ada koreksi otomatis

Seluruhnya mapberubah ['emacs','vim']menjadi [[2150000, 'emacs'], [14900000, 'vim']]. (Anda dapat melihat ini dengan mengubah .max[1]di akhir menjadi .inspect.) Kemudian, maxdiambil, yang akan mengambil yang dengan hasil terbanyak, dan [1]digunakan untuk mendapatkan istilah pencarian.

Gagang pintu
sumber
Mencari Thissear#chter#mhasno#resultssekarang akan menampilkan pertanyaan ini di Google :) Menariknya itu menampilkan 2 hasil (setidaknya untuk saya!) - google.com/... NB. Setiap regex yang cocok dengan "Tentang * hasil" akan kehilangan hasil yang ditemukan di halaman ini :(
draegtun
Itu tidak bekerja untuk saya. ideone.com/UqEyBn
TheDoctor
@TheDoc Ini tidak bekerja pada Ideone - jalankan di Ruby yang sebenarnya
Doorknob
Anda dapat menyimpan beberapa byte lagi dengan meminta perintah ruby -ropen-urialih-alih di dalam file.
Shelvacu
Mengapa ini (dan jawaban regex lainnya) tidak akan putus pada pencarian seperti "Sekitar 100.000.000 hasil"?
kucing
7

Dari editor teks yang disebutkan dalam masalah, hanya satu dari mereka yang dapat menyelesaikannya sendiri ...

Emacs: 137 penekanan tombol

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

Ia mengharapkan istilah pencarian pertama berada di baris pertama dan istilah pencarian kedua berada di baris kedua, dengan kursor di awal buffer.

Bagi mereka yang tidak terbiasa dengan Emacs,

  • C-sberarti Ctrl-S.
  • M-zberarti Alt-Z( Altkemungkinan kunci meta Anda)
  • M-<berarti Alt-<atauAlt-Shift-,
  • C-S-e cara Ctrl-Shift-e

Bagi mereka yang akrab dengan Emacs,

  • Mulai emacs dengan emacs -q. Itu tidak memuat .emacsfile Anda , jadi setiap paket mewah tidak akan tertarik dengan ini.

Penjelasan

  1. Tulis awal dari shell statment elisp

    • <C-o><C-u><C-k> Menyimpan argumen dengan baris baru
    • (if(<<C-y><C-y> Tulislah permulaan pernyataan if dan tempatkan 2 salinan argumen
    • <M-<><C-n> Pindah ke baris kedua
  2. Tentukan makro HTTP. Ini mengubah argumen menjadi URL pencarian Google dan kemudian mengembalikan jumlah hasil pencarian.

    • <F3> Mulai mendefinisikan makro keyboard
    • <C-a> Pindah ke awal istilah pencarian.
    • http://google.com/search?nfpr=1&q= Pertahankan URL pencarian
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> Ganti semua spasi dengan tanda +.
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>Emacs mengambil HTML mentah ( b-emkependekan dari browse-url-emacs)
    • <C-x><C-q> Jadikan file dapat ditulisi (diperlukan agar makro tidak membuat kesalahan)
    • <C-s><RET>ts"><RET> Pindah ke jumlah hasil div (perlu melakukan pencarian reguler karena makro emacs bergantung pada isearch untuk bekerja)
    • <M-z><Potong teks dari diff (ini sebabnya diperlukan)
    • <C-x>0 Beralih kembali ke buffer asli
    • <C-y>0 r;; Kembalikan hasilnya pada baris ('0 r' tidak menangani hasil)
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; Ekstrak nomor dari string.
    • <C-S-a><M-x><up><up><RET>,<RET><RET> Strip koma keluar dari nomor tersebut
    • <F4> Selesaikan makro keyboard
  3. Turun ke bawah dan jalankan makro keyboard di baris berikutnya.

    • <C-n> Pergi ke baris berikutnya
    • <F4> Ulangi makro sekali.
  4. Selesaikan pernyataan elisp dan jalankan

    • <C-e>)(next-line)()) Selesaikan pernyataan elisp
    • <C-x><C-e> Evaluasilah perintah elisp
    • <C-n><C-a><C-k> Bunuh argumen yang menang
    • <C-x>h<DEL> Hapus yang lainnya
    • <C-y> Rekatkan argumen yang menang

Menjalankannya Sendiri

Untungnya Anda tidak perlu mengetik semua penekanan tombol dengan sempurna! Daging dan kentang semuanya dalam makro yang bisa Anda salin dan tempel. Makro dapat disalin dan ditempelkan ke emacs!

1. Edit makro keyboard <C-x><C-k><C-e>
2. Tempel ini ke seluruh buffer (tempel seharusnya <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. Ketik <C-c><C-c>untuk menyimpan makro.
  2. Jika mengikuti langkah-langkah penjelasan, ganti langkah 2 dengan <F4>untuk menjalankan makro (atau jalankan sendiri untuk mencoba)

Peringatan

  1. Anda tidak dapat menjalankan makro pada pencarian yang sama dua kali tanpa mematikan buffer yang dimasukkan HTML. Bunuh buffer
    • <C-x><k> search<TAB>
    • Pilih salah satu buffer dalam daftar ini untuk dibunuh.
    • Ulangi untuk semua buffer yang dimulai dengan "pencarian"
  2. Jika Anda menjalankan makro terlalu banyak, Google akan berpikir Anda adalah robot dan memblokir akses untuk atime
    • Jika makro mengembalikan sesuatu seperti <input type="submit" name="submit" value="Submit"...>, maka ini kemungkinan terjadi.
    • Anda dapat mengonfirmasinya dengan melihat HTML mentah ( <C-x><C-b>dan memilih buffer dengan istilah pencarian di dalamnya).
    • Jika Anda melihat hal-hal tentang robot dan captcha, Google memblokir Anda. Itu bukan salahku.
Dominic A.
sumber
Ini sangat keren! Of the text editors mentioned in the problem, only one of them can solve this on its own...apakah itu benar? apakah benar-benar tidak ada perpustakaan HTTP untuk vimscript?
kucing
Setidaknya tidak ada di vanilla vim, tetapi googling singkat tidak memunculkan perpustakaan HTTP vimscript. Saya tidak bisa membayangkan mengapa ada orang yang benar-benar menulis itu ketika Anda bisa membaca hasil curldan mendapatkan efek yang sama. (tapi kemudian jawaban Anda harus menunjukkan bahwa itu vim + curl).
Dominic 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);}}
SuperJedi224
sumber
Kucing suci. Impornya sendiri 79 byte ... mungkin Anda harus mencoba Groovy? : P
cat
1
Saya benar-benar terhibur oleh kenyataan bahwa Anda harus mengatur sendiri string agen-pengguna. Seperti, seolah-olah Jawa tidak cukup bertele-tele
cat
Karena google memberikan 403 jika tidak.
SuperJedi224
2
Mengapa tidak mengambil input dari argsbukannya StdIn?
Pavel
2

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

Tetapkan lambda ke sesuatu untuk menyebutnya.

Menggunakan perpustakaan permintaan .

Tidak Disatukan:

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]
kucing
sumber
Ini tidak berfungsi pada mesin saya bahkan setelah menginstal permintaan:NameError: name 'quote' is not defined
Shelvacu
@shelvacu Ups, saya cerdas, saya lupa mengubahnya quotekembali urllib.parse.quotesetelah impor absolut.
kucing
apakah kamu menguji ini? Ini juga terlihat seperti google.co/search memberi 404 sedangkan google.com/search bekerja
Shelvacu
@shelvacu ya, saya mengujinya, hasilnya sama dengan jawaban ruby ​​dan pertanyaannya.
kucing
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]

Menampilkan skor serta nama akan memotong 2 byte lebih banyak.

Ini menggunakan unkillablefitur yang sama dengan 196 Byte Factor answer (Parsed HTML) dan memotong dari jawaban regex sebelumnya.

Jonathan Leech-Pepin
sumber
1

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

Ada alasan mengapa mereka menyebutnya Lost In a Sea of ​​Parentheses.

Tidak Disatukan:

#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 <))
kucing
sumber