リーダーボードゴルフ


11

この質問のリーダーボードをゴルフします(id = 111735)。プログラムは、StackExchange APIに対して1つの HTTPまたはHTTPSリクエストを発行し、それを解析して、一般的なリーダーボードスニペットに似た形式でユーザーに提示する必要があります。

サンプル出力(質問47338の代わりに):

Leaderboard
    Author  Language    Size
1.  FryAmTheEggman  Pyth    19
2.  Peter Taylor    CJam    24
3.  Martin Ender    CJam    27
3.  Peter Taylor    GolfScript  27
5.  randomra    J   32
5.  Optimizer   CJam    32
7.  Timtech TI-Basic 83/84  40
8.  mollmerx    k   41
9.  Sp3000  ><> 45
10. Sherlock9   Ruby    47
11. Martin Ender    Mathematica 49
12. Alex A. Julia   57
13. Sp3000  Python 2    58
14. Zgarb   Haskell 68
15. Timtech GML 76
16. Jakube  Python 2    79
16. nimi    Haskell 79
18. coredump    Common Lisp 91
19. Jim Large   Ruby    92
Winners by Language
Language    User    Score
Python 2    Sp3000  58
CJam    Peter Taylor    24
Julia   Alex A. 57
TI-Basic 83/84  Timtech 40
><> Sp3000  45
Haskell Zgarb   68
GolfScript  Peter Taylor    27
Common Lisp coredump    91
Pyth    FryAmTheEggman  19
k   mollmerx    41
J   randomra    32
Ruby    Sherlock9   47
Mathematica Martin Ender    49
GML Timtech 76

ランク3、5、および16が繰り返されることに注意してください。スコアの複製を単純かつ単純に正しく処理するために、競合しない特別な答えを追加することもできます。

出力は次のもので構成される必要があります。

  1. 行「リーダーボード」
  2. 行「\ tAuthor \ tLanguage \ tSize」
  3. 各回答について、ランクとタブのタブ区切り行.、次に著者名、言語名、スコアの順に回答します。スコアの昇順
  4. 行「言語による勝者」
  5. 「Language \ tUser \ tScore」という行
  6. 使用言語ごとに、タブ区切りの言語名、低得点の作者、および得点

つまり、この質問のリーダーボードスニペットの結果をテキストファイルにコピーアンドペーストするようなものです( "\ tLink"なし)。Pythonリファレンス実装も参照してください。

ルール

  • への1つのAPIリクエスト以外のネットワークアクセスはありません api.stackexchange.com
  • この質問の送信後に表示されたAPI機能または言語の使用はありません。
  • 回答投稿の最初の行は、リーダーボード互換である必要があります。質問に添付されたリーダーボードスクリプトに違反する場合、答えは競合しません。
  • 新しく追加された回答が既存の回答の一部を破損させる場合、古い回答の作成者はそれを修正する必要があります(または競合しなくなります)。
  • 言語へのリンク、スコアの取り消しなどを処理する必要があります。
  • ランクはスニペットのように処理する必要があります(例:等しいスコア=>等しいランク=>ランクのギャップ)。

受け入れられた回答は、十分な量の非アクティブ(最低1か月)後の最低スコアの回答です。

良いアイデア

  • 質問ID 47338(重複スコア処理+取り消しスコア処理用)および17005(リンク処理用)でテストします。これにより、回答が有効から良にバンプされ、後の提出からの中断から保護されます。
  • このバージョンとオーバーライドされたIDバージョンの両方の出力例を含める。

必要はありません

  • 100を超える回答の処理(単一リクエストのAPIの制限)
  • コメントのオーバーライドの処理
  • 「言語による勝者」セクションの並べ替え
  • 競合する回答と壊れた回答の差別

リーダーボード


やや関連性これ(しかし、それらは非常に異なる課題です)。
スティーヴィーグリフィン

回答:


2

Perl + Mojolicious、468 456 469 504バイト

Mojoliciousライブラリを使用します。

