Hangisi daha iyi - Emacs veya Vim? (Google kavga)


26

Selamlar, asil kodlu golfçüler. Bugün en eski ve en seçkin tartışmaları çözeceksiniz - Emacs veya Vim?

Buradaki zorluk iki arama terimini girdi olarak almak ve bu terimlerden hangisinin en çok Google arama sonucuna sahip olduğunu ortaya çıkarmak. (Bu açıkça tamamen adil. Ne demek istiyorsun, önyargılı?)

İşte bazı örnek girişler ve çıkışlar:

Girdi: emacsve vim
Çıktı: vim(yorumlarda tamamen flamewar oluşturmaz)

Giriş: googleve microsoft
Çıkış:google

Giriş: code golf stack exchangeve code review stack exchange
Çıkış: code golf stack exchange(evet!)

Ve işte eğlence için (ve çözümlerinizi sınamak için) bazı yeni durumlar:

Giriş: About 1,000,000 resultsve About 100,000 results
Çıkış:About 100,000 results

Giriş: This will autocotrectve Another testcase
Çıkış: Another testcase(otomatik düzeltmeyi düşünmüyorsanız, ilk kazanan kazanır)

Aşağıdaki test durumları için, #ilk olarak arama terimlerindeki işaretleri kaldırmanız gerekir , çünkü belirli bir sonuç sayısına sahip olmaları ve terimin burada yayınlanması bunu mahvedecektir.

Giriş: Thissear#chter#mhasno#resultsve Another testcase
Çıkış: Another testcase(sıfır sonuç için sadece bir test)

Giriş: "These exact wo#rds do#n't exi#st# on the Internet"ve Another testcase
Çıkış: Another testcase(test "s)

Girdi: Abo#ut 1,65#2,85#3,2#86 re#sultsve Another testcase
Çıktı: Another testcase(bu aldatıcı - yukarıdaki arama terimi bir sonuç verdi)

Giriş: "Abo#ut 4#8,234,8#75,14#7 res#ults"ve Another testcase
Çıkış: Another testcase(ayrıca zor - sonuç yok, bu nedenle arama terimini görüntüler)

"quoted""Sonuç yok, sonuçları tırnak işareti olmadan gösterme" döndüren aramaların köşesindeki durumu ele almanıza gerek yok çünkü bu sadece çok karmaşık olurdu. Aynı sayıda sonuç içeren girişleri de kullanmanıza gerek yok.

Bu , yani bayttaki en kısa kod kazanacak!


Psst ... kabul edilen cevabı değiştirmelisin: D
cat

@tac Alternatif olarak, yaptığım yerine golf oynayabilirim. ;)
Doorknob

Çıkış / dönüş değeri ne kadar esnek? Bir dize olması gerekiyor mu, yoksa dizeyi ve sahip olduğu sonuç sayısını içeren bir dizi mi yoksa yalnızca dizeyi içeren bir dizi mi olabilir?
Kedi

3

Yanıtlar:


5

Faktör , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 bayt

Neredeyse Java kadar ayrıntılı bir dil, Ruby'yi ve Powershell'i yeniyor! : D

Şimdi daha iyi regex. @Fede s 'e teşekkürler . için 5 kapalı bayt!

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

Veya çıktı şöyle olabilir : 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 ]

Öte yandan, eğer engelsiz olmak istiyorsak, 199 196 193 bayt için :

