Golf liderów

11

Golf w tabeli wyników tego pytania (id = 111735). Twój program powinien wydać jedno żądanie HTTP lub HTTPS do StackExchange API, przeanalizować je i przedstawić użytkownikowi w formie podobnej do typowego fragmentu tabeli liderów

Przykładowe dane wyjściowe ( zamiast pytania 47338 ):

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

Zwróć uwagę na powtarzające się rangi 3, 5 i 16. Może nawet dodam specjalną, niekonkurującą odpowiedź, aby wymusić prawidłowe, nie uproszczone przekazywanie duplikatów wyników.

Dane wyjściowe powinny składać się z:

  1. Linia „Tabela liderów”
  2. Wiersz „\ tAuthor \ tLanguage \ tSize”
  3. Dla każdej odpowiedzi oddzielony tabulatorami wiersz rangi a ., a następnie odpowiedz na nazwisko autora, następnie nazwę języka, a następnie wynik; w porządku rosnącym dla wyniku
  4. Wiersz „Zwycięzcy według języka”
  5. Wiersz „Language \ tUser \ tScore”
  6. Dla każdego używanego języka nazwa języka oddzielona tabulatorami, autor odpowiedzi na niższy wynik i wynik

Innymi słowy, coś w stylu, jakby ktoś skopiował i wkleił wynik fragmentu tego pytania do pliku tekstowego (bez elementów „\ tLink”). Zobacz także implementację referencji w języku Python .

Zasady

  • Brak dostępu do sieci oprócz jednego żądania API do api.stackexchange.com
  • Brak użycia funkcji API lub języków, które pojawiły się po przesłaniu tego pytania.
  • Pierwszy wiersz posta z odpowiedzią powinien być zgodny z tabelą wyników. Jeśli złamie skrypt tabeli liderów dołączony do pytania, odpowiedź nie będzie konkurować.
  • Jeśli nowo dodana odpowiedź powoduje, że część istniejącej odpowiedzi jest zepsuta, autor starej odpowiedzi powinien ją naprawić (lub staje się niekonkurencyjny).
  • Należy obsługiwać linki do języków, przekreślone wyniki itp.
  • Rangami należy się posługiwać jak we fragmencie (np. Równy wynik => równy stopień => luka w szeregach).

Zaakceptowana odpowiedź to odpowiedź o najniższym wyniku po wystarczającym braku aktywności (minimum 1 miesiąc).

Dobry pomysł

  • Aby przetestować z identyfikatorami pytań 47338 (dla obsługi duplikatów wyników + obsługa wyników przekreślonych) i 17005 (dla obsługi linków). Uderza to odpowiedź z Ważnego na Dobry i chroni przed przerwami z późniejszych zgłoszeń.
  • Aby dołączyć przykłady danych wyjściowych zarówno dla tej, jak i dla przesłoniętych wersji identyfikatora.

Niekoniecznie

  • Obsługa ponad 100 odpowiedzi (limit API dla pojedynczego żądania)
  • Obsługa komentarzy zastępuje
  • Sortowanie sekcji „Zwycięzcy według języka”
  • Dyskryminacja konkurencyjnych i niedziałających odpowiedzi

Tabela liderów

Vi.
źródło
Nieco powiązane i to (ale są to bardzo różne wyzwania).
Stewie Griffin

Odpowiedzi:

2

Perl + Mojolicious, 468 456 469 504 bajtów

Korzystanie z biblioteki 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

Nie golfowany:

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
źródło
Can't locate ojo.pm in @INC-> Czy to oznacza, że ​​nie jest to tylko „Perl”, ale „Perl + Mojolicious”? Czy korzystanie z bibliotek niewłączonych do języka nie jest liczone jako standardowa luka?
Vi.
Jeśli poprawię identyfikator pytania na 47338, nie widzę prawidłowego postępowania z powiązaniami. Zamiast znikać przy zdrowych zmysłach.
Vi.
Korekta: wpisy o tym samym wyniku otrzymują inną rangę. Chociaż nie oznacza to, że ta odpowiedź jest jeszcze nieważna, to nie jest dobra.
Vi.
@Vi. Naprawiono więzi.
Denis Ibaev,
1
Pracuje. Prawdopodobnie najpoważniejszym pozostałym problemem (i prawdopodobnie źródłem opinii negatywnej) jest nazwa zgłoszenia. Może zmień go na „Perl + Mojolicious”, aby uniknąć konkurowania z czystymi rozwiązaniami Perla? Wydaje się, że Mojolicious jest biblioteką zorientowaną na oneliner (a zatem przydatną do gry w golfa), która nie jest zainstalowana w większości wdrożeń Perla, więc nie może być uważana za część języka.
Vi.
6

