Stackoverflowの賞金はいくらですか?


33

仕事:

あなたは素晴らしいプログラマーであり、Stackoverflow-answererであり、Stackoverflowの恩恵ですべての質問に答えることにします。あなたは非常に優れているので、すべての質問ですべての賞金を得ることができます。担当者があふれるのを待つ間、プログラムを作成して、すべての報奨金の担当者の合計額を調べます。

ルール:

  • 実行すると、
    • プログラムは、スタックオーバーフローの機能タブをナビゲートします。
    • 各賞金の価値を削り出し、
    • 次に、合計して合計を表示します
  • SO(およびSOのみ)のどこからでもデータをダウンロードする必要がありますが、約10ページしかないため、https://stackoverflow.com/questions?pagesize=50&sort=featuredを使用することをお勧めします
  • これはなので、最短のコードが優先されます


2
stackoverflow.com/?tab=featured。1ページに掲載されているすべての質問。
Nzall 14

7
@NateKerkhofsそれだけではありません。一番下までスクロールします。例えば、ロードしたばかりのとき、472問中96問が表示されていました。
バザーグ14


@justhalfは既に議論されています...
TheDoctor 14

回答:


23

JavaScript- 176 133 130 108 106

function f()(t+=$("[title~=an]").text(),u=$("[rel*=x]")[0])?$("html").load(u.href,f):alert(eval(t));f(t=0)

編集1:いくつかのセレクターをトリミング?:し、Googleのクロージャーコンパイラからの提案を使用しました(@Sirko経由-ありがとう)

編集2:s内部のd初期化tとの0代わりに初期化""

編集3:実際に特定のコンテナをターゲットにする必要はなく、ドキュメント全体をスイープできることに気付きました。これにより、大量の.find呼び出しと不要なセレクター(およびそれを保持する変数)

編集4:t関数呼び出しでイニシャライザー;を押し込み(とにかく上に持ち上げられます)、関数を1つのステートメントに押しつぶします(2つのステートメントを3項ステートメント条件内で1つにまとめます){}

:不正行為かどうかはわかりませんが、これは既にを指しているブラウザーのコンソールウィンドウから実行する必要がありますhttp://stackoverflow.com/questions?page=1&sort=featured。それは、jQueryと適切なページングリンクがページ自体で利用可能であるという事実に依存しています。また、Firefoxでのみ動作し、IEやChrome では動作しないようです。

出力(投稿時):

38150 (in an alert dialog)

爆発/コメント

function f()
    //concat all the bounty labels to t (they take the format "+50")
    //happens to be elements with title attribute containing word 'an'
    (t+=$("[title~=an]").text(),
    //find the "next" (has rel=next attribute) button
    u = $("[rel*=x]")[0])       
        ?
        //if there is a next button, load it, and then recurse f again
        $("html").load(u.href,f)
        :
        //else eval the 0+a+b+...+z tally and alert the result
        alert(eval(t))
//kick off the initial scrape (and simultaneously init the total tally)
f(t=0)

s=" #mainbar";d=$(s);t="";function a(){d.find(".bounty-indicator").each(function(){t+=this.innerHTML});(u=d.find("[rel=next]")[0])?d.load(u.href+s,a):alert(eval(t))}a();169-Google Closure Compilerを使用しました。
シルコ14

8
必要な文字の多くをバイパスするための卑劣な言語とコンテキストの選択!(「stackoverflow.com/」など)気に入っています!
AlexC 14

jQueryプラグインを使用して行われたことに言及する必要があると思います。それはそうあるべきだと思う.. :)
Mr_Green 14

