Google의 평균 길이


24

나는 Pyth의 URL 요청 기능을 어지럽히고 있었고, Google은 항상 약간 다른 길이, 일반적으로 ~10500문자 로 응답을 보았습니다 .

따라서이 과제의 과제는에서 HTML 응답의 평균 길이를 인쇄하는 것 http://google.com입니다.

명세서

  • n요청 횟수 인 입력 을받습니다.
  • 각 요청에 대해 HTTP 받기 요청을합니다.
  • 헤더가 아닌 응답 본문 (html 텍스트)을 계산합니다.
  • 반응 길이의 산술 평균을 출력합니다.
  • http://google.com다른 URL 이 아닌 url에만 액세스 할 수 있습니다 .
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

입력 샘플 출력 10: 10560.1

(저는 파이썬을 사용 urllib했습니다)

추신 : 구글이 왜 이것을하는지 아는 사람이 있습니까?


1
이상한, http://google.com항상 나를 위해 261 바이트를 https://google.com/ncr반환하지만 더 많은 것을 반환 할 수 있습니다.
Neil

http://google.com@Neil Odd는 항상 10422 바이트를 반환합니다.
LegionMammal978

정수 비율 (즉, 정확한 분수)을 반환 할 수 있습니까?
LegionMammal978

5
@Neil 실제로 261 바이트를받습니다. 실제로 코드 재 지정 인 코드 302가 본문에 따라야 할 새 URL이 있기 때문입니다. Linux의 curl과 같은 일부 프로그램은 새 URL을 자동으로 따르기 위해 특정 인수가 필요합니다.
seshoumara

3
@seshoumara TBH 과제는 리디렉션을 따르도록 지정하지 않으므로 기본적으로 Neil의 답변은 http://google.com보내는 실제 HTTP 응답을 처리하기 때문에 정답이 될 것으로 기대합니다 . 물론 이것은 도전의 핵심이 아니므로이를 반영하기 위해 도전을 편집해야합니다.
Aaron

답변:


20

배쉬 + 시스템 유틸리티, 56 53 49 48 바이트

업데이트 : Digital Trauma 덕분에 4 바이트 , Dennis 덕분에 1 바이트 이상 절약

curl -L `yes google.com|sed $1q`|wc|dc -e1k?$1/p

내 원래의 대답에서 나는 for 루프를 에뮬레이트하기 위해 yes함께 사용 하고 있었습니다 xargs. 그러나 curlURL 목록을 입력으로 받아 들일 수 있으므로yes 실제로 필요합니다.

경우 curl액세스 google.com는 , 상기 본체 부에 새로운 URL을 갖는 페이지 (302) 재를 수신하므로-L 옵션을 따를 필요하다.

실행 예 : 답변이 STDOUT으로 인쇄되고 명확성을 위해 STDERR을 리디렉션합니다.

me@LCARS:/PPCG$ ./google_length.sh "8" 2> /dev/null
10583.2

설명: (처음 제출 된 코드 중)

yes google.com|     # repeatedly output a line containing the string "google.com"
sed $1q|            # print the first $1 lines only (shorter than head -$1)
xargs curl -sL|     # xargs reads the input lines and executes "curl -sL" with the
                    #current input line as an additional argument.
wc -m|              # count the number of characters
dc -e1k?$1/p        # dc script: set precision to 1, read input, push $1 and divide

편집 : 내가 교체 wc -mwc하더라도 인수없이 내가 원하는 것보다 2 개 통계를 출력하기 때문에, 같은 dc이 출력을 다음 스크립트가 여전히 작동, 우리가 원하는 카운트가 있기 때문에, 즐겁게, 구문 분석하는 동안 스택의 상단에 배치.


@DigitalTrauma 아주 좋은, 필요 없습니다 xargs. 고마워, 나는 대답을 업데이트했다.
seshoumara 2012

2
당신은 필요하지 않습니다 -s. STDERR에 스트레이 출력이 기본적으로 허용됩니다.
Dennis

@Dennis 감사합니다. 답변이 업데이트되었습니다.
seshoumara

17

MATL , 28 바이트

:"'http://google.com'Xin]vYm

Gif 또는 발생하지 않은 경우 :

enter image description here

작동 원리

:                      % Implicitly input n. Push [1 2 ... n]
"                      % For each
  'http://google.com'  %   Push this string
  Xi                   %   URL read. Gives a string
  n                    %   Number of elements
]                      % End
v                      % Concatenate stack contents into a vertical vector
Ym                     % Mean. Implicitly display

12

PowerShell , 48 바이트

1.."$args"|%{irm google.com}|measure Le* -a|% A*

