Quale è meglio - Emacs o Vim? (Lotta di Google)


26

Saluti, nobili golfisti. Oggi risolverai i dibattiti più antichi e distinti: Emacs o Vim?

La tua sfida è quella di prendere due termini di ricerca come input e produrre quale di questi termini ha il maggior numero di risultati di ricerca di Google. (Questo è ovviamente del tutto corretto. Cosa vuoi dire, di parte?)

Ecco alcuni esempi di ingressi e uscite:

Input: emacse vim
Output: vim(totalmente non creando alcuna fiamma-guerra nei commenti)

Ingresso: googlee microsoft
uscita:google

Input: code golf stack exchangee code review stack exchange
Output: code golf stack exchange(sì!)

E qui ci sono alcuni casi limite solo per divertimento (e per testare le tue soluzioni):

Ingresso: About 1,000,000 resultse About 100,000 results
uscita:About 100,000 results

Input: This will autocotrecte Another testcase
Output: Another testcase(se non consideri la correzione automatica, allora il primo vincerà)

Per i seguenti casi di test, è necessario rimuovere prima i #segni nei termini di ricerca, poiché si basano sul fatto che il termine abbia una quantità specifica di risultati e la pubblicazione del termine qui lo rovinerebbe.

Input: Thissear#chter#mhasno#resultse Another testcase
Output: Another testcase(solo un test per zero risultati)

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

Input: Abo#ut 1,65#2,85#3,2#86 re#sultse Another testcase
Output: Another testcase(questo è complicato - il termine di ricerca sopra ha un risultato)

Input: "Abo#ut 4#8,234,8#75,14#7 res#ults"e Another testcase
Output: Another testcase(anche difficile - nessun risultato, quindi visualizza il termine di ricerca)

Non è necessario gestire il caso angolare delle "quoted"ricerche che restituiscono "Nessun risultato, mostrando invece i risultati senza virgolette" perché sarebbe troppo complicato. Non è nemmeno necessario gestire input con lo stesso numero di risultati.

Questo è , quindi vincerà il codice più breve in byte!


Psst ... dovresti cambiare la risposta accettata: D
— cat

@tac In alternativa, posso invece giocare a golf, cosa che ho fatto. ;)
— Maniglia della porta

Quanto è flessibile il valore di output / return? Deve essere una stringa o può essere una matrice contenente la stringa e il numero di risultati che ha avuto o una matrice contenente solo la stringa?
— gatto

3
è così chiaro che vim è meglio Sono stato sorpreso da questa domanda che chiunque potesse credere che qualcosa di meglio
— Downgoat

Risposte:


5

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

Un linguaggio quasi prolisso come Java, che batte Ruby ... e Powershell! : D

Meglio regex, ora. Grazie a @fede s. per 5 byte di sconto!

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

O 159 157 se l'output può essere simile a { "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 ]

D'altra parte, se vogliamo essere inammissibili, per 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 ]

Immutabile perché analizza l'HTML, quindi molto più robusto delle risposte usando regex.


1
E pitone. Buono per fattore. : P
— Rɪᴋᴇʀ

@EasterlyIrk così vicino ma così lontano
— cat

@EasterlyIrk L'ho fatto!
— gatto

1
Qualcuno dovrebbe creare un dialetto del golf Factor, così tanto spazio, parole così a lungo ... Ben fatto, amico!
— fede s.

1
Grazie per il unkillablemetodo In realtà è più breve in PowerShell rispetto all'utilizzo di una regex. (Eppure ancora 2 byte più a lungo della tua risposta regex). Tuttavia, non chiamerei powershell succint, i suoi nomi dei comandi sono raramente brevi ( iwrsembra essere un alias predefinito per invoke-webrequeste sortper sort-object, altrimenti sarebbe molto più lungo)
— Jonathan Leech-Pepin,

7

Rubino, 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 per il -ropen-uriflag (più spazio).