Chromeは構文エラーをスローします。関数本体を(括弧で開くと、本当に機能しますか?
thejh 14

@Mr_Green -私はすでに、私は...より多くの注意を引くために、それを太字にしたので、しかし注意
Alconja

21

Python- 232231195183176、174

正規表現を使用してhttps://stackoverflow.com/questions?sort=featuredからHTMLを解析します。

ループの上限はrangeなければなりません。そうでなければ、404のためにコードが発生します。1ページあたりのデフォルトの結果数は15です。これは、コードが使用するものです(文字数を節約するので、同様に効果的です)。fornumber of pages + 1HTTPError?pagesize=50

文字数をさらに減らすヒントについて@Gabeに感謝します。

Golfed

import requests,re;print sum(sum(map(int,re.findall(r"<.*>\+(\d+)<.*>",requests.get("https://stackoverflow.com/questions?sort=featured&page=%u"%i).text)))for i in range(1,33))

出力(投稿時):

37700

ゴルフをしていない

少し読みやすく、理解しやすいはずの、やや未ゴルフのバージョンを次に示します。

import requests, re

print sum(
          sum(
              map( int,
                   re.findall( r"<.*>\+(\d+)<.*>",
                               requests.get( "https://stackoverflow.com/questions?sort=featured&page=%u" % i).text
                   )
              )
          ) for i in range( 1, 33 )
      )

1
あなたは明示的に取り除くことができますforループと176にそれを降り:import urllib,re;print sum(sum(map(int,re.findall(r"<.*>\+(\d+)<.*>",urllib.urlopen("http://stackoverflow.com/questions?sort=featured&page=%u"%i).read())))for i in range(1,33))
ゲイブ

ハードコードされた上限があると、テストが少し難しくなります
Einacio 14


6
@リチャードええ、しかしこれはコードゴルフですので、簡潔さはそれが「良いアイデア」であるかどうかに勝ります。私はそれは...ない空白で恐ろしいワンライナーを書くことも良い考えではありません実際の生活の中で、意味
ティム・グッドマン

3
@Richard htmlの解析とhtmlからの抽出は、かなり異なるタスクです。Webサイトは安定したAPIではないため、この種の抽出で機能することは保証されていません。トニーのコードはビットがovergolfedされているが存在する場合、それは失敗するだろうように、あらゆる含むタグ+の数が続くが。たとえば、質問のタイトルがその形式に適合する場合があります。
CodesInChaos 14

18

Rebol- 164 133 130(404チェックで139)

parseRebolのサブ言語を使用してhtmlを解析します。最初の98ページをチェックします。Pythonソリューションと同じ制約があることに気付きました-繰り返しが多すぎると404エラーが発生し、実行が停止します。多くの改善をしてくれた@rgchrisに感謝します!最大98ページをチェックするように更新されました。

s: 0 repeat n 99[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]s

404のエラーチェック(139):

s: 0 repeat n 99[attempt[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]]s

テスト

>> s: 0 repeat n 20[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]s
== 23600

>> s: 0 repeat n 99[attempt[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]]s
Script: none Version: none Date: none
== 36050

説明

Rebolは空白を無視するため、必要に応じてすべてを1行で入力できます。PARSEは2つの入力を受け取り、最初の引数read join ...は一目瞭然です。しかし、より伝統的なインデントでの方言解析の指示に関するいくつかのコメントがあります:

s: 0
repeat n 99 [
    parse read join http://stackoverflow.com/questions?sort=featured&page= n [
        ;-- match the enclosed pattern 15 times (the rule will fail politely when there are less entries)
        15 [
            ;-- seek the match position up THRU (and including) the string >+
            thru {>+}
            ;-- copy contents at the current position up TO (but not including) <
            copy x to {<}
            ;-- (Basically, run some non-dialected Rebol if this match point is reached) the do is a bit dangerous as it runs the string as code
            (s: s + do x)
        ]
    ]
]
;-- evaluator returns last value, we want the value in S
;-- (not the result of PARSE, that's a boolean on whether the end of input was reached)
s

素敵な...私はいくつかのコメント付きの通常のフォーマットされたバージョンを追加しました、気にしないでください!Rebolがそのようなリテラシーに関する多くの問題をどれだけうまく釘付けにするかを常に見るのは素晴らしいことです(すべてがハーフメグのクロスプラットフォームApacheライセンスの実行可能ファイルにありますが、REFORMのようなものが痛い親指のように突き出ています)その言葉にして「削減し、FORMがREFORMになってされている」行くだけで醜いそれもこだわることは非常にある。ホーソーンああ、あなたはANYと髭剃りのcharオフにSOMEを変更することができます:-)。!
博士Rebmu

