Что лучше - Emacs или Vim? (Google бой)

26

Привет, благородный код гольфистов. Сегодня вы разрешите самые древние и выдающиеся дебаты - Emacs или Vim?

Ваша задача состоит в том, чтобы взять два поисковых запроса в качестве входных данных и вывести, какой из этих терминов имеет больше всего результатов поиска Google. (Это, очевидно, совершенно справедливо. Что вы имеете в виду, предвзято?)

Вот несколько примеров входов и выходов:

Input: emacsи vim
Output: 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
кот
@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 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
И питон. Хорошо для фактора. : P
Rɪᴋᴇʀ
@EasterlyIrk так близко, пока так далеко
кот
@EasterlyIrk Я сделал это!
кот
1
Кто-то должен сделать диалект фактора игры в гольф, столько пробелов, слов так долго ... Молодец, чувак!
Федерация с.
1
Спасибо за unkillableметод. Это на самом деле короче в PowerShell, чем с помощью регулярных выражений. (Тем не менее, все еще на 2 байта длиннее, чем ваш ответ регулярного выражения). Я бы не стал называть powershell 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]}

+11 байт для -ropen-uriфлага (плюс пробел).

Ввод принимается как два аргумента.

Объяснение 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/… NB. Любое соответствие регулярному выражению "About * results" пропустит найденный результат на этой странице :(
draegtun
Это не работает для меня. ideone.com/UqEyBn
TheDoctor
@TheDoc Это не работает на Ideone - запустите его на настоящем Ruby
Doorknob
Вы можете сохранить еще несколько байтов, указав в команде, 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> Запишите начало оператора if и разместите 2 копии аргументов
    • <M-<><C-n> Перейти ко второй строке
  2. Определите макрос HTTP. Это преобразует аргумент в поисковый URL Google, а затем возвращает количество результатов поиска.

    • <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> Перейти к количеству результатов div (необходимо выполнять обычный поиск, поскольку макросы emacs полагаются на работу isearch)
    • <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. Завершите оператор 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. Убить буфера
    • <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...это правда? действительно ли нет библиотек HTTP для vimscript?
кошка
В vanilla vim, по крайней мере, ничего нет, но краткий поиск в Google не вызвал никаких библиотек 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);}}
SuperJedi224
источник
Святые кошки. Только импорт составляет 79 байт ... возможно, вам стоит попробовать Groovy? : P
кот
1
Меня действительно радует тот факт, что вы должны установить строку user-agent самостоятельно. Мол, как будто Java не достаточно многословен
кошка
Потому что Google дает 403, если вы этого не сделаете.
SuperJedi224
2
Почему бы не использовать вход argsвместо StdIn?
Павел
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]

Назначьте лямбду на то, чтобы это назвать.

Использует библиотеку запросов .

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
@shelvacu Ой, я умный, я забыл quoteвернуться urllib.parse.quoteпосле абсолютного импорта.
кот
ты проверял это? Похоже, что google.co/search дает 404, тогда как google.com/search работает
Shelvacu
@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 байта.

Используется та же unkillableфункция, что и в ответе « 196 Byte Фактор» (анализируемый HTML), и сокращается по сравнению с предыдущим ответом регулярного выражения.

Джонатан Лич-Пепин
источник
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 <))
Кот
источник