Golfe no placar

11

Golf a tabela de classificação desta pergunta (id = 111735). Seu programa deve emitir uma solicitação HTTP ou HTTPS para a API StackExchange, analisá-la e apresentá-la ao usuário de forma semelhante a um snippet de cabeçalho típico

Saída de amostra (para a pergunta 47338 em vez disso):

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

Observe as classificações repetidas 3, 5 e 16. Talvez eu até adicione uma resposta especial não competitiva apenas para forçar a entrega correta e não simplificada das duplicatas.

A saída deve consistir em:

  1. A linha "Classificação"
  2. A linha "\ tAuthor \ tLanguage \ tSize"
  3. Para cada resposta, linha de classificação separada por tabulação e a ., responda o nome do autor, o nome do idioma e a pontuação; em ordem crescente para pontuação
  4. A linha "Vencedores por idioma"
  5. A linha "Idioma \ usuário \ tScore"
  6. Para cada idioma usado, nome de idioma separado por tabulação, autor da resposta de pontuação mais baixa e a pontuação

Em outras palavras, algo como se alguém copiasse e colasse o resultado do trecho de cabeçalho desta pergunta em um arquivo de texto (sem as coisas "\ tLink"). Veja também a implementação de referência em Python .

Regras

  • Nenhum acesso à rede além de uma solicitação de API para api.stackexchange.com
  • Nenhum uso de recursos ou idiomas da API que apareceram após o envio desta pergunta.
  • A primeira linha da resposta deve ser compatível com o cabeçalho. Se ele quebrar o script do cabeçalho anexado à pergunta, a resposta não será competitiva.
  • Se a resposta recém-adicionada fizer com que uma resposta existente seja desfeita, o autor da resposta antiga deve corrigi-la (ou ela se tornará não concorrente).
  • Links para idiomas, pontuações riscadas, etc. devem ser manipulados.
  • As classificações devem ser tratadas como no snippet (por exemplo, pontuação igual => classificação igual => diferença nas classificações).

Resposta aceita é a resposta com a pontuação mais baixa após quantidade suficiente de inatividade (mínimo de 1 mês).

Boa ideia

  • Para testar com os IDs da pergunta 47338 (para manipulação de pontuação duplicada + manipulação de pontuação riscada) e 17005 (para manipulação de links). Isso supera a resposta de Válido para Bom e protege contra quebras de envios posteriores.
  • Para incluir exemplos de saída para esta e para versões de ID substituídas.

Não é necessário

  • Tratamento de mais de 100 respostas (limite de API para solicitação única)
  • Tratamento de substituições de comentários
  • Classificação da seção "Vencedores por idioma"
  • Discriminação de respostas concorrentes e quebradas

Entre os melhores

Vi.
fonte
Um pouco relacionado e isso (mas são desafios muito diferentes).
Stewie Griffin

Respostas:

2

Perl + Mojolicious, 468 456 469 504 bytes

Usando a 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

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
fonte
Can't locate ojo.pm in @INC-> Isso significa que não é apenas "Perl", mas "Perl + Mojolicious"? O uso de bibliotecas não incluídas no idioma não conta como uma brecha padrão?
Vi.
Se eu corrigir o ID da pergunta no 47338, não vejo o manuseio correto dos laços. Em vez de ter as entradas de classificação sã desaparecerem.
Vi.
Correção: entradas com a mesma pontuação recebem classificação diferente. Embora isso não torne a resposta inválida (ainda), ela não é boa.
Vi.
@Vi. Laços fixos.
Denis Ibaev 4/03
1
Trabalho. Provavelmente, o problema restante mais sério (e supostamente a fonte do voto negativo) é o nome do envio. Talvez mude para "Perl + Mojolicious" para evitar competir com soluções Perl puras? Mojolicious parece ser uma biblioteca orientada para oneliner (portanto útil para jogar golfe) não instalada na maioria das implantações de Perl, portanto, não pode ser considerada parte do idioma.
Vi.
6

Python 3, 860 856 bytes

Jogou um pouco, apenas para iniciar a tabela de líderes e fornecer alguns modelos para outros jogadores:

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

Recuado com guias. O último printnão é deliberadamente substituído por ppara criar um empate na pontuação do 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: ainda não manipula os links corretamente, falha na, por exemplo, pergunta 17005 .

Vi.
fonte
1
Mesmo se você mesmo responder, terá de responder a uma pergunta de código-golfe .
NoOneIsHere 28/02
@NoOneIsHere, não tenho certeza sobre " preciso ". Somente se "se você responder a uma pergunta sobre código de golfe e quiser ganhar ".
Vi.
3
@Vi. Em seguida, inclua-o na pergunta como uma solução de referência. Esta é uma resposta, que não responde à (sua) pergunta, que solicita código de golfe , por código-golfe .
NoOneIsHere 28/02
1
@Vi. Não. Ou é totalmente jogado ou não é permitido. Se ele pode ser facilmente jogado, então não é uma resposta. Eu realmente diria apenas para colocá-lo em questão como uma solução de referência.
Rɪᴋᴇʀ
4
@Vi. Não, jogue o melhor que puder .
NoOneIsHere
1

Bash + JQ, 399 bytes

Observe que isso quase certamente pode ser aprimorado, otimizando a jqlógica da expressão.

Golfe

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

Saída de amostra

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
zepelim
fonte
Qual versão do jq é necessária? Eu receboerror: capture is not defined
Vi.
Não vejo classificações repetidas quando faço o patch da identificação da pergunta para 47338. O envio pode se tornar inválido à medida que chegam (e mais tarde posso adicionar uma pseudo-resposta especial não concorrente apenas para forçar o manuseio correto das classificações).
Vi.
A resposta CJAM de Martin Ender tem "CJam, <s> 28 </s> 27 bytes". Deve ser interpretado como 27, não 28, como no snippet oficial da tabela de classificação. Ou 19 vs 22 bytes de Pyth.
Vi.
Observe o ponto "* Links para idiomas, pontuações riscadas, etc. devem ser manuseados." nas regras do desafio.
Vi.
@ Vi - Deve estar tudo pronto agora (consulte jqplay.org/s/LuZfAn2Pxr ). A resposta Pyth ainda tem 22 bytes, pois simplesmente não está formatada corretamente (a última contagem de bytes vem em primeiro lugar).
Zeppelin
1

Mathematica, 852 856 bytes

Usa o JSONToolspacote interno. Não é para isso que o Mathematica deve ser usado ... então eu usei!

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
fonte
Como faço para testá-lo? Eu recebo 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., após o que as impressões são {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
Talvez a solução seja quebrada por seu próprio código-fonte (que obviamente contém <h1>)?
Vi.
@Vi. Estranho, está funcionando para mim. Em qual pergunta você testou? Eu não acho que seja o código-fonte que está quebrando, porque a API StackExchange usa escapes HTML para <e> automaticamente.
numbermaniac
Este, 111735. Mas substituí o URL por /tmp/q.jsononde há uma resposta JSON pré-baixada.
Vi.
Saída para 47338: paste.debian.net/918716
Vi.