Leaderboard Golf

11

Golfen Sie die Rangliste dieser Frage (id = 111735). Ihr Programm sollte eine HTTP- oder HTTPS-Anforderung an die StackExchange-API senden, diese analysieren und dem Benutzer in einer Form präsentieren, die einem typischen Leaderboard-Snippet ähnelt

Beispielausgabe (für die Frage 47338 stattdessen):

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

Beachten Sie die wiederholten Ränge 3, 5 und 16. Vielleicht füge ich sogar eine spezielle nicht konkurrierende Antwort hinzu, um die korrekte, nicht vereinfachte Übergabe der Partiturduplikate zu erzwingen.

Die Ausgabe sollte bestehen aus:

  1. Die Zeile "Leaderboard"
  2. Die Zeile "\ tAuthor \ tLanguage \ tSize"
  3. Für jede Antwort eine durch Tabulatoren getrennte Ranglinie und a ., dann Antwort Autorenname, dann Sprachname, dann Punktzahl; in aufsteigender Reihenfolge für die Punktzahl
  4. Die Zeile "Gewinner nach Sprache"
  5. Die Zeile "Language \ tUser \ tScore"
  6. Für jede verwendete Sprache, durch Tabulatoren getrennter Sprachname, Autor der Antwort mit niedrigerer Punktzahl und Punktzahl

Mit anderen Worten, so etwas wie das Ergebnis des Leaderboard-Snippets dieser Frage in eine Textdatei (ohne "\ tLink" -Dinge) zu kopieren und einzufügen. Siehe auch die Referenzimplementierung in Python .

Regeln

  • Kein Netzwerkzugriff außer einer API-Anfrage an api.stackexchange.com
  • Keine Verwendung von API-Funktionen oder Sprachen, die nach dem Absenden dieser Frage angezeigt wurden.
  • Die erste Zeile des Antwortposts sollte Leaderboard-kompatibel sein. Wenn das der Frage beigefügte Leaderboard-Skript beschädigt wird, ist die Antwort nicht konkurrierend.
  • Wenn durch eine neu hinzugefügte Antwort eine vorhandene Antwort beschädigt wird, sollte der Autor der alten Antwort diese beheben (oder sie wird nicht mehr konkurrierend).
  • Links zu Sprachen, durchgestrichenen Partituren usw. sollten behandelt werden.
  • Ränge sollten wie im Snippet behandelt werden (z. B. gleiche Punktzahl => gleicher Rang => Ranglücke).

Akzeptierte Antwort ist die Antwort mit der niedrigsten Punktzahl nach ausreichender Inaktivität (mindestens 1 Monat).

Gute Idee

  • Zum Testen mit den Fragen-IDs 47338 (für die Behandlung doppelter Punkte + durchgestrichene Punktebehandlung) und 17005 (für die Behandlung von Links). Dies erhöht die Antwort von "Gültig" auf "Gut" und schützt vor Unterbrechungen durch spätere Einreichungen.
  • Aufnahmebeispiele sowohl für diese als auch für überschriebene ID-Versionen.

Nicht nötig

  • Bearbeitung von mehr als 100 Antworten (API-Limit für Einzelanforderung)
  • Behandlung von Kommentarüberschreibungen
  • Sortierung des Abschnitts "Gewinner nach Sprache"
  • Diskriminierung konkurrierender und gebrochener Antworten

Bestenliste

Vi.
quelle
Etwas verwandt und das (aber es sind sehr unterschiedliche Herausforderungen).
Stewie Griffin

Antworten:

2

Perl + Mojolicious, 468 456 469 504 Bytes

Verwenden der Mojolicious- Bibliothek.

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

Ungolfed:

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);
Denis Ibaev
quelle
Can't locate ojo.pm in @INC-> Bedeutet das, dass es nicht nur "Perl" ist, sondern "Perl + Mojolicious"? Zählt die Verwendung von nicht in der Sprache enthaltenen Bibliotheken nicht als Standardlücke?
Vi.
Wenn ich die Frage-ID auf 47338 patche, sehe ich keinen korrekten Umgang mit Krawatten. Anstatt die vernünftigen Rangeinträge verschwinden zu lassen.
Vi.
Korrektur: Einträge mit gleicher Punktzahl erhalten einen unterschiedlichen Rang. Obwohl dies diese Antwort (noch) nicht ungültig macht, ist sie nicht gut.
Vi.
@Vi. Feste Krawatten.
Denis Ibaev
1
Funktioniert. Das wahrscheinlich schwerwiegendste verbleibende Problem (und angeblich die Quelle der Ablehnung) ist der Name der Einreichung. Vielleicht ändern Sie es in "Perl + Mojolicious", um nicht mit reinen Perl-Lösungen zu konkurrieren? Mojolicious scheint eine Oneliner-orientierte (daher für das Golfen nützliche) Bibliothek zu sein, die in den meisten Perl-Bereitstellungen nicht installiert ist und daher nicht als Teil der Sprache betrachtet werden kann.
Vi.
6