おっと、133でなければなりません
rgchris

注:より高いn値にループする必要があります...現在28ページの報奨金があります(ページサイズ15の場合)。ただし、文字数には影響しません。
アルコンジャ14

ありがとうアルコンジャ。ソリューションにさらに文字を追加する前に98ページまで簡単に移動できます。私は家に今夜からテスト再実行する必要があります
johnk

11

ルビー、260

require'open-uri'
require'zlib'
i=b=0
d=''
until /"has_more":f/=~d
i+=1
d=Zlib::GzipReader.new(open("http://api.stackexchange.com/2.2/questions/featured?site=stackoverflow&page=#{i}&pagesize=100")).read
b+=d.scan(/"bounty_amount":(\d+)/).map{|x|x[0].to_i}.reduce :+
end
p b

Stack Exchange APIを使用します。

出力(元の投稿時点):

37200

&pagesize=100文字なしでは機能するため、文字数はカウントしませんが、テスト中に便宜上追加しました。それを削除すると、同じことを行います(ただし、クォータを多く消費し、少し時間がかかることを除きます)。


ニース、Pythonで275になった
Claudiu 14

より多くのクォータを消費します??? SOとSOのみを使用することになっていた。
ジョンドヴォルザーク14

@JanDvorak ??? APIクォータを意味しました。
ドアノブ

1
requiresがと交換することができる-rコマンドラインフラグ。
ジャスティン

8

Rebmu - 108 107

