Bảng xếp hạng golf


11

Golf bảng xếp hạng của câu hỏi này (id = 111735). Chương trình của bạn nên đưa ra một yêu cầu HTTP hoặc HTTPS cho API StackExchange, phân tích cú pháp và trình bày cho người dùng ở dạng tương tự như một Đoạn bảng dẫn điển hình

Đầu ra mẫu (cho câu hỏi 47338 thay vì điều này):

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

Lưu ý các cấp bậc lặp lại 3, 5 và 16. Có lẽ tôi thậm chí sẽ thêm một câu trả lời không cạnh tranh đặc biệt chỉ để buộc bàn giao chính xác, không đơn giản hóa các điểm trùng lặp.

Đầu ra phải bao gồm:

  1. Dòng "Bảng dẫn"
  2. Dòng "\ tAuthor \ tL Language \ tSize"
  3. Đối với mỗi câu trả lời, dòng xếp hạng được phân tách bằng tab và a ., sau đó trả lời tên tác giả, sau đó là tên ngôn ngữ, sau đó ghi điểm; theo thứ tự tăng dần cho điểm
  4. Dòng "Người chiến thắng theo ngôn ngữ"
  5. Dòng "Ngôn ngữ \ tUser \ tScore"
  6. Đối với mỗi ngôn ngữ được sử dụng, tên ngôn ngữ được phân tách bằng tab, tác giả của câu trả lời điểm thấp hơn và điểm số

Nói cách khác, một cái gì đó giống như một bản sao và dán kết quả của đoạn bảng dẫn của câu hỏi này vào một tệp văn bản (không có những thứ "\ tLink"). Xem thêm việc thực hiện tham chiếu trong Python .

Quy tắc

  • Không có quyền truy cập mạng ngoài một yêu cầu API tới api.stackexchange.com
  • Không sử dụng các tính năng hoặc ngôn ngữ API xuất hiện sau khi gửi câu hỏi này.
  • Dòng đầu tiên của bài trả lời phải tương thích với Bảng dẫn. Nếu nó phá vỡ kịch bản bảng xếp hạng kèm theo câu hỏi thì câu trả lời là không cạnh tranh.
  • Nếu câu trả lời mới được thêm vào làm cho một số câu trả lời hiện có bị hỏng thì tác giả của câu trả lời cũ sẽ sửa nó (hoặc nó trở nên không cạnh tranh).
  • Liên kết đến các ngôn ngữ, điểm số nổi bật, vv nên được xử lý.
  • Các cấp bậc phải được xử lý như trong đoạn trích (ví dụ: điểm bằng nhau => thứ hạng bằng nhau => khoảng cách về thứ hạng).

Câu trả lời được chấp nhận là câu trả lời có số điểm thấp nhất sau khi không đủ số lượng không hoạt động (tối thiểu 1 tháng).

Ý tưởng tốt

  • Để kiểm tra với ID câu hỏi 47338 (để xử lý điểm trùng lặp + xử lý điểm nổi bật) và 17005 (để xử lý liên kết). Điều này đưa ra câu trả lời từ Hợp lệ đến Tốt và bảo vệ khỏi sự phá vỡ từ các lần gửi sau.
  • Để bao gồm các ví dụ đầu ra cho cả phiên bản này và cho các phiên bản ID bị ghi đè.

Không cần thiết

  • Xử lý hơn 100 câu trả lời (giới hạn API cho một yêu cầu)
  • Xử lý ghi đè nhận xét
  • Sắp xếp phần "Người chiến thắng theo ngôn ngữ"
  • Phân biệt đối xử cạnh tranh và câu trả lời bị hỏng

Bảng xếp hạng


Hơi liên quanđiều này (nhưng chúng là những thách thức rất khác nhau).
Stewie Griffin ngày

Câu trả lời:


2

Perl + Mojolicy, 468 456 469 504 byte

Sử dụng thư viện Mojolicy .

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

Ung dung:

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-> Điều đó có nghĩa là nó không chỉ là "Perl", mà là "Perl + Mojolicy"? Không sử dụng các thư viện không bao gồm ngôn ngữ được tính là một lỗ hổng tiêu chuẩn?
Vi.

Nếu tôi vá ID câu hỏi thành 47338, tôi sẽ không thấy việc xử lý quan hệ chính xác. Thay vì có các mục xếp hạng lành mạnh biến mất.
Vi.

Sửa chữa: các mục cùng điểm nhận thứ hạng khác nhau. Mặc dù điều này không khiến câu trả lời này không hợp lệ (chưa), nhưng nó không tốt.
Vi.