L'input è preso come due argomenti.

Spiegazione URL:

  • ?nord=1: impedisce il reindirizzamento automatico da HTTP a HTTPS
  • &q=#{URI.escape x}: sfugge alla query, quindi "funziona
  • &nfpr=1: nessuna correzione automatica

Il tutto mapsi trasforma ['emacs','vim']in [[2150000, 'emacs'], [14900000, 'vim']]. (Puoi vedere questo cambiando .max[1]alla fine in .inspect.) Quindi, maxviene preso, che afferrerà quello con il maggior numero di risultati e [1]viene usato per ottenere il termine di ricerca.


La ricerca Thissear#chter#mhasno#resultsora mostrerà questa domanda su Google :) È interessante notare che sta mostrando 2 risultati (almeno per me!) - google.com/… NB. Qualsiasi regex corrispondente a "Informazioni su * risultati" salterà il risultato trovato in questa pagina :(
— draegtun

Non funziona per me. ideone.com/UqEyBn
— TheDoctor

@TheDoc Non funziona su Ideone - eseguilo su Ruby
— Maniglia

È possibile salvare qualche byte in più richiedendo nel comando ruby -ropen-urianziché nel file.
— Shelvacu,

Perché questo (e le altre risposte regex) non si interrompono in ricerche come "Circa 100.000.000 di risultati"?
— gatto

7

Degli editor di testo menzionati nel problema, solo uno di loro può risolverlo da solo ...

Emacs: 137 sequenze di tasti

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

Si aspetta che i primi termini di ricerca siano sulla prima riga e i secondi termini di ricerca sulla seconda riga, con il cursore all'inizio del buffer.

Per chi non ha familiarità con Emacs,

  • C-ssignifica Ctrl-S.
  • M-zsignifica Alt-Z( Altè probabilmente la tua meta chiave)
  • M-<significa Alt-<oAlt-Shift-,
  • C-S-e si intende Ctrl-Shift-e

Per chi ha familiarità con Emacs,

  • Inizia emacs con emacs -q. Questo non carica il tuo .emacsfile, quindi qualsiasi pacchetto di fantasia non si integra con questo.

