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


26

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

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

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

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

입력 google및 microsoft
출력 :google

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

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

입력 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(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#sults및 Another 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.