설명

  1. 1에서 입력 정수 까지의 범위를 만듭니다 .
  2. Google 홈페이지 범위 Invoke-RestMethod( irm)의 각 값에 대해 결과는 JSON이 아니므로 역 직렬화하는 대신 본문 그대로를 반환합니다.
  3. 로 보내기 Measure-Object(measure ) )로 평균Length입력 문자열 (본문) 속성을 .
  4. 결과 Average속성을 확장하십시오 .

알고하지 않았다 |% A*가능했다, 나는 항상 피해야 한 measure생각 때문에 그럴 수없는 와일드 카드 속성 이름 ...
colsw

2
@ConnorLSW 예, 이것은 PowerShell에서 코드 골프에 대한 프레젠테이션을 준비하는 동안 최근에 발견 한 것입니다. |? A*멋진 것들도 확인하십시오 . 프리젠 테이션 파일을보고이 내용을 팁 스레드에 추가해야합니다.
briantist


10

자바 (8) 197 184 182 181 바이트

골프 :

n->{int s=0,i=0;while(i++<n)try{s+=new java.util.Scanner(new java.net.URL("http://google.com").openStream()).useDelimiter("\\A").next().length();}catch(Exception e){}return s*1f/n;}

언 골프 드 :

public class AverageLengthOfGoogle {

  public static void main(String[] args) {
    float bytes = f(n -> {
      int s = 0, i = 0;
      while (i++ < n) {
        try {
          s += new java.util.Scanner(new java.net.URL("http://google.com").openStream())
              .useDelimiter("\\A").next().length();
        }
        catch (Exception e) {
        }
      }
      return s * 1f / n;
    } , 10);
    System.out.println(bytes);
  }

  private static float f(java.util.function.IntFunction<Float> f, int n) {
    return f.apply(n);
  }
}

이로 인해 리소스가 누출되지만 가장 적은 바이트를 검색하면 지불해야 할 작은 가격입니다.


1
가능한 개선 사항 : 1.
double-

@ kukis 덕분에 13 바이트를 줄였습니다.

n->{int s=0,i=0;for(;i<n;++i)try{...}catch(Exception e){}return s*1.0/n;}. 확실하지 대체 할 수 있는지 여부 s*1.0/n와 반환에 s*1f/n, 그러나 그것의 가치가 시도
로마 그라프

@ RomanGräf 예, 작동합니다. 감사!

for(;i<n;++i)for(;i++<n;)-1 바이트 로 변경할 수 있습니다 .
Kevin Cruijssen '

7

Pyth, 25 바이트

.OmslM'"http://google.com

'는 Pyth의 공개 함수이며로 시작하는 문자열이 제공되면 http해당 웹 사이트에 대한 GET을 수행합니다. 반환 값은 bytes객체 의 목록입니다 . 불행히도 Pyth 's s는 이러한 객체를 연결하는 방법을 모르기 때문에 대신 총 길이를 얻는 데 ls사용 slM합니다. 이의 입력과 동일한 횟수만큼 수행 m되며 결과는의 평균입니다 .O.


7

05AB1E , 15 바이트

암호:

F’Š¹.ŒŒ’.wgO}¹/

설명:

F           }     # Input times do..
 ’Š¹.ŒŒ’          #   Push the string "google.com"
        .w        #   Read all and wrap into a string
          g       #   Get the length
           O      #   Sum it up with the total
             ¹/   # Divide by input

CP-1252 인코딩을 사용합니다 . 오프라인 인터프리터에서 실행하면 다음과 같은 결과가 나타납니다.

> py -3 05AB1E.py -c test.abe
1
11039.0

> py -3 05AB1E.py -c test.abe
2
11070.0

> py -3 05AB1E.py -c test.abe
3
11046.666666666666

> py -3 05AB1E.py -c test.abe
4
11029.75

> py -3 05AB1E.py -c test.abe
5
11015.8

google.com 용으로 내장되어 있거나 다른 작업이 진행 중입니다!
Pureferret 2012

@Pureferret 실제로 사전 압축 문자열입니다. 여기서 시도해 볼 수 있습니다 :).
Adnan

골프 전용 언어를 사용할 수 있습니까? 그렇다면, 내가 이론적으로 한 바이트에이 모든 일을 할 것입니다 언어를 할 수있는 경우
kukis

@kukis 사용 되는 언어 버전이 문제를 해결하지 못하는 경우에만 전용 골프 언어를 사용할 수 있습니다. 이러한 모든 작업을 1 바이트로 수행 할 수있는 언어를 구성했지만 컴파일러가 문제를 해결 한 후에는 thisthis 를 모두 위반하는 것입니다 .
Adnan

7

PHP, 90 78 바이트

while($i++<$argv[1]){$s+=strlen(file_get_contents('http://google.com'));}echo $s/$argv[1];

while($i++<$argv[1])$s+=strlen(join(file('http://google.com')));echo$s/($i-1);
  • 주석 작성자가 언급 한대로 더 짧은 함수 / 변수를 사용하고 불필요한 구문 구조를 제거했습니다.

