Emacs 또는 Vim 중 어느 것이 더 낫습니까? (구글 파이트)


26

인사말, 고귀한 코드 골퍼. 오늘 당신은 Emacs 또는 Vim?

두 개의 검색어를 입력으로 사용하여 해당 검색어 중 Google 검색 결과가 가장 많은 검색어를 출력해야합니다. (이것은 명백히 공평합니다. 편향이란 무엇입니까?)

다음은 입력 및 출력의 예입니다.

입력 : emacsvim
출력 : vim(설명에 화염을 일으키지 않음)

입력 googlemicrosoft
출력 :google

입력 code golf stack exchangecode review stack exchange
출력 : code golf stack exchange(yeah!)

다음은 재미를 위해 (그리고 솔루션을 테스트하기위한) 일부 경우입니다.

입력 About 1,000,000 resultsAbout 100,000 results
출력 :About 100,000 results

입력 : This will autocotrectAnother testcase
출력 : Another testcase(자동 수정을 고려하지 않으면 첫 번째가 이길 것입니다)

다음 테스트 사례의 경우 #검색어에서 특정 양의 결과가있는 용어에 의존하고 여기에 해당 용어를 게시하면 해당 단어가 손상 될 수 있으므로 검색어 의 부호 를 먼저 제거해야합니다 .

입력 Thissear#chter#mhasno#resultsAnother testcase
출력 : Another testcase(0의 결과 만 테스트)

입력 "These exact wo#rds do#n't exi#st# on the Internet"Another testcase
출력 : Another testcase(테스트 "s)

입력 : Abo#ut 1,65#2,85#3,2#86 re#sultsAnother testcase
출력 : Another testcase(이것은 까다 롭습니다-위의 검색어에는 하나의 결과가 있습니다)

입력 : "Abo#ut 4#8,234,8#75,14#7 res#ults"Another testcase
출력 : Another testcase(또한 까다로워서 검색 결과가 없으므로 검색어를 표시합니다)

"quoted"너무 복잡하기 때문에 "결과가없고 따옴표없이 결과를 표시합니다"라는 검색 결과 를 처리 할 필요가 없습니다 . 같은 수의 결과를 가진 입력도 처리 할 필요가 없습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이길 것입니다!


Psst ... 허용 된 답변을 변경해야합니다. D
cat

@tac 또는 대신 골프를 밟을 수도 있습니다. ;)
Doorknob

출력 / 반환 값은 얼마나 유연합니까? 문자열이어야합니까, 아니면 문자열과 결과 수를 포함하는 배열이거나 문자열 만 포함하는 배열 일 수 있습니까?
고양이

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을 제치고 있습니다! :디

이제 더 나은 정규식. @fede s 에게 감사합니다 . 에 대한 5 바이트 off!

[ 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 아직 가까이 다가 왔습니다
cat

@EasterlyIrk 내가 해냈어!
고양이

1
누군가 팩터 골프 방언, 너무 많은 공백, 단어를 너무 길게 만들어야합니다 ... 잘하셨습니다.
페더

1
unkillable방법에 감사드립니다 . 실제로 정규 표현식을 사용하는 것보다 powershell이 습니다. (여전히 정규식 답변보다 2 바이트 더 깁니다). 나는 그것의 명령 이름이 짧은 경우는 거의 없지만 PowerShell을 간결를 호출 할 것이다 ( iwr대한 기본 별칭으로 발생 invoke-webrequest하고 sort대한 sort-object그렇지 않으면 더 이상 해당 될 것)
조나단 리치 - Pepin에

7

루비, 203180 바이트

->*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.com/... NB합니다. "About * results"와 일치하는 정규 표현식은이 페이지에서 찾은 결과를 놓치게됩니다 :(
draegtun

그것은 나를 위해 작동하지 않습니다. ideone.com/UqEyBn
TheDoctor

@TheDoc이 Ideone 작업을하지 않습니다 - 실제 루비에서 실행
손잡이

ruby -ropen-uri파일 대신 명령을 요구하여 몇 바이트를 더 절약 할 수 있습니다 .
Shelvacu

왜 "약 100,000,000 개의 결과"와 같은 검색에서이 (및 다른 정규식 답변)가 중단되지 않습니까?
cat

7

문제에 언급 된 텍스트 편집기 중 하나만이 문제를 해결할 수 있습니다 ...

이맥스 : 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>

버퍼의 시작 부분에 커서를두고 첫 번째 검색어는 첫 번째 줄에 있고 두 번째 검색어는 두 번째 줄에있을 것으로 예상합니다.

이맥스에 익숙하지 않은 사람들에게는

  • C-s의미 Ctrl-S합니다.
  • M-z의미 Alt-Z( Alt아마도 메타 키일 수 있음)
  • M-<수단 Alt-<또는Alt-Shift-,
  • C-S-e 방법 Ctrl-Shift-e

이맥스에 익숙한 사람들에게는

  • 로 emacs를 시작하십시오 emacs -q. 그것은 .emacs파일을 로드하지 않으므로 멋진 패키지는이를 방해하지 않습니다.

설명

  1. elisp statment shell의 시작 부분을 작성하십시오

    • <C-o><C-u><C-k> 줄 바꿈으로 인수를 저장합니다
    • (if(<<C-y><C-y> if 문의 시작을 작성하고 인수의 사본 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>이맥스는 원시 HTML을 검색합니다 ( b-em약칭 browse-url-emacs).
    • <C-x><C-q> 파일을 쓰기 가능하게 만듭니다 (매크로가 오류를 발생시키지 않도록 필수)
    • <C-s><RET>ts"><RET> 결과 수 div로 이동 (emacs 매크로는 isearch를 사용하여 작동하므로 정기적 인 검색이 필요함)
    • <M-z><diff의 텍스트를 자릅니다 (이것이 필요한 이유입니다)
    • <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...그게 사실입니까? vimscript에 대한 HTTP 라이브러리가 실제로 없습니까?
cat

바닐라 vim에는 최소한 아무것도 없지만 간단한 인터넷 검색은 vimscript HTTP 라이브러리를 팝업하지 않았습니다. 나는 당신이 결과를 읽고 curl같은 효과를 얻을 수있을 때 누군가가 실제로 그것을 쓰는 이유를 상상할 수 없습니다 . (그러나 대답은 vim + curl임을 나타냅니다).
Dominic A.

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 바이트입니다. 아마도 Groovy를 시도해야합니까? : P
고양이

1
나는 사용자 에이전트 문자열을 직접 설정해야한다는 사실에 정말로 즐겁습니다. 마치 Java가 충분히 장황하지 않은 것처럼
cat

그렇지 않으면 Google이 403을 제공하기 때문입니다.
SuperJedi224

2
argsStdIn 대신 입력을 받아 보십시오.
Pavel

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

@shelvacu 아차, 나는 똑똑하고, 나는 변경 깜빡하고있어 quote뒤로 urllib.parse.quote절대 가져온 후.
고양이

이것을 테스트 했습니까? google.co/search는 404를 제공하는 반면 google.com/search는 작동합니다.
Shelvacu

@shelvacu 예, 테스트했습니다. 루비 답변과 동일한 결과를 제공하며 질문에 나와 있습니다.
cat

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 바이트가 더 줄어 듭니다.

이것은 요인 답변 (구문 분석 된 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

그들이 그것을 괄호 안의 길을 잃었다 고 부르는 이유가 있습니다.

언 골프 드 :

#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 <))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.