use v5.10;use ojo;while(@i=@{(g("http://api.stackexchange.com/2.2/questions/111735/answers?site=codegolf&filter=withbody&page=".++$p)->json//{})->{items}}){push@r,[$_->{owner}{display_name},(($h=x($_->{body})->at("h1,h2")||next)->at("a")||$h)->text=~/\s*([^,]+)\s*/,$h->text=~/(\d+)[^\d]*$/]for@i}$,="   ";say"Leaderboard
",Author,$l=Language,Size;say+(++$i,$s{@$_[2]}//=$i).".",@$_
for@r=sort{@$a[2]-@$b[2]}@r;%h=map{@$_[1],$_}reverse@r;say"Winners by $l
$l",User,Score;say$_,$h{$_}[0],$h{$_}[2]for keys%h

ゴルフをしていない:

use v5.10;
use ojo;

my @r;
while (my @i = @{ (g("http://api.stackexchange.com/2.2/questions/111735/answers?site=codegolf&filter=withbody&page=" . ++$p)->json // {})->{items} }) {
    my $h = x($_->{body})->at("h1,h2") or next;
    push(@r, [$_->{owner}{display_name}, ($h->at("a") || $h)->text =~ /\s*([^,]+)\s*/, $h->text =~ /(\d+)[^\d]*$/]) for @i;
}

$, = "\t";
my %s;
say("Leaderboard\n", "Author", (my $l = "Language"), "Size");
say((++$i, $s{$_->[2]} //= $i) . ".", @$_) for @r = sort { $a->[2] <=> $b->[2] } @r;

my %h = map { $_->[1] => $_ } reverse(@r);
say("Winners by $l\n$l", "User", "Score");
say($_, $h{$_}[0], $h{$_}[2]) for keys(%h);

Can't locate ojo.pm in @INC->「Perl」だけでなく、「Perl + Mojolicious」という意味ですか?言語に含まれていないライブラリを使用しても、標準の抜け穴としてカウントされませんか?
Vi。

質問IDを47338にパッチすると、タイの正しい処理が表示されません。正常なランクエントリが消える代わりに。
Vi。

修正:同じスコアのエントリは異なるランクを受け取ります。これは、この回答を(まだ)無効にするものではありませんが、良くありません。
Vi。

@Vi。固定関係。
デニスイバエフ

1
動作します。おそらく、最も深刻な残りの問題(そして、おそらくダウン投票の原因)は、提出名です。「Perl + Mojolicious」に変更して、純粋なPerlソリューションとの競合を避けることができますか?Mojoliciousは、ほとんどのPerlデプロイメントにインストールされていないワンライナー指向の(したがって、ゴルフに便利な)ライブラリであるため、言語の一部と見なすことはできません。
Vi。

6

Python 3、860 856バイト

リーダーボードをブートストラップし、他のゴルファーにテンプレートを提供するために、わずかにゴルフをしました。

import json,re,html as h,requests as r
p=print
u=h.unescape;a=[];n={}
for i in json.loads(r.get("https://api.stackexchange.com/2.2/questions/111735/answers?page=1&pagesize=100&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe").text)["items"]:
    m=re.match(r'<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)',i["body"].splitlines()[0]);l=u(m.group(1));t=u(i["owner"]["display_name"]);s=m.group(2);a.append((t,l,s))
    if l not in n: n[l]=[]
    n[l].append((t,s))
p("Leaderboard\n\tAuthor\tLanguage\tSize")
z=0;y=None
for i in enumerate(sorted(a,key=lambda x:x[2])):
    if y==i[1][2]:z+=1
    else:z=0;y=i[1][2]
    p("%d.\t%s\t%s\t%s"%(i[0]+1-z,i[1][0],i[1][1],i[1][2]))
p("Winners by Language\nLanguage\tUser\tScore")
for i in n.keys():
    n[i].sort(key=lambda x:x[1])
    print("%s\t%s\t%s"%(i,n[i][0][0],n[i][0][1]))

タブでインデントされます。最後のものprintpMathematicaの答えとスコアを結びつけるために意図的に置き換えられることはありません。

ゴルフをしていない:

import json
import re
import html
import requests
url="https://api.stackexchange.com/2.2/questions/111735/answers?page=1&pagesize=100&site=codegolf&filter=!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"
data=json.loads(requests.get(url).text)
answers=[]
languages={}
for i in data["items"]:
    header=i["body"].splitlines()[0]
    m=re.match(r'<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)', header)
    lang=html.unescape(m.group(1))
    author=html.unescape(i["owner"]["display_name"])
    score=m.group(2)
    answers.append((author, lang, score))
    if lang not in languages: languages[lang]=[]
    languages[lang].append((author, score))
answers.sort(key=lambda x:x[2])
print("Leaderboard")
print("\tAuthor\tLanguage\tSize")
rankadj=0
prevscore=None
for i in enumerate(answers):
    if prevscore == i[1][2]:
        rankadj+=1
    else:
        rankadj=0
        prevscore=i[1][2]
    print("%d.\t%s\t%s\t%s" % (i[0]+1-rankadj, i[1][0], i[1][1], i[1][2]))
print("Winners by Language")
print("Language\tUser\tScore")
for i in languages.keys():
    w=languages[i]
    w.sort(key=lambda x:x[1])
    print("%s\t%s\t%s" % (i, w[0][0], w[0][1]))

注:リンクはまだ正しく処理されていないため、たとえば質問17005で失敗します。


1
あなたはそれを自分で答える場合でも、あなたが持っているゴルフへの答えコードゴルフ質問を。
NoOneIsHere

@NoOneIsHere、私は「しなければならない」かどうかわかりません。「コードゴルフの質問に答えて勝ちたい場合」のみ。
Vi。

3
@Vi。次に、それを参照ソリューションとして質問に含めます。これは答えであり、code-golfごとにゴルフのコードを尋ねる(あなた自身の)質問には答えません。
NoOneIsHere

1
@Vi。いや。完全にゴルフされているか、許可されていません。簡単にゴルフができるなら、それは答えではありません。参照ソリューションとして質問に入れたいだけです。
Rɪᴋᴇʀ

4
@Vi。いいえ、ゴルフを最大限に活用してください
-NoOneIsHere

1

Bash + JQ、399バイト

jq式ロジックを最適化することで、これをほぼ確実にさらに進めることができます。

ゴルフ

curl api.stackexchange.com/2.2/questions/111735/answers?site=codegolf\&filter=withbody|zcat|jq -r '[.items[]|{o:.owner.display_name}+(.body|capture("^<h1>(?<l>.*?),.*?(?<b>\\d*)\\D*</h"))]|sort_by(.b|tonumber)|("Leaderboard\n\tAuthor\tLanguage\tSize",(keys[] as $i|.[$i]|"\($i+1).\t"+.o+"\t"+.l+"\t"+.b),"Winners by Language\nLanguage\tUser\tScore",(group_by(.l)|.[]|min_by(.b)|.l+"\t"+.o+"\t"+.b))'

サンプル出力

Leaderboard
    Author  Language    Size
1.  zeppelin    Bash + JQ   399
2.  Tom JavaScript ES6  454
3.  Denis Ibaev Perl    456
4.  Vi. Python 3    860
Winners by Language
Language    User    Score
Bash + JQ   zeppelin    399
JavaScript ES6  Tom 454
Perl    Denis Ibaev 456
Python 3    Vi. 860

どのバージョンのjqが必要ですか?私が取得error: capture is not defined
Viは。

質問IDを47338にパッチすると、ランクが繰り返されません。提出が到着すると無効になる場合があります(ランクの正しい処理を強制するために、後で特別な非競合擬似応答を追加する場合があります)。
Vi。

Martin EnderのCJAMの回答には、「CJam、<s> 28 </ s> 27バイト」があります。公式のリーダーボードスニペットのように、28ではなく27と解釈する必要があります。または、Pythの19バイトと22バイト。
Vi。

「*言語へのリンク、スコアの取り消しなどを処理する必要があります」という点に注意してください。チャレンジルールで。
Vi。

@Vi-すべての設定が完了しましたjqplay.org/s/LuZfAn2Pxrを参照)。Pythの答えは22バイトです。これは単に正しくフォーマットされていないためです(最後のバイトカウントが最初に来ます)。
ツェッペリン

1

Mathematica、852 856バイト

組み込みJSONToolsパッケージを使用します。これはMathematicaの使用目的ではありません...だから私はそれを使用しました!

p=Print;S=StringRiffle;L=Length;r=Range;out=Association@JSONTools`FromJSON[Import["http://api.stackexchange.com/2.2/questions/111735/answers?site=codegolf&filter=withbody"]];l={};i=Association/@(out["items"]);
(f=("body"/.i)[[#]];h=StringPosition[f,{"<h1>","</h1>"}];a="display_name"/.("owner"/.i)[[#]];s=StringSplit[StringTake[f,{h[[1]][[2]]+1,h[[2]][[1]]-1}],{",","<a>","</a>",">","<s>","</s>"," bytes","<strike>","</strike>"}];AppendTo[l,{a,s[[1]],ToExpression@s[[-1]]}])&/@r@L["body"/.i];l=SortBy[l,Last];o=r@L@l;If[l[[#]][[3]]==l[[#-1]][[3]],o[[#]]=o[[#-1]]]&/@r[2,L@l];
p@"Leaderboard"
p@"\tAuthor\tLanguage\tSize"
For[i=1,i<=L@l,i++,p[ToString@o[[i]]<>"."<>S[l[[i]][[#]]&/@r@3,"\t"]]]
l=SortBy[l,{#[[2]],#[[3]]}&];l=DeleteDuplicatesBy[l,#[[2]]&];
p@"Winners by Language"
p@"Language\tUser\tScore"
For[i=1,i<=L@l,i++,p[S[l[[i]][[#]]&/@{2,1,3},"\t"]]]

どうやってテストしますか?私はReplaceAll::reps: <content of the downloaded Mathematica answer> is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing.、その後のプリントが得られます{$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}
Vi。

たぶん、ソリューションは独自のソースコード(明らかに含まれています<h1>)によって壊れていますか?
Vi。

@Vi。それは奇妙です、それは私のために働いています。どの質問でテストしましたか?StackExchange APIは<と>にHTMLエスケープを自動的に使用するため、ソースコードがそれを破壊しているとは思わない。
numbermaniac

これは111735です。しかし/tmp/q.json、事前にダウンロードしたJSON応答がある場所でURLを置き換えました。
Vi。

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