Що краще - Emacs чи Vim? (Боротьба з 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(цей складний - вищевказаний пошуковий термін має один результат)

Input: "Abo#ut 4#8,234,8#75,14#7 res#ults"and Another testcase
Output: Another testcase(також хитро - немає результатів, тому він відображає пошуковий термін)

Вам не потрібно обробляти кутовий випадок "quoted"пошуку, повертаючи "Немає результатів, натомість показує результати без лапок", тому що це було б занадто складно. Вам також не потрібно обробляти вхідні дані з однаковою кількістю результатів.

Це , тому найкоротший код у байтах виграє!


Psst ... слід змінити прийняту відповідь: D
кіт

@tac Як варіант, я можу замість цього пограти в гольф, що я і зробив. ;)
Дверна ручка

Наскільки гнучким є вихід / повернення? Чи це повинен бути рядок, чи це може бути масив, що містить рядок та кількість отриманих результатів, або масив, що містить лише рядок?
кіт

3
це так зрозуміло, ніж vim, краще я здивувався цьому питанню, що хтось міг повірити, що щось краще
Пуховик

Відповіді:


5

Фактор , 305 201 196 200 201 188 184 182 179 169 178 171 165 199 171 170 165 163 байт

Мова майже така ж багатослівна, як Java, побиття Рубі ... та 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метод. Насправді це коротше, ніж використання регулярного вираження. (І все ж на 2 байти довше, ніж відповідь на регулярний вираз). Я б не називав powerhell 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. Будь-яке регулярне вираження, що відповідає "Про * результати", пропустить знайдений результат на цій сторінці :(
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> Перейдіть до кількості результатів пошуку (потрібно регулярно шукати, оскільки макроси Emacs покладаються на пошук пошуку для роботи)
    • <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 подумає, що ви робот і блокуєте доступ для atime
    • Якщо макрос повертає щось подібне <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?
кіт

У ванільному вімі принаймні нічого немає, але короткий гуглінг не вискочив жодної вимскрипті 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);}}

Святі коти. Сам імпорт становить 79 байт ... можливо, вам варто спробувати Groovy? : P
кішка

1
Мені дуже цікаво тим, що ви повинні самостійно встановити рядок агент-користувач. Мовляв, ніби Java недостатньо багатослівна
кішка

Тому що Google дає 403, якщо ви цього не зробите.
SuperJedi224

2
Чому б не взяти дані argsзамість StdIn?
Павло

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]

Призначте лямбда на те, щоб назвати це.

Використовує бібліотеку запитів .

Безголівки:

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

@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.о

Є причина, що вони називають це Загубленим у морі батьків.

Безголівки:

#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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.