Googleの平均長


24

私はPythのURLリクエスト機能をいじっていましたが、グーグルがいつも少し違う長さのレスポンスを返すことに気づきました~10500。通常はキャラクターです。

したがって、このチャレンジでのあなたのタスクは、からのhtmlレスポンスの平均長を出力することですhttp://google.com

スペック

  • 入力nするリクエストは、作成するリクエストの数です。
  • 各リクエストに対して、HTTP getリクエストを作成します。
  • ヘッダーではなく、応答本文(htmlテキスト)をカウントします。
  • 応答の長さの算術平均を出力します。
  • urlのみにアクセスできますが、http://google.com他にはアクセスできません。
  • これはなので、バイト単位の最短コードが勝ちです!

入力のサンプル出力10 10560.1

(そのためにPythonを使用しurllibました)

PS:グーグルがこれをする理由を誰か知っていますか?


1
奇妙な、http://google.com私には常に261バイトを返します... https://google.com/ncrしかし、もっと返すかもしれません。
ニール

@Neil奇数は、http://google.com常に...私のために10422のバイトを返す
LegionMammal978

整数の比率(つまり、正確な分数)を返すことができますか?
LegionMammal978

5
@Neil実際にURLリダイレクト、コード302を受信するため、261バイトを受け取ります。Linuxのcurlなど、一部のプログラムでは、新しいURLを自動的にたどる特定の引数が必要です。
seshoumara

3
@seshoumara TBHの課題は、それが実際のHTTPレスポンス扱うので、私は、ニールの答えは、デフォルトでは正解であることを期待するので、リダイレクトに従うことを指定していないhttp://google.com送信を。もちろん、これは課題のポイントではないため、IMOを編集してそれを反映する必要があります。
アーロン

回答:


20

Bash +システムユーティリティ、56 53 49 48バイト

更新:Digital Traumaのおかげで4バイト、Dennisのおかげでさらに1バイト節約

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

私の最初の答えでは、forループをエミュレートするためyesに組み合わせて使用しxargsていました。ただしcurl、入力としてURLのリストを受け入れることができるため、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 -mましたwc。引数がなくても、必要な統計よりも2つ多くの統計がdc出力される場合でも、この出力に続く同じスクリプトが引き続き機能します。これは、必要なカウントが解析中にスタックの一番上に配置されるためです。


@DigitalTraumaとてもいい、必要なしxargs。ありがとう、答えを更新しました。
seshoumara

2
必要ありません-s。STDERRへの漂遊出力はデフォルトで許可されています。
デニス

@Dennisありがとう、回答が更新されました。
seshoumara

17

MATL、28バイト

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

Gifまたはそれは起こりませんでした:

ここに画像の説明を入力してください

使い方

:                      % 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. 範囲内の各値Invoke-RestMethodirm)Googleホームページ。結果はJSONではないため、ボディをデシリアライズする代わりに逐語的に返します。
  3. それをMeasure-Objectmeasure)に送信しLength、入力文字列(ボディ)のプロパティの平均を取得します。
  4. 結果のAverageプロパティを展開します。

知らなかった|% A*ことができました、私はいつも避けてきたmeasure...私はあなたがワイルドカードプロパティ名ではないと考えていたので
COLSW

2
@ConnorLSWはい、これはPowerShellでコードゴルフに関するプレゼンテーションを準備しているときに最近発見したものです。|? A*いくつかのクールなものもチェックしてください。プレゼンテーションファイルを見て、この内容をヒントスレッドに追加する必要があります。
ブリアンティスト


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.ダブル- >フロート2. google.com - > google.com 3.多分エンコーディングを指定する必要はありません、あなたはいくつかの20バイトを保存する必要があり、いくつかの推奨されない方法があるべき
kukis

@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バイトに変更できます。
ケビンCruijssen

7

Pyth、25バイト

.OmslM'"http://google.com

'はPythのオープン関数であり、で始まる文字列が与えられるとhttp、そのWebサイトへの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

@Pureferret実際には辞書圧縮された文字列です。ここで試してみてください :)。
アドナン

ゴルフ専用の言語を使用できますか?もしそうなら、私は理論的には1バイトでこれらの事のすべてを行います言語を作ることができます
kukis

@kukis使用する言語バージョンがチャレンジを延期しない場合にのみ、専用のゴルフ言語の使用が許可されます。これらすべてを1バイトで実行できる言語を作成しても、コンパイラがチャレンジ後に作成された場合、thisthisの両方に違反しています。
アドナン

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()数バイト節約します。
クリストフ

2
さらに、中かっことスペースをドロップできますecho。また、除数の$i代わりに使用することもできます$argv[1]
user59178

6

Mathematica、58バイト

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

匿名関数。入力として数値を受け取り、出力として数値を返します。


なぜ必要N@ですか?あなたはそれを印刷していないので、うまくフォーマットする理由はありません。
パベル

@Pavel OPは、正確な分数が許可されないことを指定しました。
LegionMammal978

3

Python、102バイト

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

または、フロートではなく整数を返すことができる場合、答えは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
あなたはまた、必要としない[]第二の場合には- 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

Clojure、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")))は、Googleへのhttpリクエストからバイトをカウントしrepeatedly、関数をn回呼び出して、返されたカウントからリストを作成し、結果を合計し、最後にnで割って平均を計算するローカル関数です。リデュースは、結果を強制的にフロートにするために0.0から開始されます。そうでない場合、除算は合理的です。すべてが匿名関数でラップされており、リクエストに名前を付けるのに何度も時間がかかります。


私はこの答えをコピーしなかったことを誓います!私のものはあなたのものにかなり近くなりました。その(clojure.java.io/reader)部分は不要です。文字列を渡すと、舞台裏で自動的に実行されます。
発がん性物質

1

Python 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に付属しています(少なくとも、デフォルトでは私に付属しています)。他のPythonの答えがそれをする必要がないのはなぜですか?
ミゲル

urllib2は、ネイティブ(プリインストール)Pythonライブラリdocs.python.org/2/library/urllib2.htmlであるため、Pythonをダウンロードする人はすぐにコードを実行できます。そのライブラリがないと、Python 3でコードを実行できません。
バリューインク

@ValueInk問題ありません、ここでの私の最初の貢献、私は知りませんでした
ミゲル

1

Perl、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"

これは、これに相当する間接オブジェクト構文です。

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

Clojure、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

Common 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へのWebリクエストが実行され、5つの値が返されます。

  1. 文字列またはバイト配列としてのWebリクエスト自体(コンテンツタイプに応じて)
  2. httpステータスコード
  3. HTTP応答ヘッダーのハッシュマップ
  4. リダイレクトを解決した後の最終的なURIを表すQURIオブジェクト
  5. Webサーバーとの通信に使用されるソケット(サーバーまたは関数のオプション引数のいずれかによって閉じられなかった場合)

(length (dex:get ...))

そうでないと明示的に要求しない場合、Common Lispは最初以外のすべての戻り値を破棄するため、長さ関数はhttp応答自体のみを参照し、この文字列の長さを返します。

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

これにより、応答の長さがn回計算され、加算されます。

(/ (loop ...) n)

これは、合計された長さをnで除算して平均を計算します。

(lambda (n) ...)

これは、引数としてnを受け取り、http://google.comへのn個のWebリクエストの平均応答長を返す匿名関数でコード本体をラップします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.