rtN99[parseRDrj[http://stackoverflow.com/questions?sort=featured&page=N][15[thru{>+}copyXto{<}(a+JdoX)]]]j

テスト (19:05 AEST)

>> rebmu [rtN99[parseRDrj[http://stackoverflow.com/questions?sort=featured&page=N][15[thru{>+}copyXto{<}(a+JdoX)]]]j]
Script: none Version: none Date: none
== 79200

Rebmuはかなり不可解に見えますが、ひとたび理解すれば非常に読みやすくなります。まず、アンミューズして適切にレイアウトすることから始めましょう。

rt n 99 [
    parse rd rj [
        http://stackoverflow.com/questions?sort=featured&page= n
    ][
        15 [
            thru {>+}
            copy x to {<}
            (a+ j do x)
        ]
    ]
]
j

RebmuはRebolの方言なので、ソリューションの類似点を確認できます。Rebmuはまだすべてのステートメントのサイズを小さくすることはできませんが、進化する言語です。私の最初の試みの改善に再び@rgchrisに感謝します。


ti(整数に!)はdo、コード長を変更せずにRebmu より安全です。
rgchris 14

6

ルビー-197

短縮版:

require 'nokogiri'
require 'open-uri'
s=0
(1..33).each{|p|Nokogiri::HTML(open("http://stackoverflow.com/questions?page=#{p}&sort=featured")).css('.bounty-indicator').each{|b|s+=b.content.to_i}}
p s

人に優しいバージョン:

require 'nokogiri'
require 'open-uri'
s=0
(1..33).each do |p|
    Nokogiri::HTML(open("http://stackoverflow.com/questions?page=#{p}&sort=featured")).css('.bounty-indicator').each do |b|
        s += b.content.to_i
    end
end
puts s

そして答え- 39700

スクリプトパラメータ付きRuby-139

require 'nokogiri'
require 'open-uri'
s=0
(1..33).each{|p|Nokogiri::HTML(open(ARGV[0]+p.to_s)).css(ARGV[1]).each{|b|s+=b.content.to_i}}
p s

これをbashから実行するには、単に入力します

ruby code_golf_stack_overflow2.rb http://stackoverflow.com/questions?sort=featured\&page= .bounty-indicator

requiresがと交換することができる-rコマンドラインフラグ。
ジャスティン

6

PHP-121バイト

<?for(;preg_filter('/>\+(\d+)/e','$t+=\1',@file('http://stackoverflow.com/questions?sort=featured&page='.++$n)););echo$t;

正規表現の「eval」修飾子を使用して、使用array_sumまたは類似を回避します。有効なエントリの中で最も短いソリューションのようです。


4
このe修飾子はPHP 5.5で非推奨になりましたが、それでもゴルフに便利です。
ファブリシオマット14

6

PHP、134131、127

while($q=array_sum(preg_filter('#.*>\+#',0,file("http://stackoverflow.com/questions?sort=featured&page=".++$n))))$s+=$q;echo$s;

すべてのページをループしますpagesizeバイトを節約するように設定されていませんGET

非常に非常に汚れていますが、... PHPの「欠陥」を利用しています!

  • 後にスペースなし echo
  • while 割り当てで停止
  • RegEx置換後の出力は、報奨金で始まる文字列です
  • array_sum() 文字列を合計します
  • $nそして$s初期化されますが、何もないところから始めるのは同等です。ゼロから始まるように
  • 等...

5

バッシュ206

最適化が可能、怠tooすぎる

s=0;for i in `seq 1 11`;do for j in `wget -q -O - "http://stackoverflow.com/questions?pagesize=50&sort=featured&page=$i" | grep -o -E "bounty worth [0-9]*" | grep -o -E "[0-9]*"`;do s=$(($s+$j));done;done;echo $s

結果:

39450

4
私は間違っている可能性がありますが、品質の最適化が非常に短かったように見えます。
rickcnagy 14

seq 1 11に減らすことができますseq 11
フェドルキ14

4つの文字を節約するために、パイプの周りのスペースを取り除くことができるはずです。そして、確実にこれらの2つのgrepsを1つにマージできます(「[0-9] +」を意味しますか?)。
Desty

また、「grep -o -E」=>「egrep -o」。
Desty

変更できます: "egrep -o '[0-9] +'" => "cut -d '' -f3" :)
Desty 14

5

Javascript- 129 119 110 107文字

編集:無効な答え!これは、ごく一部しか含まれていない「注目の上位の質問」のみを処理します。Alconjaの答えはより有効です。

s="#mainbar";t="";eval("$(s).find('.bounty-indicator').each(function(){t+=this.innerHTML});alert(eval(t))")

コンソールウィンドウでhttps://stackoverflow.com/?tab=featuredで実行します。Alconjaによるソリューションに基づいています。

不要な空白を削除することで、もう少しゴルフをしました。

evalを使用して関数呼び出しを削除し、さらに9文字を消去しました。

不要な空白を削除しました。


3

Java、540文字

警告:アクティブな賞金の数は〜470です。このコードは何度もstackoverflowのページにアクセスします。非常に多くのデータリクエストを行うと、それらに悩まされる可能性があります。

import java.io.*;import java.net.*;public class B{public static void main(String[]A){String u="http://stackoverflow.com/questions",d;Long i,s=i=0L,n=i.parseLong(o(u).replaceAll("^.*b.>(\\d+).*$","$1"));while(i++<n){d=o(u+"?pagesize=1&sort=featured&page="+n).replaceAll("^.*ion.>.(\\d+).*$","$1");s+=d.matches(".*\\D.*")?0:n.parseLong(d);}System.out.print(s);}static String o(String s){String d="";try{BufferedReader r=new BufferedReader(new InputStreamReader(new URL(s).openStream()));while((s=r.readLine())!=null)d+=s;}finally{return d;}}}

私の出力はでしたが23400、@ TonyHのコードを実行すると、が得られました37550。悪いニュース。

きれいなコード:

import java.io.*;
import java.net.*;

public class StackOverflowBounty {

    public static void main(String[] args) {
        String u = "http://stackoverflow.com/questions", d;
        Long i, s = i = 0L, n = i.parseLong(o(u).replaceAll("^.*b.>(\\d+).*$", "$1"));
        while (i++ < n) {
            d = o(u + "?pagesize=1&sort=featured&page=" + n).replaceAll("^.*ion.>.(\\d+).*$", "$1");
            s += d.matches(".*\\D.*") ? 0 : n.parseLong(d);
        }
        System.out.print(s);
    }

    static String o(String s) {
        String d = "";
        try {
            BufferedReader r = new BufferedReader(new InputStreamReader(new URL(s).openStream()));
            while ((s = r.readLine()) != null) {
                d += s;
            }
        } finally {
            return d;
        }
    }
}

これが機能する方法は簡単です。URL http://stackoverflow.com/questions"から読み取って、賞金がある質問の数を判断します(注:数が増えるとプログラムは失敗しますが、ドロップすると問題なく動作します)。regex:を使用してこの番号を検索しますb.>(\\d+)。これはこれまでのすべてのテストで機能していましたが、誰かがその正規表現に一致する質問をした場合、これは機能しない可能性があります。

次に、URL http://stackoverflow.com/questions?pagesize=1&sort=featured&page=+ を開きcurrent question #ます。言い換えると、注目の質問ごとに新しいページを開き、質問の数を強制的にのみにして1、すべての質問を取得します。レピュテーション部分は常に一致ion.>.(\\d+)するため、それを使用して検索します。質問の数が減ったかどうかを簡単に確認できるように(つまり、返される文字列が整数ではない)、操作を2つの部分に分割しました。

次に、すべての評判をまとめて印刷します。

私のマシンで実行するのに約3分20秒かかりました。


なぜ正しい番号が印刷されないのか誰にもわかりますか?


pagesize = 100は大きな数を与えます。pagesize = 1を渡しているため、奇妙なことが起こっていると思います。私の答えでは、「ページサイズ」を指定しなかった場合、結果はあなたの番号に近かった。
jzm 14

@malikええ、私はあなたのコメントを「読み間違えた」ことに気づいたので、私は私のものを削除しました:-)。pagesize = 100は、pagesize = 50のように機能します。pagesize = 100でコードを実行したということですか?
ジャスティン14

2

C#-407

class B{void Main(string[] a){var o=0;for(int i=1;i<11;i++){var r=((System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(new Uri(string.Format(a[0]+"&page={0}",i)))).GetResponse();if(r.ContentLength>0){using(var s=new StreamReader(r.GetResponseStream()))foreach(Match m in Regex.Matches(s.ReadToEnd(),"bounty worth (.+?) "))o+=int.Parse(m.Value.Substring(m.Value.IndexOf('h')+2));}}Console.Write(o);}}

Stackoverflow.comを使用します。Gzip圧縮解除と異なる正規表現を除いて、以下と同じです。

テスト

> prog.exe http://stackoverflow.com/questions?pagesize=50&sort=featured
38150

奇妙なことに、以下とは異なる値を取得します。


C#-496

これは、gzip圧縮されたjsonのapi.stackexchangeを使用します。

using System.IO.Compression;class B{void Main(string[] a){var o=0;for(int i=1;i<11;i++){var r=((System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(new Uri(string.Format(a[0]+"&page={0}",i)))).GetResponse();if(r.ContentLength>0)using(var s=new StreamReader(new GZipStream(r.GetResponseStream(),CompressionMode.Decompress)))foreach(Match m in Regex.Matches(s.ReadToEnd(),@"bounty_amount"":(.+?),"))o+=int.Parse(m.Value.Substring(m.Value.IndexOf(':')+1).Replace(",",""));}Console.Write(o);}}

縮小されていない:

using System.IO.Compression;

class B
{
    void Main(string[] a)
    {
        var o = 0;
        for (int i=1; i<11; i++) {
            var w = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(new Uri(string.Format(a[0]+"&page={0}",i)));
            if(w.GetResponse().ContentLength > 0)
                using(var s = new StreamReader(new GZipStream(w.GetResponse().GetResponseStream(),CompressionMode.Decompress)))
                    foreach(Match m in Regex.Matches(s.ReadToEnd(), @"bounty_amount"":(.+?),"))
                        o += int.Parse(m.Value.Substring(m.Value.IndexOf(':')+1).Replace(",", ""));
        }
        Console.Write(o);
    }
}

テスト

デフォルトのページサイズ:

> prog.exe http://api.stackexchange.com/2.2/questions/featured?site=stackoverflow
25300

ページサイズ= 100:

> prog.exe "http://api.stackexchange.com/2.2/questions/featured?site=stackoverflow&pagesize=100"
37400

2

jQuery 191

i=0;function f(p){$.get('//api.stackexchange.com/2.2/questions/featured?site=stackoverflow&page='+p,function(d){for(x in d.items)i+=d.items[x].bounty_amount;d.has_more?f(p+1):alert(i)})};f(1)

stackexchange(および他の多くのサイト)のどこからでも動作し、@ Alconja / @ NateKerkhofsの回答のように特定のページにいる必要はありません


jQueryは言語ではなくライブラリです。わからないことは...有効か無効かどう
rickcnagy

@ br1ckb0tは、必要に応じてJavaScriptとして使用します。とにかくjQueryはすでにstackexchangeサイトにあります、私はちょうど明示的$
でし

ええ、それは理にかなっています!素敵なコード。
rickcnagy

2

PHP-139

ゴルフ:

<?php
$a=file_get_contents('http://stackoverflow.com/?tab=featured');preg_match_all('/n">\+([0-9]+)<\/div>/',$a,$r);echo array_sum($r[1]);

アンゴルフド-147

シンプルfile_get_contents/ preg_match/array_sum

<?php
$a = file_get_contents('http://stackoverflow.com/?tab=featured');
preg_match_all('/n">\+([0-9]+)<\/div>/', $a, $r);
echo array_sum($r[1]);

テスト:

php run.php

10250


2

バッシュ174

https://codegolf.stackexchange.com/a/25180/7664に基づく:

s=0;for i in {1..11};do for j in `wget -qO- "stackoverflow.com/questions?pagesize=50&sort=featured&page=$i"|cut -d' ' -f18|egrep '^[0-9]+$'`;do s=$(($s+$j));done;done;echo $s

あなたは取り除くことができ、pagesize=50&さらにループするだけです(15の場合、デフォルトのページサイズだと思います)。
アルコンジャ14

@Alconjaうーん、そうだから、これを162まで減らすことができた...しかし、サーバーへのリクエストスパムが増えるという欠点があるだけだった。
thejh 14

2

Python(174文字):

上記のPythonの答えを展開します(コメントするのに十分なカルマがない):

import requests,re;print sum(sum(map(int,re.findall(r"<.*>\+(\d+)<.*>",requests.get("http://stackoverflow.com/questions?sort=featured&page=%u"%i).text)))for i in range(1,33))

urllibの代わりのリクエストは2文字に削減されます。


1

ルビー(176文字):

ハードコードされたページ番号を使用するトニーH.の例に従って、私が得たものは次のとおりです。

require'open-uri';b=0;(1..29).each{|i|d=open("http://stackoverflow.com/questions?sort=featured&page=#{i}").read;b+=d.scan(/<.*>\+(\d+)<.*>/).map{|x|x[0].to_i}.reduce 0,:+};p b

執筆時点で35300をくれました。

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