2
codegolf.se에 오신 것을 환영합니다! join(file())대신 file_get_contents()몇 바이트 를 절약합니다.
Christoph

2
또한 중괄호와 뒤에 공백을 넣을 수 있습니다 echo. 또한 제수 $i대신 사용할 수 있습니다 $argv[1].
user59178

6

수학, 58 바이트

N@Mean[StringLength@URLFetch@"http://google.com"~Table~#]&

익명의 기능. 숫자를 입력으로 받아서 숫자를 출력으로 반환합니다.


왜 필요한 N@가요? 당신은 그것을 인쇄하지 않기 때문에, 그것을 멋지게 포맷 할 이유가 없습니다.
Pavel

@Pavel OP는 정확한 분수가 허용되지 않도록 지정했습니다.
LegionMammal978

3

파이썬, 102 바이트

import urllib2
f=lambda n:sum([len(urllib2.urlopen(x).read()) for x in ['http://google.com']*n],0.0)/n

또는 float 대신 정수를 반환 할 수 있으면 98 바이트가 될 수 있습니다.

import urllib2
f=lambda n:sum([len(urllib2.urlopen(x).read()) for x in ['http://google.com']*n])/n

1
거기에서 몇 개의 공백을 제거 할 수 있습니다. )for x in[. 또한 자신을 Python 3으로 제한하면 나눗셈이 자동으로 부동 나눗셈이되고을 제거 할 수 있습니다 0.0.
mbomb007

1
또한 필요하지 않은 []2 경우 - sum소요generator
Bahrom

3

CJam , 23 바이트

rd_"google.com"a*:gs,\/

보안상의 이유로 TIO에서는 작동하지 않습니다.

시운전

$ echo -n 'rd_"google.com"a*:gs,\/' > google-avg.cjam
$ wc -c google-avg.cjam
23 google-avg.cjam
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10663.2
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10650.0
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10651.0
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10651.4
$ java -jar cjam-0.6.5.jar google-avg.cjam <<< 10; echo
10673.5

작동 원리

 rd                      e# Read a double from STDIN. Let's call it D.
   _                     e# Push a copy of D.
    "google.com"a        e# Wrap the string in an array, pushing ["google.com"].
                 *       e# Repeat the array D times.
                  :g     e# Map `get` over the array, making D requests to the URL.
                    s    e# Combine all D responses into a single string.
                     ,   e# Compute the length.
                      \  e# Swap the length with the original D.
                       / e# Perform division.

1

CJam, 27 바이트

{"google.com"g,}ri*]_:+\,d/

지정되지 않은 경우 CJam은 HTTP를 가정합니다.

설명

{"google.com"g,}             A block which fetches from http://google.com and gets its length
                ri*          Run this block a number of times equal to the input
                   ]         Collect all the results in an array
                    _        Duplicate the array
                     :+      Sum it
                       \     Swap back to the original array
                        ,    Get its length
                         d/  Cast to double and divide 
                              (without casting, it would be integer division)

1

클로저, 102 바이트

