排行榜高尔夫


11

在此问题的排行榜上打高尔夫球(id = 111735)。您的程序应向StackExchange API 发出一个 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. 对于每个答案,请使用制表符分隔的等级行和a .,然后是答案作者姓名,然后是语言名称,然后是得分;按分数升序
  4. “语言获胜者”一行
  5. 行“ Language \ tUser \ tScore”
  6. 对于每种使用的语言,制表符分隔的语言名称,较低分数答案的作者和分数

换句话说,就像是将这个问题的排行榜摘要的结果复制并粘贴到文本文件中一样(没有“ \ tLink”的东西)。另请参见Python中参考实现

规则

  • 除了一个API请求之外,没有网络访问权限 api.stackexchange.com
  • 提交此问题后未使用API​​功能或语言。
  • 答案文章的第一行应与排行榜兼容。如果它破坏了问题附带的排行榜脚本,则答案是非竞争性的。
  • 如果新添加的答案使某些现有答案损坏,则旧答案的作者应修复它(否则它将变得无竞争力)。
  • 处理语言链接,删除分数等。
  • 排名应该像摘要中一样处理(例如,等分=>等阶=>等级差距)。

可接受的答案是足够的闲置时间(最少1个月)后得分最低的答案。

好主意

  • 用问题ID 47338(用于重复分数处理+删除分数处理)和17005(用于链接处理)进行测试。这将答案从“有效”更改为“良好”,并防止以后提交的内容中断。
  • 包括此示例和覆盖的ID版本的输出示例。

没必要

  • 处理超过100个答案(单个请求的API限制)
  • 注释覆盖的处理
  • 按语言分类“获奖者”部分
  • 区分竞争性和无效性答案

排行榜


有些关联这个(但他们都非常不同的挑战)。
Stewie Griffin

Answers:


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”?使用非随附语言库不算作标准漏洞吗?
六。

如果我将问题ID修补到47338,则看不到对领带的正确处理。而不是让理智的排名条目消失。
六。

更正:得分相同的条目获得不同的排名。尽管这并没有使该答案无效(但是),但这不是很好。
六。

@Vi。固定联系。
Denis Ibaev '17

1
作品。剩下的最严重的问题(可能是否决票的来源)可能是提交名称。也许将其更改为“ Perl + Mojolicious”以避免与纯Perl解决方案竞争?Mojolicious似乎是大多数Perl部署中未安装的面向单线的(因此对打高尔夫球有用)库,因此不能视为该语言的一部分。
六。

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]))

缩进制表符。print故意不代替最后一个,p以与Mathematica答案打分。

取消高尔夫:

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,我不确定“ 必须 ”。仅当“如果您回答一个代码高尔夫球问题并想赢 ”时。
六。

3
@Vi。然后将其包含在问题中作为参考解决方案。这是一个答案,它不能回答(您自己的)每个高尔夫高尔夫球要求输入高尔夫球码的问题
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时,我没有看到重复的排名。提交的内容在到达时可能会无效(并且我稍后可能会添加特殊的非竞争性伪答案,以强制正确处理排名)。
六。

Martin Ender的CJAM答案为“ CJam,<s> 28 </ s> 27个字节”。应该将其解释为27,而不是像官方排行榜摘要中的28。或Pyth的19比22字节。
六。

请注意要点“ *应该处理到语言的链接,删除的分数等。” 在挑战规则中。
六。

@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}}
六。

也许解决方案被其自己的源代码(显然包含<h1>)破坏了?
六。

@Vi。真奇怪,它正在为我工​​作。您对哪个问题进行了测试?我不认为这是破坏它的源代码,因为StackExchange API自动为<和>使用HTML转义。
numbermaniac

这是111735。但是,我用/tmp/q.json预先下载的JSON答复代替了URL 。
六。

47338的输出:paste.debian.net/918716
Vi。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.