Python 3, 860 856 bajtów

Lekko grałem w golfa, aby po prostu załadować tabelę wyników i zapewnić szablon innym golfistom:

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

Wcięte za pomocą zakładek. Ostatni printcelowo nie jest zastępowany przez ptworzenie remisu z odpowiedzią Mathematica .

Nie golfowany:

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

Uwaga: nie obsługuje jeszcze poprawnie linków, więc nie działa na przykład w przypadku pytania 17005 .

Vi.
źródło
1
Nawet jeśli sam na to odpowiesz, musisz zagrać w golfa w odpowiedzi na pytanie w golfa .
NoOneIsHere
@NoOneIsHere Nie jestem pewien, czy „ muszę ”. Tylko jeśli „jeśli odpowiesz na pytanie w golfa i chcesz wygrać ”.
Vi.
3
@Vi. Następnie dołącz to do pytania jako rozwiązanie referencyjne. To jest odpowiedź, która nie odpowiada na (twoje) pytanie, które wymaga podania kodu golfowego na kod golfa .
NoOneIsHere
1
@Vi. nie. Albo jest w pełni golfa, albo jest niedozwolony. Jeśli można go łatwo zagrać w golfa, to nie jest to odpowiedź. Naprawdę powiedziałbym, aby zadać to pytanie jako rozwiązanie referencyjne.
Rɪᴋᴇʀ
4
@Vi. Nie, zagraj w golfa w najlepszym wydaniu .
NoOneIsHere
1

Bash + JQ, 399 bajtów

Zauważ, że prawie na pewno można dalej grać w golfa, optymalizując jqlogikę ekspresji.

Grał w golfa

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

Przykładowe dane wyjściowe

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
zepelin
źródło
Jaka wersja jq jest potrzebna? Rozumiemerror: capture is not defined
Vi.
Nie widzę powtarzających się rang, kiedy łatam identyfikator pytania na 47338. Przesłanie może stać się nieważne po ich otrzymaniu (i mogę później dodać specjalną, niekonkurującą pseudo-odpowiedź, aby wymusić poprawną obsługę rang).
Vi.
Odpowiedź CJAM Martina Endera ma „CJam, <s> 28 </s> 27 bajtów”. Powinien być interpretowany jako 27, a nie 28, jak w oficjalnym fragmencie tabeli wyników. Lub Pyth's 19 vs 22 bajtów.
Vi.
Uwaga: „Należy obsługiwać linki do języków, przekreślone wyniki itp.”. w regułach wyzwania.
Vi.
@Vi - Teraz powinno być wszystko ustawione (patrz jqplay.org/s/LuZfAn2Pxr ). Odpowiedź na pytanie nadal wynosi 22 bajty, ponieważ jest po prostu niepoprawnie sformatowana (liczba ostatnich bajtów jest na pierwszym miejscu).
zeppelin
1

Mathematica, 852 856 bajtów

Korzysta z wbudowanego JSONToolspakietu. To nie jest coś, do czego Mathematica ma być używana ... więc użyłem go!

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
źródło
Jak to przetestować? Rozumiem 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., po czym są odciski {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
Może rozwiązanie jest zepsute przez własny kod źródłowy (który oczywiście zawiera <h1>)?
Vi.
@Vi. To dziwne, działa dla mnie. Na jakim pytaniu przetestowałeś to? Nie sądzę, że jest to kod źródłowy, który go psuje, ponieważ API StackExchange automatycznie używa znaków zmiany znaczenia dla <i>.
numbermaniac
Ten, 111735. Ale podmieniłem adres URL /tmp/q.jsontam, gdzie jest wstępnie pobrana odpowiedź JSON.
Vi.
Wyjście dla 47338: paste.debian.net/918716
Vi.