कौन सा बेहतर है - Emacs या विम? (Google की लड़ाई)


26

अभिवादन, नोबल कोड गोल्फर्स। आज आप बहस का सबसे प्राचीन और प्रतिष्ठित हल करेंगे - Emacs या Vim?

आपकी चुनौती इनपुट के रूप में दो खोज शब्द लेने की है, और उन शर्तों में से कौन-सा परिणाम 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(यह एक मुश्किल है - उपरोक्त खोज शब्द का एक परिणाम है)

इनपुट: "Abo#ut 4#8,234,8#75,14#7 res#ults"और Another testcase
आउटपुट: Another testcase(मुश्किल भी - कोई परिणाम नहीं, इसलिए यह खोज शब्द प्रदर्शित करता है)

आपको "quoted""बिना परिणाम, बिना उद्धरण के परिणाम दिखाने वाले" खोजों के कोने-मामले को संभालने की आवश्यकता नहीं है, क्योंकि यह बहुत जटिल होगा। आपको परिणामों की समान संख्या के साथ इनपुट को संभालने की आवश्यकता नहीं है।

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा!


Psst ... आपको स्वीकृत उत्तर बदलना चाहिए: D
cat

@ टैक वैकल्पिक रूप से, मैं इसे नीचे गोल्फ कर सकता हूं, जो मैंने किया। ;)
दरवाज़े

कितना लचीला आउटपुट / रिटर्न वैल्यू है? क्या यह एक स्ट्रिंग होना चाहिए, या यह एक सरणी हो सकती है जिसमें स्ट्रिंग और उसके परिणाम की संख्या, या केवल स्ट्रिंग वाला एक सरणी है?
बिल्ली

3
यह इतना स्पष्ट है कि विम से बेहतर है मैं इस सवाल पर आश्चर्यचकित था कि किसी को भी विश्वास हो सकता है कि कुछ बेहतर है
डाउगोएट

जवाबों:


5

फैक्टर , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 बाइट्स

रूबी ... और पॉवरशेल की धड़कन जावा के रूप में लगभग एक भाषा है! : डी

बेहतर रेगेक्स, अब। @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
और अजगर। फैक्टर के लिए अच्छा है। : पी
आर

@EasterlyIrk अभी तक बहुत करीब है
कैट

@EasterlyIrk मैंने इसे किया!
कैट

1
किसी को एक फैक्टर गोल्फिंग बोली बनाना चाहिए, इतना व्हॉट्सएप, शब्द इतना लंबा ... अच्छा हुआ, यार!
फेड एस।

1
unkillableविधि के लिए धन्यवाद । यह वास्तव में रेगीक्स का उपयोग करने की तुलना में पावरशेल में कम है। (फिर भी अभी भी 2 बाइट्स आपके रेगेक्स उत्तर की तुलना में अधिक हैं)। हालाँकि, मैं इसे पॉवरशेल succint नहीं कहूंगा, यह कमांड नाम शायद ही कभी कम होते हैं (के iwrलिए invoke-webrequestऔर इसके sortलिए एक डिफ़ॉल्ट उपनाम होने के लिए होता है sort-object, अन्यथा यह बहुत लंबा होगा)
जोनाथन लीच-पेपिन

7

रूबी, 203 180 बाइट्स

->*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 बाइट्स (प्लस स्पेस)।

इनपुट को दो तर्कों के रूप में लिया जाता है।

