Golf de classement

11

Jouez au classement de cette question (id = 111735). Votre programme doit émettre une demande HTTP ou HTTPS à l'API StackExchange, l'analyser et la présenter à l'utilisateur sous une forme similaire à un extrait de tableau de bord typique

Exemple de sortie (pour la question 47338 au lieu de cela):

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

Notez les rangs répétés 3, 5 et 16. Peut-être que j'ajouterai même une réponse spéciale non concurrente juste pour forcer la remise correcte et non simplifiée des doublons de score.

La sortie doit consister en:

  1. La ligne "Leaderboard"
  2. La ligne "\ tAuthor \ tLanguage \ tSize"
  3. Pour chaque réponse, une ligne de classement séparée par des tabulations et un ., puis le nom de l'auteur, puis le nom de la langue, puis le score; en ordre croissant pour le score
  4. La ligne "Gagnants par langue"
  5. La ligne "Language \ tUser \ tScore"
  6. Pour chaque langue utilisée, nom de langue séparé par des tabulations, auteur de la réponse au score le plus bas et score

En d'autres termes, quelque chose comme si l'on copie et colle le résultat de l'extrait de classement de cette question dans un fichier texte (sans les choses "\ tLink"). Voir aussi l' implémentation de référence en Python .

Règles

  • Aucun accès au réseau en dehors d'une seule demande d'API pour api.stackexchange.com
  • Aucune utilisation des fonctionnalités de l'API ou des langues apparues après la soumission de cette question.
  • La première ligne du message de réponse doit être compatible avec le classement. S'il rompt le script de classement joint à la question, la réponse est non concurrente.
  • Si la réponse nouvellement ajoutée rend une réponse existante cassée, alors l'auteur de l'ancienne réponse devrait la corriger (ou elle devient non concurrente).
  • Les liens vers les langues, les notes rayées, etc. doivent être traités.
  • Les classements doivent être traités comme dans l'extrait de code (par exemple, score égal => rang égal => écart dans les rangs).

La réponse acceptée est la réponse avec le score le plus bas après une période d'inactivité suffisante (minimum 1 mois).

Bonne idée

  • Pour tester avec les ID de question 47338 (pour la gestion des scores en double + gestion des scores barrés) et 17005 (pour la gestion des liens). Cela fait passer la réponse de valide à bonne et protège des ruptures de soumissions ultérieures.
  • Pour inclure des exemples de sortie pour cela et pour les versions d'ID remplacées.

Pas nécessaire

  • Gestion de plus de 100 réponses (limite d'API pour une seule demande)
  • Gestion des remplacements de commentaires
  • Tri de la section "Gagnants par langue"
  • Discrimination des réponses concurrentes et brisées

Classement

Vi.
la source
Un peu liés et cela (mais ce sont des défis très différents).
Stewie Griffin

Réponses:

2

Perl + Mojolicious, 468 456 469 504 octets

Utilisation de la bibliothèque 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

Non golfé:

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
la source
Can't locate ojo.pm in @INC-> Est-ce à dire que ce n'est pas seulement "Perl", mais "Perl + Mojolicious"? Est-ce que l'utilisation de bibliothèques non incluses avec la langue ne compte pas comme une faille standard?
Vi.
Si je corrige la question ID à 47338, je ne vois pas la gestion correcte des liens. Au lieu de faire disparaître les entrées de rang sain.
Vi.
Correction: les entrées de même score reçoivent un classement différent. Bien que cela ne rende pas (encore) cette réponse invalide, ce n'est pas bon.
Vi.
@Vi. Liens fixes.
Denis Ibaev
1
Travaux. Le problème le plus grave (et supposément la source du downvote) est probablement le nom de la soumission. Peut-être le changer en "Perl + Mojolicious" pour éviter de concurrencer les solutions Perl pures? Mojolicious semble être une bibliothèque orientée oneliner (donc utile pour le golf) non installée dans la plupart des déploiements Perl, donc ne peut pas être considérée comme faisant partie du langage.
Vi.
6

Python 3, 860 856 octets

Golfé légèrement, juste pour amorcer le classement et fournir un modèle pour les autres golfeurs:

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

En retrait avec des onglets. Le dernier printn'est délibérément pas remplacé par ppour créer un lien de score avec la réponse Mathematica .

Non golfé:

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

Remarque: il ne gère pas encore correctement les liens, échoue donc, par exemple, pour la question 17005 .

Vi.
la source
1
Même si vous y répondez vous-même, vous devez jouer au golf une réponse à une question de code-golf .
NoOneIsHere
@NoOneIsHere, je ne suis pas sûr de " devoir ". Seulement si "si vous répondez à une question de code-golf et que vous voulez gagner ".
Vi.
3
@Vi. Incluez-le ensuite dans la question comme solution de référence. Ceci est une réponse, qui ne répond pas à la (votre) question, qui demande le code golfé, par code-golf .
NoOneIsHere
1
@Vi. Nan. Soit il est entièrement joué au golf, soit ce n'est pas autorisé. S'il peut facilement être joué au golf, ce n'est pas une réponse. Je dirais vraiment de le mettre dans la question comme solution de référence.
Rɪᴋᴇʀ
4
@Vi. Non, jouez au golf de votre mieux .
NoOneIsHere
1

Bash + JQ, 399 octets

Notez que cela peut presque certainement être approfondi en optimisant la jqlogique d'expression.

Golfé

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

Exemple de sortie

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
la source
Quelle version de jq est nécessaire? Je reçoiserror: capture is not defined
Vi.
Je ne vois pas de rangs répétés lorsque j'attache l'ID de la question à 47338. La soumission peut devenir invalide à leur arrivée (et je pourrai ajouter plus tard une pseudo-réponse spéciale non concurrente juste pour forcer le traitement correct des rangs).
Vi.
La réponse CJAM de Martin Ender contient "CJam, <s> 28 </s> 27 octets". Il doit être interprété comme 27, pas 28, comme dans l'extrait de classement officiel. Ou 19 contre 22 octets de Pyth.
Vi.
Notez le point "* Les liens vers les langues, les scores rayés, etc. doivent être traités." dans les règles du défi.
Vi.
@Vi - Devrait être réglé maintenant (voir jqplay.org/s/LuZfAn2Pxr ). La réponse Pyth est toujours de 22 octets, car elle n'est tout simplement pas formatée correctement (le dernier décompte d'octets vient en premier).
zeppelin
1

Mathematica, 852 856 octets

Utilise le JSONToolspackage intégré. Ce n'est pas le genre de chose pour laquelle Mathematica doit être utilisé ... alors je l'ai utilisé!

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"]]]
engourdi
la source
Comment le tester? Je reçois 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., après quoi les impressions sont {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
Peut-être que la solution est cassée par son propre code source (qui contient évidemment <h1>)?
Vi.
@Vi. C'est étrange, ça marche pour moi. Sur quelle question l'avez-vous testée? Je ne pense pas que ce soit le code source qui le brise, car l'API StackExchange utilise automatiquement les échappements HTML pour les <et>.
numbermaniac
Celui-ci, 111735. Mais j'ai remplacé l'URL par /tmp/q.jsonoù il y a une réponse JSON pré-téléchargée.
Vi.
Sortie pour 47338: paste.debian.net/918716
Vi.