Spiegazione

  1. Scrivi l'inizio della shell di istruzioni elisp

    • <C-o><C-u><C-k> Salva gli argomenti con una nuova riga
    • (if(<<C-y><C-y> Scrivi l'inizio dell'istruzione if e posiziona 2 copie degli argomenti
    • <M-<><C-n> Passa alla seconda riga
  2. Definire la macro HTTP. Ciò converte l'argomento in un URL di ricerca di Google e quindi restituisce il numero di risultati della ricerca.

    • <F3> Inizia a definire la macro della tastiera
    • <C-a> Passa all'inizio del termine di ricerca.
    • http://google.com/search?nfpr=1&q= Prepara l'URL di ricerca
    • <C-S-e><M-x>r-st<RET> <RET>+<RET> Sostituisci tutti gli spazi con i segni +.
    • <C-a><C-k><M-x>b-em<RET><C-y><RET>Emacs recupera il codice HTML non elaborato ( b-emè l'abbreviazione di browse-url-emacs)
    • <C-x><C-q> Rendi il file scrivibile (richiesto in modo che la macro non si guasti)
    • <C-s><RET>ts"><RET> Passa al numero di risultati div (devi fare una ricerca regolare perché le macro di emacs si basano sull'isearch per funzionare)
    • <M-z><Taglia il testo del diff (ecco perché era richiesto)
    • <C-x>0 Torna al buffer originale
    • <C-y>0 r;; Rimetti i risultati sulla linea ('0 r' non gestisce risultati)
    • <C-a><C-M-s><RET>[0-9]<RET><C-b><M-z> <C-a><C-y><C-k>;; Estrai il numero dalla stringa.
    • <C-S-a><M-x><up><up><RET>,<RET><RET> Strisce virgole fuori dal numero
    • <F4> Termina la macro della tastiera
  3. Spostati verso il basso ed esegui la macro della tastiera sulla riga successiva.

    • <C-n> Passa alla riga successiva
    • <F4> Ripeti la macro una volta.
  4. Termina l'istruzione elisp ed eseguila

    • <C-e>)(next-line)()) Termina la frase elisp
    • <C-x><C-e> Valuta il comando elisp
    • <C-n><C-a><C-k> Uccidi l'argomento vincente
    • <C-x>h<DEL> Elimina tutto il resto
    • <C-y> Incolla l'argomento vincente

Esegui te stesso

Fortunatamente non è necessario digitare perfettamente tutte queste battute! La carne e le patate sono tutte in una macro che puoi semplicemente copiare e incollare. La macro può essere copiata e incollata in emacs!

1.Modifica la macro della tastiera <C-x><C-k><C-e>
2.Invia questo in tutto il buffer (incolla dovrebbe essere <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. Digitare <C-c><C-c>per salvare la macro.
  2. Se segui i passaggi della spiegazione, sostituisci il passaggio 2 con <F4>per eseguire la macro (o eseguila da sola per provare)

Avvertenze

  1. Non è possibile eseguire la macro sulla stessa ricerca due volte senza uccidere il buffer in cui viene caricato l'HTML. Uccidi i buffer
    • <C-x><k> search<TAB>
    • Scegli uno dei buffer in questo elenco per uccidere.
    • Ripetere l'operazione per tutti i buffer che iniziano con "cerca"
  2. Se esegui troppo la macro, Google penserà che sei un robot e bloccherà l'accesso per volta
    • Se la macro restituisce qualcosa del genere <input type="submit" name="submit" value="Submit"...>, probabilmente si è verificato.
    • Puoi confermarlo guardando l'HTML grezzo ( <C-x><C-b>e scegliere il buffer con il termine di ricerca in esso).
    • Se vedi cose su robot e captcha, Google ti sta bloccando. Non è colpa mia.

Questo è davvero fantastico! Of the text editors mentioned in the problem, only one of them can solve this on its own...è anche vero? non ci sono davvero librerie HTTP per vimscript?
— gatto,

Non c'è almeno nulla in Vanilla Vim, ma una breve ricerca su Google non ha fatto apparire alcuna libreria HTTP di vimscript. Non riesco a immaginare perché qualcuno lo scriva davvero quando potresti semplicemente leggere i risultati curle ottenere lo stesso effetto. (ma poi la tua risposta dovrebbe indicare che è 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);}}

Gatti santi. Le importazioni da sole sono 79 byte ... forse dovresti provare Groovy? : P
— cat

1
Sono davvero divertito dal fatto che devi impostare tu stesso la stringa user-agent. Ad esempio, come se Java non fosse abbastanza prolisso
— cat

Perché google dà un 403 se non lo fai.
— SuperJedi224,

2
Perché non prendere input argsinvece di 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]

Assegna il lambda a qualcosa per chiamarlo.

Utilizza la libreria di richieste .

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]

Questo non funziona sulla mia macchina anche dopo l'installazione di richieste:NameError: name 'quote' is not defined
— Shelvacu

@shelvacu Oops, sono intelligente, ho dimenticato di quotetornare a urllib.parse.quotedopo un'importazione assoluta.
— gatto

hai provato questo? Sembra anche che google.co/search dia 404 mentre google.com/search funziona
— Shelvacu,

@shelvacu sì, l'ho testato, dà gli stessi risultati della risposta ruby ​​e la domanda dice.
— gatto

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]

Mostrando il punteggio e il nome, si taglierebbero altri 2 byte.

Questo utilizza la stessa unkillablefunzionalità della risposta 196 Byte Factor (Parsed HTML) e riduce la risposta regex precedente.


1

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

C'è un motivo per cui lo chiamano Lost In a Sea of ​​Parentheses.

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 <))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.