URL स्पष्टीकरण:

  • ?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/… एनबी। किसी भी regex मिलान "के बारे में * परिणाम" इस पृष्ठ पर पाया परिणाम याद करेंगे :(
draegtun

यह मेरे लिए काम नहीं करता है। ideone.com/UqEyBn
TheDoctor

@TheDoc यह नहीं Ideone पर काम करता है - वास्तविक रूबी पर चला
दरवाज़े

आप ruby -ropen-uriफ़ाइल के बजाय कमांड में आवश्यकता के अनुसार कुछ और बाइट्स बचा सकते हैं ।
शैलवकु

यह (और अन्य रेगेक्स उत्तर) "लगभग 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-Z( Altआपकी मेटा कुंजी की संभावना है)
  • M-<साधन Alt-<याAlt-Shift-,
  • C-S-e माध्यम Ctrl-Shift-e

Emacs से परिचित लोगों के लिए,

  • के साथ emacs शुरू करें emacs -q। यह आपकी .emacsफ़ाइल को लोड नहीं करता है , इसलिए कोई भी फैंसी पैकेज इसके साथ पूर्ण नहीं होगा।

व्याख्या

  1. एलीस स्टेटमेंट शेल की शुरुआत लिखें

    • <C-o><C-u><C-k> एक नई लाइन के साथ तर्कों को बचाता है
    • (if(<<C-y><C-y> यदि कथन की शुरुआत लिखें और तर्कों की 2 प्रतियाँ रखें
    • <M-<><C-n> दूसरी लाइन पर जाएं
  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-emलिए छोटा है browse-url-emacs)
    • <C-x><C-q> फ़ाइल को लिखने योग्य बनाएं (आवश्यक है कि मैक्रो में त्रुटि न हो)
    • <C-s><RET>ts"><RET> परिणाम संख्या की संख्या पर जाएं (एक नियमित खोज करने की आवश्यकता है क्योंकि एमएसीएस मैक्रोज़ काम करने के लिए खोज पर निर्भर है)
    • <M-z><अंतर के पाठ को काटें (यही कारण है कि आवश्यक था)
    • <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. अभिप्राय कथन को समाप्त करें और उस पर अमल करें

    • <C-e>)(next-line)()) एलिस्प स्टेटमेंट को पूरा करें
    • <C-x><C-e> संभावित कमांड का मूल्यांकन करें
    • <C-n><C-a><C-k> जीतने वाले को मार डालो
    • <C-x>h<DEL> बाकी सबकुछ हटा दो
    • <C-y> जीतने वाले तर्क को चिपकाएं

यह अपने आप चल रहा है

सौभाग्य से आपको उन सभी कीस्ट्रोक्स को पूरी तरह से लिखना नहीं पड़ता है! मांस और आलू सभी एक मैक्रो में है जिसे आप बस कॉपी और पेस्ट कर सकते हैं। मैक्रो को कॉपी करके emacs में चिपकाया जा सकता है!

1. कीबोर्ड मैक्रो से बाहर निकलें। <C-x><C-k><C-e>
इसे पूरे बफर में पेस्ट करें (पेस्ट होना चाहिए <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. यदि स्पष्टीकरण के चरणों का पालन करें, <F4>तो मैक्रो को चलाने के लिए चरण 2 को बदलें (या बस इसे अपने दम पर चलाने के लिए प्रयास करें)

चेतावनियां

  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 लाइब्रेरी नहीं है?
बिल्ली

वेनिला विम में कम से कम कुछ भी नहीं है, लेकिन संक्षिप्त googling ने किसी भी विम्सस्क्रिप्ट HTTP पुस्तकालयों को पॉप नहीं किया। मैं सोच भी नहीं सकता कि कोई भी वास्तव में ऐसा क्यों लिखेगा, जब आप इसके परिणामों को पढ़ सकते हैं curlऔर समान प्रभाव प्राप्त कर सकते हैं। (लेकिन फिर आपके उत्तर से संकेत मिलता है कि यह विम + कर्ल है)।
डोमिनिक ए।

3

जावा, 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 बाइट्स हैं ... शायद आपको ग्रूवी की कोशिश करनी चाहिए? : पी
बिल्ली

1
मैं वास्तव में इस तथ्य से मनोरंजन कर रहा हूं कि आपको उपयोगकर्ता-एजेंट स्ट्रिंग को स्वयं सेट करना होगा। जैसे, यदि जावा पर्याप्त नहीं था
बिल्ली

क्योंकि अगर आप नहीं करते हैं तो Google 403 देता है।
सुपरजेडी २२४

2
argsStdIn के बजाय इनपुट क्यों नहीं लेते ?
पावेल

2

पायथन 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]

लैम्बडा को इसे कॉल करने के लिए कुछ असाइन करें।

अनुरोध लायब्रेरी का उपयोग करता है ।

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]

अनुरोधों को स्थापित करने के बाद भी यह मेरी मशीन पर काम नहीं करता है:NameError: name 'quote' is not defined
शेल्वैकु

@shelvacu ओह, मैं स्मार्ट हूं, मैं एक पूर्ण आयात के बाद quoteवापस बदलना भूल गया urllib.parse.quote
बिल्ली

क्या आपने यह परीक्षण किया? यह भी लगता है जैसे google.co/search 404 देता है जबकि google.com/search काम करता है
शेल्वैकु

@shelvacu हां, मैंने इसका परीक्षण किया, यह माणिक जवाब के समान परिणाम देता है और सवाल कहता है।
बिल्ली

1

पॉवरशेल, 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

एक कारण है कि वे इसे लॉस्ट इन सी ऑफ कोष्ठक कहते हैं।

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 <))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.