Classifica golf


11

Golf la classifica di questa domanda (id = 111735). Il tuo programma dovrebbe inviare una richiesta HTTP o HTTPS all'API StackExchange, analizzarla e presentarla all'utente in forma simile a un tipico frammento di classifica

Esempio di output (per la domanda 47338 anziché questo):

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

Nota le classifiche ripetute 3, 5 e 16. Forse aggiungerò anche una speciale risposta non competitiva solo per forzare la consegna corretta e non semplificata dei duplicati del punteggio.

L'output dovrebbe essere costituito da:

  1. La linea "Classifica"
  2. La riga "\ tAuthor \ tLanguage \ tSize"
  3. Per ogni risposta, riga di .punteggio separata da tabulazione e a , quindi risposta nome autore, quindi nome lingua, quindi punteggio; in ordine crescente per il punteggio
  4. La linea "Vincitori per lingua"
  5. La riga "Lingua \ tUser \ tScore"
  6. Per ogni lingua utilizzata, nome della lingua separato da tabulazioni, autore della risposta del punteggio inferiore e punteggio

In altre parole, qualcosa come se una copia e incolla risultasse dallo snippet della classifica di questa domanda in un file di testo (senza cose "\ tLink"). Vedi anche l' implementazione di riferimento in Python .

Regole

  • Nessun accesso alla rete a parte una richiesta API a api.stackexchange.com
  • Nessun utilizzo di funzionalità o lingue API visualizzate dopo l'invio di questa domanda.
  • La prima riga del post di risposta dovrebbe essere compatibile con la classifica. Se interrompe lo script della classifica allegato alla domanda, la risposta non è competitiva.
  • Se la risposta appena aggiunta rende rotta una risposta esistente, l'autore della risposta precedente dovrebbe risolverla (o diventa non competitiva).
  • È necessario gestire collegamenti a lingue, punteggi cancellati, ecc.
  • I ranghi devono essere gestiti come nello snippet (ad es. Punteggio uguale => uguale grado => gap nei ranghi).

La risposta accettata è la risposta con il punteggio più basso dopo una quantità sufficiente di inattività (minimo 1 mese).

Buona idea

  • Per testare con gli ID domanda 47338 (per la gestione dei punteggi duplicati + gestione dei punteggi eliminati) e 17005 (per la gestione dei collegamenti). Ciò salta la risposta da Valido a Buono e protegge dalle interruzioni di invii successivi.
  • Includere esempi di output sia per questo che per le versioni ID sostituite.

Non necessario

  • Gestione di oltre 100 risposte (limite dell'API per singola richiesta)
  • Gestione delle sostituzioni di commenti
  • Ordinamento della sezione "Vincitori per lingua"
  • Discriminazione di risposte contrastanti e infrante

Classifica


In qualche modo correlato e questo (ma sono sfide molto diverse).
Stewie Griffin

Risposte:


2

Perl + Mojolicious, 468 456 469 504 byte

Utilizzando la libreria 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

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

Can't locate ojo.pm in @INC-> Significa che non è solo "Perl", ma "Perl + Mojolicious"? L'uso delle librerie non incluse nella lingua conta come una scappatoia standard?
Vi.

Se aggiorno l'ID domanda a 47338, non vedo la corretta gestione dei legami. Invece di far sparire le voci di rango sano.
Vi.

Correzione: le voci con lo stesso punteggio ricevono un rango diverso. Sebbene questo non renda questa risposta non valida (ancora), non è buona.
Vi.

@Vi. Cravatte fisse
Denis Ibaev,

1
Lavori. Probabilmente il problema più grave rimasto (e presumibilmente la fonte del downvote) è il nome della presentazione. Forse cambiarlo in "Perl + Mojolicious" per evitare di competere con soluzioni Perl pure? Mojolicious sembra essere una libreria orientata all'eliner (quindi utile per il golf) non installata nella maggior parte delle distribuzioni Perl, quindi non può essere considerata una parte del linguaggio.
Vi.

6

Python 3, 860 856 byte

Giocato a golf leggermente, solo per avviare la classifica e fornire un modello per altri golfisti:

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

Rientrato con le linguette. L'ultimo non printviene deliberatamente sostituito da pun pareggio con la risposta di Mathematica .

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

Nota: non gestisce ancora correttamente i collegamenti, quindi non riesce, ad esempio, per la domanda 17005 .


1
Anche se si risponde da soli, è necessario per il golf una risposta a un codice di-golf domanda.
NoOneIsHere

@NoOneIsHere, non sono sicuro di " dover ". Solo se "se rispondi a una domanda di code-golf e vuoi vincere ".
Vi.

3
@Vi. Quindi includilo nella domanda come soluzione di riferimento. Questa è una risposta, che non risponde alla (tua) domanda, che richiede il codice golf, per code-golf .
NoOneIsHere

1
@Vi. no. O è completamente golfato o non è permesso. Se può essere facilmente giocato a golf, allora non è una risposta. Direi davvero solo di inserirlo nella domanda come soluzione di riferimento.
Rɪᴋᴇʀ

4
@Vi. No, giocalo al meglio .
NoOneIsHere

1

Bash + JQ, 399 byte

Nota, questo può quasi certamente essere ulteriormente approfondito, ottimizzando la jqlogica di espressione.

golfed

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

Uscita campione

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

Quale versione di jq è necessaria? Capiscoerror: capture is not defined
Vi.

Non vedo i ranghi ripetuti quando applico l'ID domanda a 47338. L'invio potrebbe diventare non valido al loro arrivo (e in seguito potrei aggiungere una pseudo-risposta speciale non competitiva solo per forzare la corretta gestione dei ranghi).
Vi.

La risposta CJAM di Martin Ender ha "CJam, <s> 28 </s> 27 byte". Dovrebbe essere interpretato come 27, non 28, come nello snippet della classifica ufficiale. O 19 vs 22 byte di Pyth.
Vi.

Nota il punto "* I collegamenti alle lingue, i punteggi eliminati, ecc. Devono essere gestiti." nelle regole della sfida.
Vi.

@Vi - Ora dovrebbe essere tutto pronto (vedi jqplay.org/s/LuZfAn2Pxr ). La risposta Pyth è ancora di 22 byte, in quanto non è semplicemente formattata correttamente (l'ultimo conteggio dei byte viene prima).
Zeppelin,

1

Mathematica, 852 856 byte

Utilizza il JSONToolspacchetto integrato . Questo non è il tipo di cosa per cui Mathematica deve essere usata ... quindi l'ho usata!

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

Come lo collaudo? Capisco 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., dopo di che le stampe sono {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.

Forse la soluzione è rotta dal suo codice sorgente (che ovviamente contiene <h1>)?
Vi.

@Vi. È strano, funziona per me. Su quale domanda l'hai testato? Non credo sia il codice sorgente a romperlo, perché l'API StackExchange utilizza automaticamente gli escape HTML per <e>.
numbermaniac

Questo, 111735. Ma ho sostituito l'URL con /tmp/q.jsonuna risposta JSON pre-scaricata.
Vi.

Uscita per 47338: paste.debian.net/918716
Vi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.