Python 3, 860 856 Bytes

Leichtes Golfen, nur um die Rangliste zu verbessern und eine Vorlage für andere Golfer bereitzustellen:

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

Mit Tabulatoren eingerückt. Der letzte printwird absichtlich nicht durch ersetzt p, um eine Punktzahlbindung mit der Mathematica-Antwort herzustellen .

Ungolfed:

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

Hinweis: Links werden noch nicht korrekt behandelt, daher schlägt dies beispielsweise bei Frage 17005 fehl .

Vi.
quelle
1
Selbst wenn Sie es selbst beantworten, Sie haben Golf eine Antwort auf eine Code-Golf Frage.
NoOneIsHere
@NoOneIsHere, ich bin mir nicht sicher, ob ich muss . Nur wenn "wenn Sie auf eine Code-Golf-Frage antworten und gewinnen wollen ".
Vi.
3
@Vi. Nehmen Sie es dann als Referenzlösung in die Frage auf. Dies ist eine Antwort, die nicht die (Ihre eigene) Frage beantwortet, die nach Golfcode pro Code-Golf fragt .
NoOneIsHere
1
@Vi. Nee. Entweder ist es voll Golf oder es ist nicht erlaubt. Wenn es leicht gespielt werden kann, ist es keine Antwort. Ich würde wirklich nur sagen, um es als Referenzlösung in die Frage zu stellen.
Rɪᴋᴇʀ
4
@Vi. Nein, spielen Sie es so gut wie möglich .
NoOneIsHere
1

Bash + JQ, 399 Bytes

Beachten Sie, dass dies mit ziemlicher Sicherheit weiter optimiert werden kann, indem die jqAusdruckslogik optimiert wird .

Golf gespielt

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

Beispielausgabe

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
Zeppelin
quelle
Welche Version von jq wird benötigt? Ich bekommeerror: capture is not defined
Vi.
Ich sehe keine wiederholten Ränge, wenn ich die Frage-ID auf 47338 patche. Die Übermittlung kann ungültig werden, sobald sie eintrifft (und ich kann später eine spezielle nicht konkurrierende Pseudoantwort hinzufügen, um die korrekte Behandlung von Rängen zu erzwingen).
Vi.
Die CJAM-Antwort von Martin Ender lautet "CJam, <s> 28 </ s> 27 Bytes". Es sollte als 27 interpretiert werden, nicht als 28, wie im offiziellen Leaderboard-Snippet. Oder Pyth's 19 vs 22 Bytes.
Vi.
Beachten Sie den Punkt "* Links zu Sprachen, durchgestrichenen Partituren usw. sollten behandelt werden." in den Herausforderungsregeln.
Vi.
@Vi - Sollte jetzt fertig sein (siehe jqplay.org/s/LuZfAn2Pxr ). Die Pyth-Antwort beträgt immer noch 22 Bytes, da sie einfach nicht richtig formatiert ist (die Anzahl der letzten Bytes steht an erster Stelle).
Zeppelin
1

Mathematica, 852 856 Bytes

Verwendet das integrierte JSONToolsPaket. Dies ist nicht die Art von Dingen, für die Mathematica verwendet werden soll ... also habe ich es verwendet!

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"]]]
Zahlmaniac
quelle
Wie teste ich es? Ich bekomme 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., nach denen die Drucke sind {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
Vielleicht ist die Lösung durch ihren eigenen Quellcode (der offensichtlich enthält <h1>) kaputt ?
Vi.
@Vi. Das ist seltsam, es funktioniert für mich. Auf welcher Frage haben Sie es getestet? Ich denke nicht, dass es der Quellcode ist, der es bricht, weil die StackExchange-API HTML-Escapezeichen für das <und> automatisch verwendet.
Numbermaniac
Diese, 111735. Aber ich habe die URL durch /tmp/q.jsoneine vorab heruntergeladene JSON-Antwort ersetzt.
Vi.
Ausgabe für 47338: paste.debian.net/918716
Vi.