@Vi. Quan hệ cố định.
Denis Ibaev

1
Làm. Có lẽ vấn đề nghiêm trọng nhất còn lại (và được cho là nguồn gốc của downvote) là tên trình. Có thể thay đổi nó thành "Perl + Mojolicy" để tránh cạnh tranh với các giải pháp Perl thuần túy? Mojolicy dường như là thư viện hướng oneliner (do đó hữu ích cho việc chơi gôn) không được cài đặt trong hầu hết các triển khai Perl, vì vậy không thể được coi là một phần của ngôn ngữ.
Vi.

6

Python 3, 860 856 byte

Chơi gôn một chút, chỉ để bootstrap bảng xếp hạng và cung cấp một số mẫu cho những người chơi golf khác:

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

Thụt lề với các tab. Việc cuối cùng printlà cố tình không được thay thế bằng cách ptạo ra một điểm số với câu trả lời Mathicala .

Ung dung:

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

Lưu ý: nó chưa xử lý các liên kết chính xác, vì vậy, không thành công, ví dụ, câu hỏi 17005 .


1
Ngay cả khi bạn tự trả lời, bạn phải đánh một câu trả lời cho câu hỏi về môn đánh gôn .
NoOneIsĐây là

@NoOneIsHere, tôi không chắc chắn về " phải ". Chỉ khi "nếu bạn trả lời câu hỏi về môn đánh gôn và muốn giành chiến thắng ".
Vi.

3
@Vi. Sau đó đưa nó vào câu hỏi như một giải pháp tham khảo. Đây là một câu trả lời, không trả lời câu hỏi (của riêng bạn), yêu cầu mã đánh gôn , cho mỗi mã golf .
NoOneIsĐây là

1
@Vi. không Nó hoàn toàn bị đánh gôn hoặc không được phép. Nếu nó có thể dễ dàng được đánh golf, thì đó không phải là một câu trả lời. Tôi thực sự muốn nói chỉ cần đặt nó trong câu hỏi như một giải pháp tham khảo.
Rɪᴋᴇʀ

4
@Vi. Không, đánh gôn nó tốt nhất của bạn .
NoOneIsHãy

1

Bash + JQ, 399 byte

Lưu ý, điều này gần như chắc chắn có thể được đánh gôn hơn nữa, bằng cách tối ưu hóa jqlogic biểu thức.

Chơi gôn

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

Đầu ra mẫu

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

Phiên bản nào của jq là cần thiết? Tôi nhận đượcerror: capture is not defined
Vi.

Tôi không thấy các cấp bậc lặp đi lặp lại khi tôi vá ID câu hỏi thành 47338. Việc gửi có thể trở nên không hợp lệ khi chúng đến (và sau đó tôi có thể thêm một câu trả lời giả không cạnh tranh đặc biệt chỉ để buộc xử lý đúng thứ hạng).
Vi.

Câu trả lời CJAM của Martin Ender có "CJam, <s> 28 </ s> 27 byte". Nó nên được hiểu là 27, không phải 28, như trong đoạn trích bảng chính thức. Hoặc 19 so với 22 byte của Pyth.
Vi.

Lưu ý điểm "* Liên kết đến các ngôn ngữ, điểm số nổi bật, v.v. nên được xử lý." trong các quy tắc thách thức.
Vi.

@Vi - Nên đặt tất cả ngay bây giờ (xem jqplay.org/s/LuZfAn2Pxr ). Câu trả lời thứ ba vẫn là 22 byte, vì đơn giản là nó không được định dạng chính xác (số byte cuối cùng xuất hiện trước).
zeppelin ngày

1

Mathicala, 852 856 byte

Sử dụng JSONToolsgói tích hợp. Đây không phải là thứ mà Mathicala muốn dùng để ... vì vậy tôi đã sử dụng nó!

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

Làm thế nào để tôi kiểm tra nó? Tôi nhận được 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., sau đó các bản in {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.

Có lẽ giải pháp bị phá vỡ bởi mã nguồn riêng của nó (rõ ràng có chứa <h1>)?
Vi.

@Vi. Điều đó thật lạ, nó hiệu quả với tôi. Câu hỏi nào bạn đã kiểm tra nó? Tôi không nghĩ rằng đó là mã nguồn phá vỡ nó, bởi vì API StackExchange sử dụng HTML thoát tự động cho <và>.
numbermaniac

Cái này, 111735. Nhưng tôi đã thay thế URL bằng /tmp/q.jsonnơi có câu trả lời JSON được tải xuống trước.
Vi.

Đầu ra cho 47338: paste.debian.net/918716
Vi.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.