Tabla de clasificación de golf

11

Golf la tabla de clasificación de esta pregunta (id = 111735). Su programa debe emitir una solicitud HTTP o HTTPS a la API de StackExchange, analizarla y presentarla al usuario de forma similar a un fragmento de tabla de clasificación típico

Ejemplo de salida (para la pregunta 47338 en lugar de esto):

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

Tenga en cuenta los rangos repetidos 3, 5 y 16. Quizás incluso agregue una respuesta especial no competitiva solo para forzar la entrega correcta y no simplificada de los duplicados de puntaje.

La salida debe consistir en:

  1. La línea "Tabla de clasificación"
  2. La línea "\ tAuthor \ tLanguage \ tSize"
  3. Para cada respuesta, línea de rango separada por tabulaciones y a ., luego responda el nombre del autor, luego el nombre del idioma, luego la puntuación; en orden ascendente por puntaje
  4. La línea "Ganadores por idioma"
  5. La línea "Idioma \ tUser \ tScore"
  6. Para cada idioma utilizado, nombre de idioma separado por tabuladores, autor de la respuesta de menor puntaje y el puntaje

En otras palabras, algo así como si uno copia y pega el resultado del fragmento de la tabla de clasificación de esta pregunta en un archivo de texto (sin elementos "\ tLink"). Vea también la implementación de referencia en Python .

Reglas

  • Sin acceso a la red, aparte de una solicitud de API para api.stackexchange.com
  • No se utilizan las funciones de API ni los idiomas que aparecieron después de enviar esta pregunta.
  • La primera línea de la publicación de respuestas debe ser compatible con la tabla de posiciones. Si rompe el guión de la tabla de clasificación adjunto a la pregunta, la respuesta no es competitiva.
  • Si la respuesta recién agregada hace que se rompa alguna respuesta existente, entonces el autor de la respuesta anterior debería corregirla (o deja de ser competitiva).
  • Deben manejarse los enlaces a los idiomas, las puntuaciones marcadas, etc.
  • Los rangos deben manejarse como en el fragmento (por ejemplo, igual puntaje => igual rango => hueco en los rangos).

La respuesta aceptada es la respuesta con la puntuación más baja después de una cantidad suficiente de inactividad (mínimo 1 mes).

Buena idea

  • Para probar con las ID de preguntas 47338 (para manejo de puntaje duplicado + manejo de puntaje marcado) y 17005 (para manejo de enlaces). Esto cambia la respuesta de Válido a Bueno y lo protege de interrupciones de envíos posteriores.
  • Para incluir ejemplos de salida tanto para esto como para versiones de ID anuladas.

No es necesario

  • Manejo de más de 100 respuestas (límite de API para solicitud única)
  • Manejo de anulaciones de comentarios
  • Clasificación de la sección "Ganadores por idioma"
  • Discriminación de respuestas rotas y rivales.

Tabla de clasificación

Vi.
fuente
Algo relacionado y esto (pero son desafíos muy diferentes).
Stewie Griffin

Respuestas:

2

Perl + Mojolicious, 468 456 469 504 bytes

Usando la biblioteca 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

Sin 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
fuente
Can't locate ojo.pm in @INC-> ¿Significa que no es solo "Perl", sino "Perl + Mojolicious"? ¿El uso de bibliotecas no incluidas con el idioma cuenta como una laguna estándar?
Vi.
Si parcheo el ID de la pregunta al 47338, no veo el manejo correcto de los vínculos. En lugar de hacer que desaparezcan las entradas de rango sensatas.
Vi.
Corrección: las entradas con el mismo puntaje reciben un rango diferente. Aunque esto no invalida esta respuesta (todavía), no es buena.
Vi.
@Vi. Lazos fijos.
Denis Ibaev
1
Trabajos. Probablemente el problema restante más grave (y supuestamente la fuente del voto negativo) es el nombre de envío. ¿Quizás cambiarlo a "Perl + Mojolicious" para evitar competir con soluciones Perl puras? Mojolicious parece ser una biblioteca orientada a línea (por lo tanto, útil para jugar al golf) que no está instalada en la mayoría de las implementaciones de Perl, por lo que no puede considerarse parte del lenguaje.
Vi.
6

Python 3, 860 856 bytes

Jugó un poco, solo para arrancar la tabla de clasificación y proporcionar alguna plantilla para otros golfistas:

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

Sangrado con pestañas. El último printno se reemplaza deliberadamente ppara crear un empate con la respuesta de Mathematica .

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

Nota: todavía no maneja los enlaces correctamente, por lo que falla, por ejemplo, para la pregunta 17005 .

Vi.
fuente
1
Incluso si su respuesta es sí mismo, que tiene al golf una respuesta a un código de golf cuestión.
NoOneIsHere
@NoOneIsHere, no estoy seguro acerca de " tener que". Solo si "si responde a una pregunta de código de golf y quiere ganar ".
Vi.
3
@Vi. Luego inclúyalo en la pregunta como una solución de referencia. Esta es una respuesta, que no responde a la pregunta (suya), que pide un código de golf , por código de golf .
NoOneIsHere
1
@Vi. no O está completamente golfizado o no está permitido. Si se puede jugar fácilmente, entonces no es una respuesta. Realmente diría solo ponerlo en la pregunta como una solución de referencia.
Rɪᴋᴇʀ
44
@Vi. No, juegue al golf lo mejor que pueda .
NoOneIsHere
1

Bash + JQ, 399 bytes

Tenga en cuenta que esto casi con toda seguridad se puede jugar más al optimizar la jqlógica de expresión.

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

Salida de muestra

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
zepelín
fuente
¿Qué versión de jq se necesita? Entiendoerror: capture is not defined
Vi.
No veo los rangos repetidos cuando parcheo el ID de la pregunta a 47338. El envío puede volverse inválido a medida que llegan (y luego puedo agregar una pseudo respuesta especial no competitiva solo para forzar el manejo correcto de los rangos).
Vi.
La respuesta CJAM de Martin Ender tiene "CJam, <s> 28 </s> 27 bytes". Debe interpretarse como 27, no 28, como en el fragmento oficial de la tabla de clasificación. O Pyth's de 19 contra 22 bytes.
Vi.
Tenga en cuenta el punto "* Los enlaces a los idiomas, las puntuaciones marcadas, etc. deben ser manejados". en las reglas de desafío.
Vi.
@Vi: debería estar todo configurado ahora (ver jqplay.org/s/LuZfAn2Pxr ). La respuesta de Pyth todavía es de 22 bytes, ya que simplemente no está formateada correctamente (el último recuento de bytes viene primero).
zepelín
1

Mathematica, 852 856 bytes

Utiliza el JSONToolspaquete incorporado . Este no es el tipo de cosa para la que Mathematica está destinado a ser usado ... ¡así que lo usé!

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"]]]
numbermaniac
fuente
¿Cómo lo pruebo? Entiendo 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., después de lo cual son las huellas {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
¿Quizás la solución está rota por su propio código fuente (que obviamente contiene <h1>)?
Vi.
@Vi. Eso es extraño, me está funcionando. ¿En qué pregunta lo probaste? No creo que sea el código fuente que lo rompe, porque la API de StackExchange usa escapes HTML para <y> automáticamente.
numbermaniac
Este, 111735. Pero sustituí la URL con /tmp/q.jsonuna respuesta JSON pre descargada.
Vi.
Salida para 47338: paste.debian.net/918716
Vi.