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


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

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 .


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

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

¿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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.