[ 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'yi çözümlediği için okunamaz, bu nedenle regex kullanan cevaplardan daha sağlam.


1
Ve piton. Faktör için iyi. : P
Rɪᴋᴇʀ

@EasterlyIrk şu ana kadar çok yakın
cat

@EasterlyIrk Yaptım!
kedi

1
Birisi bir Faktör golf lehçesi yapmalı, çok fazla boşluk, kelimeler çok uzun ... Aferin dostum!
fede s.

1
unkillableYöntem için teşekkür ederim . Powershell'de aslında regex kullanmaktan daha kısa . (Yine de regex cevabından daha uzun 2 byte). Ben, 's komut isimleri kısa nadiren olsa Powershell succint demem ( iwriçin varsayılan bir takma olur invoke-webrequestve sortiçin sort-objectaksi takdirde çok daha uzun olduğunu olurdu,)
Jonathan Sülük-Pepin

7

Ruby, 203 180 bayt

->*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-uriBayrak için +11 bayt (artı boşluk).

Giriş iki argüman olarak alınır.

URL açıklaması:

  • ?nord=1: HTTP'den HTTPS'ye otomatik yönlendirmeyi engelle
  • &q=#{URI.escape x}: sorgudan kaçış yani "çalışma
  • &nfpr=1: otomatik düzeltme yok

Bütün mapdönüşler ['emacs','vim']içine [[2150000, 'emacs'], [14900000, 'vim']]. (Bunu değiştirerek bunu görebilirsiniz .max[1]için sonunda .inspectArdından.) maxEn sonuçlarla birini çekecek olan alınır ve [1]arama terimi almak için kullanılır.


Aranıyor Thissear#chter#mhasno#resultsşimdi bu soruyu Google'da gösterecek :) İlginç bir şekilde 2 sonuç gösteriyor (en azından benim için!) - google.com/… NB. "About * results" ile eşleşen herhangi bir regex bu sayfada bulunan sonucu özleyecektir :(
draegtun

Bu benim için çalışmıyor. ideone.com/UqEyBn
TheDoctor

@TheDoc İdeone üzerinde çalışmaz - gerçek Ruby'de çalıştırır
Doorknob

ruby -ropen-uriDosya yerine komuttan istenerek birkaç bayttan tasarruf edebilirsiniz .
Shelvacu

Neden bu (ve diğer regex cevapları) "Yaklaşık 100.000.000 sonuç" gibi aramalardan kopmuyor?
kedi

7

Problemde belirtilen metin editörlerinden sadece bir tanesi bunu kendi başına çözebilir ...

Emacs: 137 tuş vuruşlarını

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

İlk arama terimlerinin birinci satırda ve ikinci arama terimlerinin ikinci satırda olmasını, imlecin tamponun başında olmasını bekler.

Emacs'ı tanımayanlar için,

  • C-sanlamına gelir Ctrl-S.
  • M-zanlamına gelir Alt-Z( Altmuhtemelen meta anahtarınız)
  • M-<anlamına gelir Alt-<veyaAlt-Shift-,
  • C-S-e anlamına geliyor Ctrl-Shift-e

Emacs'ı bilenler için,

  • Emacs ile başla emacs -q. Bu, .emacsdosyanızı yüklemez , bu nedenle herhangi bir fantezi paketi bununla etkileşime girmez.

açıklama

  1. Elisp durum kabuğunun başlangıcını yaz

    • <C-o><C-u><C-k> Argümanları newline ile kaydeder
    • (if(<<C-y><C-y> İf ifadesinin başlangıcını yazın ve bağımsız değişkenlerin 2 kopyasını yerleştirin
    • <M-<><C-n> İkinci satıra git
  2. HTTP makrosunu tanımlayın. Bu, argümanı bir Google arama URL’sine dönüştürür ve ardından arama sonucu sayısını döndürür.

    • <F3> Klavye makrosunu tanımlamaya başlayın
    • <C-a> Arama teriminin başlangıcına git.
    • http://google.com/search?nfpr=1&q= Arama URL’sine öncelik ver
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> Tüm boşlukları + işaretleri ile değiştirin.
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>Emacs ham HTML'yi alır ( b-emkısaca browse-url-emacs)
    • <C-x><C-q> Dosyayı yazılabilir hale getirin (gerekli olması için makro hata yapmaz)
    • <C-s><RET>ts"><RET> Sonuç div sayısına gidin (düzenli bir arama yapmanız gerekir, çünkü emac makroları çalışmak için araştırmaya dayanır)
    • <M-z><Diff'in metnini kesin (bu nedenle istendi)
    • <C-x>0 Orijinal arabelleğe geri dön
    • <C-y>0 r;; Sonuçları tekrar çizgiye koyun ('0 r' sonuç yok yapar)
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; Sayıyı dizeden çıkartın.
    • <C-S-a><M-x><up><up><RET>,<RET><RET> Şeritler sayı dışında virgül
    • <F4> Klavye makrosunu bitirin
  3. Aşağı kaydırın ve klavye makrosunu bir sonraki satırda yürütün.

    • <C-n> Bir sonraki satıra gider
    • <F4> Makroyu bir kez tekrarlayın.
  4. Elisp ifadesini bitirin ve uygulayın

    • <C-e>)(next-line)()) Elisp ifadesini bitirin
    • <C-x><C-e> Elisp komutunu değerlendirin
    • <C-n><C-a><C-k> Kazanan argümanı öldür
    • <C-x>h<DEL> Diğer her şeyi sil
    • <C-y> Kazanan argümanı yapıştır

Kendi Kendine Çalışan

Neyse ki tüm bu tuş vuruşlarını mükemmel bir şekilde yazmak zorunda değilsiniz! Et ve patateslerin hepsi sadece kopyalayıp yapıştırabileceğiniz bir makroda. Makro kopyalanıp yapıştırılabilir!

1. Klavye makrosunu <C-x><C-k><C-e>
düzenleyin 2. Bunu tamponun tamamına yerleştirin (yapıştırma olmalıdır <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. Tip <C-c><C-c>makro kaydedin.
  2. Açıklama adımlarını takip ediyorsanız <F4>, makroyu çalıştırmak için adım 2'yi değiştirin (veya sadece denemek için kendi kendine çalıştırın)

Uyarılar

  1. HTML'nin yüklendiği arabelleği öldürmeden makroyu aynı aramada iki kez çalıştıramazsınız. Tamponları öldür
    • <C-x><k> search<TAB>
    • Öldürmek için bu listedeki tamponlardan birini seçin.
    • "Arama" ile başlayan tüm tamponlar için tekrarlayın
  2. Makroyu çok fazla çalıştırırsanız, Google bir robot olduğunuzu düşünecek ve atime erişimini engelleyecektir.
    • Makro gibi bir şey döndürürse <input type="submit" name="submit" value="Submit"...>, bu muhtemelen oluştu.
    • Ham HTML'ye bakarak bunu onaylayabilirsiniz ( <C-x><C-b>ve içinde arama terimiyle arabellek seçerek).
    • Robotlar ve captcha hakkında bir şeyler görürseniz, Google sizi engelliyor demektir. Benim hatam değil.

Bu gerçekten havalı! Of the text editors mentioned in the problem, only one of them can solve this on its own...bu doğru mu? gerçekten vimscript için hiç HTTP kütüphanesi yok mu?
Kedi,

Vanilyalı vimde en azından hiçbir şey yok, ancak kısa googling herhangi bir vimscript HTTP kütüphanesini açmadı. Sonuçlarını okuduğunuzda curlve aynı etkiyi elde ettiğinizde neden birisinin bunu yazdığını tahmin edemiyorum . (ama sonra cevabınız vim + curl olduğunu göstermelidir).
Dominic A.

3

Java, 828 800 783 744 739 687 bayt

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

Kutsal kediler Sadece ithalat 79 bayttır ... belki de Groovy'i denemelisin? : P
kedi,

1
Kullanıcı aracısı dizesini kendiniz ayarlamak zorunda olduğunuz için gerçekten eğleniyorum. Gibi, Java yeterince ayrıntılı değildi
kedi 2:

Çünkü eğer istemezseniz google 403 verir.
SuperJedi224,

2
Neden argsStdIn yerine girdi almıyorsunuz?
Pavel,

2

Python 3, 227 226 208 213 226 220 221 206 202 200 198 bayt

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'yı arayacak bir şeye atayın.

İstek kütüphanesini kullanır .

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]

Bu istekleri yükledikten sonra bile NameError: name 'quote' is not defined
makinemde çalışmıyor

@shelvacu Hata! Ben zekiyim, mutlak bir içe aktarmadan sonra quotegeri dönmeyi unuttum urllib.parse.quote.
kedi,

bunu test ettin mi Ayrıca google.co/search 404 verir gibi gözüküyor, oysa google.com/search işe yarıyor
Shelvacu

@ shelvacu evet, test ettim, yakut cevabı ile aynı sonuçları veriyor ve soru söylüyor.
kedi,

1

Powershell, 175 , 172 bayt

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

Skorun yanı sıra ismin gösterilmesi 2 baytı daha keserdi.

Bu unkillable, 196 Byte Faktör yanıtı (Ayrıştırılmış HTML) ile aynı özelliği kullanır ve önceki regex yanıtından keser.


1

Raket, 360 337 bayt

#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

Parantez Denizi'nde Kayıp demeleri için bir neden var.

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 <))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.