리더 보드 골프


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 개월) 점수가 가장 낮은 답변입니다.

좋은 생각

  • 질문 ID 47338 (중복 점수 처리 + 취소 된 점수 처리) 및 17005 (링크 처리)로 테스트합니다. 이렇게하면 정답에서 양호로의 응답이 올라가고 이후 제출에서 중단되지 않도록 보호합니다.
  • 이 버전과 재정의 된 ID 버전 모두에 대한 출력 예제를 포함합니다.

불필요

  • 100 개가 넘는 답변 처리 (단일 요청에 대한 API 제한)
  • 주석 대체 처리
  • "언어 별 수상자"섹션 정렬
  • 경쟁 및 파단 답변의 차별

리더 보드


다소 관련 (하지만 그들은 매우 다른 문제이다).
Stewie Griffin

답변:


2

펄 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

언 골프 드 :

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"라는 의미입니까? 언어에 포함되지 않은 라이브러리를 사용하는 것이 표준 허점으로 간주되지 않습니까?
Vi.

질문 ID를 47338로 패치하면 올바른 관계 처리가 표시되지 않습니다. 제정신 순위 항목 대신 사라집니다.
Vi.

수정 : 동일한 점수 항목은 다른 순위를받습니다. 이렇게해도이 답변이 유효하지는 않지만 (아직) 좋지 않습니다.
Vi.

@Vi. 고정 타이.
Denis Ibaev

1
공장. 아마도 가장 심각한 남은 문제 (및 아마도 공감의 출처)는 제출 이름입니다. 순수한 Perl 솔루션과의 경쟁을 피하기 위해 "Perl + Mojolicious"로 변경 하시겠습니까? Mojolicious는 대부분의 Perl 배포에 설치되지 않은 oneliner 지향 (따라서 골프에 유용) 라이브러리 인 것처럼 보이므로 언어의 일부로 간주 될 수 없습니다.
Vi.

6

파이썬 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]))

탭으로 들여 쓰기 마지막 printMathematica 답변p 과 점수 매기기를 만들기 위해 의도적으로 대체되지 않습니다 .

언 골프 드 :

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 질문에 실패 합니다.


1
당신이 스스로 대답 경우에도 골프에 대한 답변 코드 골프 질문을.
NoOneIsHere 여기

@NoOneIs 여기, " 필요 " 에 대해 잘 모르겠습니다 . "코드 골프 질문에 답 하고 이기고 싶은 경우에만 ".
Vi.

3
@Vi. 그런 다음 질문에 참조 솔루션으로 포함하십시오. 이것은 code-golf골프 코드를 요청하는 (자신의) 질문에 대한 답변이 아닙니다 .
NoOneIsHere 여기

1
@Vi. 아니. 완전히 골프를 타거나 허용되지 않습니다. 쉽게 골프를 칠 수 있다면 대답이 아닙니다. 나는 그것을 참조 솔루션으로 질문에 넣는 것만으로 정말로 말하고 싶습니다.
Rɪᴋᴇʀ

4
@Vi. 아니요, 최대한 확장하십시오 .
NoOneIsHere 여기

1

배쉬 + JQ, 399 바이트

jq식 논리 를 최적화하면 거의 확실하게 더 골프를 치는 것이 가능 합니다.

골프

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
Vi.

질문 ID를 47338로 패치 할 때 반복 된 순위가 표시되지 않습니다. 제출이 도착하면 제출이 유효하지 않을 수 있습니다 (그리고 나중에 정확한 순위 처리를 강제하기 위해 경쟁이되지 않는 의사-응답을 추가 할 수 있습니다).
Vi.

Martin Ender의 CJAM 답변에는 "CJam, <s> 28 </ s> 27 바이트"가 있습니다. 공식 리더 보드 스 니펫과 같이 28이 아니라 27로 해석되어야합니다. 또는 Pyth의 19 대 22 바이트.
Vi.

"* 언어 링크, 파업 점수 등을 처리해야합니다."라는 점에 유의하십시오. 도전 규칙에서.
Vi.

@Vi-이제 모두 설정해야합니다 ( jqplay.org/s/LuZfAn2Pxr 참조 ). Pyth 답변은 여전히 ​​22 바이트입니다. 단순히 올바르게 포맷되지 않기 때문입니다 (마지막 바이트 수가 먼저 나타남).
zeppelin

1

매스 매 티카, 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"]]]

어떻게 테스트합니까? 나는 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}}.
Vi.

어쩌면 솔루션이 자체 소스 코드 (분명히 포함되어 있음 <h1>)에 의해 손상되었을 수 있습니까?
Vi.

@Vi. 이상하다, 나를 위해 일하고있다. 어떤 질문을 테스트 했습니까? StackExchange API는 <및>에 대해 자동으로 HTML 이스케이프를 사용하기 때문에 소스 코드가 아닌 것 같습니다.
numbermaniac

이건 111735입니다.하지만 /tmp/q.json미리 다운로드 한 JSON 응답이있는 위치로 URL을 대체했습니다 .
Vi.

47338의 출력 : paste.debian.net/918716
Vi.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.