Таблица лидеров гольфа

11

Гольф таблица лидеров этого вопроса (id = 111735). Ваша программа должна выдать один HTTP или HTTPS-запрос в StackExchange API, проанализировать его и представить пользователю в форме, аналогичной типичному фрагменту таблицы лидеров.

Пример вывода (для вопроса 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

Обратите внимание на повторяющиеся ранги 3, 5 и 16. Может быть, я даже добавлю специальный неконкурентный ответ только для того, чтобы заставить правильно, не упрощать передачу дубликатов партитуры.

Вывод должен состоять из:

  1. Линия "Таблица лидеров"
  2. Строка "\ tAuthor \ tLanguage \ tSize"
  3. Для каждого ответа - разделенная табуляцией строка ранга и a ., затем имя автора ответа, затем имя языка, затем оценка; в порядке возрастания баллов
  4. Строка "Победители по языку"
  5. Строка "Language \ tUser \ tScore"
  6. Для каждого используемого языка, имя языка, разделенного табуляцией, автор ответа с низким баллом и оценка

Другими словами, что-то вроде, как будто кто-то копирует и вставляет результат из списка лидеров этого вопроса в текстовый файл (без вещей "\ tLink"). Смотрите также справочную реализацию в Python .

правила

  • Нет доступа к сети, кроме одного запроса API к api.stackexchange.com
  • Никакое использование функций API или языков, которые появились после представления этого вопроса.
  • Первая строка ответа должна быть совместима с таблицей лидеров. Если это нарушает сценарий таблицы лидеров, прикрепленный к вопросу, то ответ не конкурирует.
  • Если при добавлении нового ответа какой-либо существующий ответ искажается, автор старого ответа должен это исправить (или он становится неконкурентным).
  • Ссылки на языки, вычеркнутые оценки и т. Д. Должны обрабатываться.
  • Ранги должны обрабатываться как во фрагменте (например, равный счет => равный ранг => разрыв в рангах).

Принятым ответом является ответ с наименьшим количеством баллов после достаточного количества бездействия (минимум 1 месяц).

Хорошая идея

  • Для тестирования с идентификаторами вопросов 47338 (для обработки дублированных баллов + обработка вычеркнутых баллов) и 17005 (для обработки ссылок). Это увеличивает ответ от Действительный до Хорошего и защищает от перерывов в последующих отправках.
  • Включить выходные примеры как для этой, так и для переопределенных версий идентификаторов.

Не обязательно

  • Обработка более 100 ответов (ограничение API для одного запроса)
  • Обработка переопределений комментариев
  • Сортировка раздела "Победители по языку"
  • Дискриминация конкурирующих и неправильных ответов

Leaderboard

Vi.
источник
С чем-то связано и это (но они очень разные задачи).
Стьюи Гриффин

Ответы:

2

Perl + Mojolicious, 468 456 469 504 байта

Использование 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-> Значит ли это, что это не просто «Perl», но «Perl + Mojolicious»? Разве использование библиотек, не включенных в язык, не считается стандартной лазейкой?
Ви.
Если я исправлю идентификатор вопроса на 47338, я не вижу правильной обработки связей. Вместо того, чтобы вменяемые звания исчезают
Ви.
Исправление: записи с одинаковым счетом получают разные звания. Хотя это не делает этот ответ недействительным (пока), это не хорошо.
Ви.
@Vi. Исправлены связи.
Денис Ибаев
1
Работает. Вероятно, наиболее серьезной остающейся проблемой (и предположительно источником downvote) является имя представления. Может быть, изменить его на «Perl + Mojolicious», чтобы не конкурировать с чистыми решениями Perl? Mojolicious, похоже, ориентирована на пользователя (поэтому полезна для игры в гольф) и не установлена ​​в большинстве развертываний Perl, поэтому не может считаться частью языка.
Ви.
6

Python 3, 860 856 байт

Слегка играем в гольф, просто чтобы загрузить таблицу лидеров и предоставить шаблон для других игроков в гольф:

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

Отступ с вкладками. Последнее printнамеренно не заменяется, pчтобы создать счет с ответом 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]))

Примечание: он еще не обрабатывает ссылки правильно, поэтому не работает, например, с вопросом 17005 .

Vi.
источник
1
Даже если вы ответите сами, вы должны ответить на вопрос о код-гольфе .
NoOneIsHere
@ NoOneIsHere, я не уверен насчет " должен ". Только если «если вы ответите на вопрос о код-гольфе и хотите выиграть ».
Ви.
3
@Vi. Затем включите его в вопрос в качестве справочного решения. Это ответ, который не отвечает на (ваш) вопрос, который запрашивает код для игры в гольф на код-гольф .
NoOneIsHere
1
@Vi. Нет. Либо это полностью игра в гольф, либо это запрещено. Если это можно легко сыграть в гольф, то это не ответ. Я бы на самом деле сказал, что просто поставлю вопрос в качестве справочного решения.
17
4
@Vi. Нет, игра в гольф в меру ваших возможностей .
NoOneIsHere
1

Bash + JQ, 399 байт

Обратите внимание, что это почти наверняка может быть улучшено путем оптимизации jqлогики выражения.

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

Пример вывода

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
дирижабль
источник
Какая версия jq нужна? Я понимаюerror: capture is not defined
Ви.
Я не вижу повторяющихся рангов, когда я исправляю идентификатор вопроса на 47338. Представление может стать недействительным по мере их поступления (и позже я могу добавить специальный неконкурентный псевдо-ответ только для принудительной правильной обработки рангов).
Ви.
Ответ CJAM Мартина Эндера имеет «CJam, <s> 28 </ s> 27 байт». Его следует интерпретировать как 27, а не 28, как в официальном фрагменте таблицы лидеров. Или Пиф 19 против 22 байтов.
Ви.
Обратите внимание на пункт "* Ссылки на языки, вычеркнутые оценки и т. Д. Должны обрабатываться". в правилах вызова.
Ви.
@Vi - Теперь все должно быть настроено (см. Jqplay.org/s/LuZfAn2Pxr ). Ответ Pyth по-прежнему составляет 22 байта, поскольку он просто не отформатирован правильно (последний счетчик байтов идет первым).
Цеппелин
1

Mathematica, 852 856 байт

Использует встроенный JSONToolsпакет. Это не та вещь, для которой Mathematica предназначена для использования ... поэтому я использовал ее!

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
источник
Как мне это проверить? Я получаю 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., после чего отпечатки {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Ви.
Может быть, решение нарушено собственным исходным кодом (который, очевидно, содержит <h1>)?
Ви.
@Vi. Это странно, это работает для меня. Какой вопрос вы проверяли? Я не думаю, что это исходный код, нарушающий его, потому что API StackExchange использует экранирование HTML для <и> автоматически.
Numbermaniac
Это 111735. Но я заменил URL-адрес тем, /tmp/q.jsonгде есть предварительно загруженный ответ JSON.
Ви.
Выход для 47338: paste.debian.net/918716
Vi.