(fn[n](/(reduce + 0.0(repeatedly n #(count(slurp(clojure.java.io/reader"http://www.google.com")))))n))

언 골프 드 :

(fn [n]
  (/
   (reduce + 0.0
           (repeatedly n
                       #(count (slurp (clojure.java.io/reader "http://www.google.com")))))
   n))

#(count (slurp (clojure.java.io/reader "http://www.google.com")))는 http 요청에서 Google로 바이트를 계산하고 repeatedly함수를 n 번 호출하고 반환 된 카운트에서 목록을 만들고 결과의 합계를 줄이고 최종적으로 평균으로 만들기 위해 n으로 나눈 로컬 함수입니다 . 감소는 0.0에서 시작하여 결과를 부동으로 만듭니다. 그렇지 않으면 나눗셈이 합리적입니다. 요청의 이름을 지정하는 데 여러 번 걸리는 익명 함수로 전체 내용이 래핑됩니다.


나는이 답변을 복사하지 않았다고 맹세합니다! 광산은 당신과 아주 가깝게 끝났습니다. 이 (clojure.java.io/reader)부분은 불필요합니다. 문자열을 전달하면 장면 뒤에서 자동으로 수행됩니다.
Carcigenicate 2019

1

파이썬 3, 95 바이트

재귀 솔루션

import requests as r
f=lambda n,t:f(n-1,t+len(r.get('http://google.com').text)) if n>0 else t/i

어디에 n=i=int(input())

요청 라이브러리


요청은 외부 라이브러리 인 것으로 보이므로 링크를 추가하고 싶을 것입니다. 뭔가 같은Python 3 + [Requests](http://docs.python-requests.org/en/master/user/install/#install), 95 bytes
값 잉크

@ValueInk는 덧붙여서 설치할 필요는 없지만 python3과 함께 제공됩니다 (적어도 기본적으로 나에게 제공됩니다). 다른 파이썬 답변이 왜 필요하지 않습니까?
Miguel

urllib2기본 (사전 설치) Python 라이브러리 docs.python.org/2/library/urllib2.html 이므로 Python을 다운로드하는 사람은 즉시 코드를 실행할 수 있습니다. 해당 라이브러리가 없으면 Python 3에서 코드를 실행할 수 없습니다.
Value Ink

@ValueInk 문제 없음, 첫 번째 기여는, 몰랐습니다
Miguel

1

펄, 66 바이트

perl -MLWP::Simple -pe'map$t+=length get"http://google.com",1..$_;$_=$t/$_'

51 바이트 + 14 바이트 -MLWP::Simple<space>를위한 1 바이트 + -p.

LWP :: Simple을 사용한 간단한 솔루션 . 그만큼get 함수는 기본적으로 내보내지고 성공하면 응답 내용을 반환합니다.

Perl 5.14+, 94 93 바이트 (코어 모듈 만)

perl -MHTTP::Tiny -pe'map$t+=length${+get{new HTTP::Tiny}"http://google.com"}{content},1..$_;$_=$t/$_'

79 바이트 + 13 바이트 -MHTTP::Tiny<space>+ 1 바이트-p .

HTTP :: Tiny를 사용합니다Perl 5.14부터 코어에 있었던 .

작동 원리

이:

get{new HTTP::Tiny}"http://google.com"

는 IS 간접 객체 구문 이에 상응 :

HTTP::Tiny->new->get("http://google.com")

3 바이트를 절약합니다. 이 get메소드는 아래에 저장된 내용으로 해시 참조를 반환합니다.content 키 .

실제 응답 내용을 얻으려면 다음을 수행하십시오.

${+get{new HTTP::Tiny}"http://google.com"}{content}

이는 다음과 같습니다.

(get{new HTTP::Tiny}"http://google.com")->{content}

그러나 우리가 추가하면 1 바이트를 절약합니다 length.

length(foo)->{bar}  # wrong, equivalent to (length(foo))->{bar}
length+(foo)->{bar}
length${+foo}{bar}

0

리볼, 69 바이트

n: 0 loop i: do input[n: n + length? read http://www.google.com]n / i

0

클로저, 70 바이트

#(/(reduce(fn[a _](+ a(count(slurp"http://google.com"))))0(range %))%)

n장거리에 걸쳐 접 힙니다 . 각 요청의 길이를 합한 다음 요청 수로 나눕니다. Clojure가 나누기를 처리하는 방식으로 인해 소수점이 아닌 분수를 반환합니다. 이것이 용납 할 수 없다면 몇 바이트의 비용으로 해결할 수 있습니다.

(defn avg-request-len [n]
  (/
    (reduce (fn [acc _]
              (+ acc (count (slurp "http://google.com"))))
            0
            (range n))
    n))

0

루비, 73 + 10 = 83 바이트

-rnet/http플래그를 사용합니다 .

->n{s=0.0;n.times{s+=Net::HTTP.get(URI"http://www.google.com").size};s/n}

0

일반적인 Lisp + quicklisp / dexador , 23 + 72 = 95 바이트

시스템에 quicklisp이 설치되어 있으면 필요에 따라 dexador를 다운로드하여 설치합니다.

전주곡:

(ql:quickload :dexador)

암호

(lambda(n)(/(loop :repeat n :sum(length(dex:get"http://google.com")))n))

언 골프 드 :

(lambda (n)
  (/ (loop :repeat n 
           :sum (length (dex:get "http://google.com")))
     n))

설명

(dex:get "http://google.com")

이렇게하면 웹 요청이 Google에 수행되고 5 개의 값이 반환됩니다.

  1. 콘텐츠 요청에 따라 웹 요청 자체를 문자열 또는 바이트 배열로
  2. http 상태 코드
  3. http 응답 헤더의 해시 맵
  4. 리디렉션 해결 후 최종 URI를 나타내는 QURI 객체
  5. 웹 서버와 통신하는 데 사용되는 소켓

(length (dex:get ...))

명시 적으로 요청하지 않으면 Common Lisp은 첫 번째 이외의 모든 반환 값을 삭제하므로 length 함수는 http 응답 자체 만보고이 문자열의 길이를 반환합니다.

(loop :repeat n :sum (length ...))

응답 길이 n을 계산하여 추가합니다.

(/ (loop ...) n)

이것은 합산 된 길이를 n으로 나누어 평균을 계산합니다.

(lambda (n) ...)

이것은 코드 본문을 익명 함수로 감싸서 n을 인수로 사용하고 n 개의 웹 요청에 대한 평균 응답 길이를 http://google.com으로 반환합니다 .

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