ลีดเดอร์บอร์ดกอล์ฟ


11

เล่นกอล์ฟกระดานผู้นำของคำถามนี้ (id = 111735) โปรแกรมของคุณควรออกหนึ่งร้องขอ HTTP หรือ HTTPS เพื่อ StackExchange API แยกมันและนำเสนอให้กับผู้ใช้ในรูปแบบคล้ายกับทั่วไปลีดเดอร์ Snippet

ตัวอย่างผลลัพธ์ (สำหรับคำถาม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. บรรทัด "ภาษา \ t ผู้ใช้ \ tScore"
  6. สำหรับแต่ละภาษาที่ใช้ชื่อภาษาที่คั่นด้วยแท็บผู้เขียนคำตอบคะแนนต่ำและคะแนน

กล่าวอีกนัยหนึ่งคล้ายกับว่ามีการคัดลอกและวางผลลัพธ์ของส่วนข้อมูลกระดานผู้นำของคำถามนี้ไปยังไฟล์ข้อความ (โดยไม่มีสิ่ง "\ tLink") เห็นแล้วยังดำเนินการอ้างอิงในหลาม

กฎระเบียบ

  • ไม่มีการเข้าถึงเครือข่ายนอกเหนือจากคำขอ API เดียวไปยัง api.stackexchange.com
  • ไม่มีการใช้งานคุณสมบัติ API หรือภาษาที่ปรากฏหลังจากส่งคำถามนี้
  • บรรทัดแรกของคำตอบโพสต์ควรเป็นแบบลีดเดอร์บอร์ด ถ้ามันทำลายสคริปต์กระดานแต้มนำที่แนบกับคำถามคำตอบนั้นจะไม่เป็นการแข่งขัน
  • หากคำตอบที่เพิ่มเข้ามาใหม่ทำให้คำตอบที่มีอยู่นั้นขาดไปผู้เขียนของคำตอบเดิมควรแก้ไข (หรือไม่ใช่การแข่งขัน)
  • ควรจัดการลิงก์ไปยังภาษาขีดฆ่าคะแนน ฯลฯ
  • อันดับควรได้รับการจัดการเหมือนในตัวอย่าง (เช่นคะแนนเท่ากัน => อันดับที่เท่ากัน => ช่องว่างเป็นอันดับ)

คำตอบที่ยอมรับคือคำตอบที่มีคะแนนต่ำสุดหลังจากไม่มีการใช้งานในจำนวนที่เพียงพอ (อย่างน้อย 1 เดือน)

ความคิดที่ดี

  • เพื่อทดสอบด้วย ID คำถาม 47338 (สำหรับการจัดการคะแนนซ้ำ + การจัดการคะแนนแบบขีดออก) และ 17005 (สำหรับการจัดการลิงก์) สิ่งนี้จะทำให้คำตอบจากใช้ได้ถึงดีและปกป้องจากช่วงพักจากการส่งในภายหลัง
  • หากต้องการรวมตัวอย่างเอาต์พุตทั้งสำหรับสิ่งนี้และเวอร์ชัน ID ที่แทนที่

ไม่จำเป็น

  • การจัดการมากกว่า 100 คำตอบ (จำกัด API สำหรับคำขอเดียว)
  • การจัดการการแทนที่ความคิดเห็น
  • การเรียงลำดับของส่วน "ผู้ชนะตามภาษา"
  • การแยกแยะคำตอบที่แข่งขันและแตกหัก

ลีดเดอร์บอร์ด


ค่อนข้างเกี่ยวข้อง และสิ่งนี้ (แต่มันเป็นความท้าทายที่แตกต่างกันมาก)
Stewie Griffin

คำตอบ:


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"? การใช้ห้องสมุดที่ไม่ได้รวมอยู่กับภาษานั้นไม่ถือเป็นช่องโหว่มาตรฐานหรือไม่?
วิ

หากฉันแก้ไข ID คำถามถึง 47338 ฉันไม่เห็นการจัดการความสัมพันธ์ที่ถูกต้อง แทนที่จะมีรายการลำดับที่มีสติหายไป
วิ

การแก้ไข: รายการคะแนนเดียวกันได้รับอันดับที่แตกต่างกัน แม้ว่าสิ่งนี้จะไม่ทำให้คำตอบนี้ไม่ถูกต้อง แต่ก็ยังไม่ดี
วิ

@Vi ความสัมพันธ์คงที่
เดนิส Ibaev

1
โรงงาน อาจเป็นปัญหาที่ร้ายแรงที่สุดที่เหลืออยู่ (และน่าจะเป็นแหล่งที่มาของ downvote) คือชื่อการส่ง อาจเปลี่ยนเป็น "Perl + Mojolicious" เพื่อหลีกเลี่ยงการแข่งขันกับโซลูชัน Perl บริสุทธิ์? Mojolicious ดูเหมือนว่าจะเป็น oneliner-oriented (ดังนั้นมีประโยชน์สำหรับการเล่นกอล์ฟ) ไม่ได้ติดตั้งในการปรับใช้ 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


1
แม้ว่าคุณจะตอบคำถามด้วยตัวเองคุณต้องตีกอล์ฟเพื่อตอบคำถามกอล์ฟ
NoOneIsHere

@ ไม่มีใครที่นี่ฉันไม่แน่ใจเกี่ยวกับ " ต้อง " เฉพาะในกรณี "ถ้าคุณตอบคำถามกอล์ฟและต้องการชนะ "
วิ

3
@Vi จากนั้นรวมไว้ในคำถามเป็นวิธีการอ้างอิง นี่คือคำตอบที่ไม่ตอบ (คุณเอง) คำถามที่ถามรหัสแข็งแรงเล่นกอล์ฟต่อรหัสกอล์ฟ
NoOneIsHere

1
@Vi Nope ไม่ว่าจะเล่นกอล์ฟเต็มหรือไม่ได้รับอนุญาต ถ้ามันสามารถเล่นกอล์ฟได้ง่ายมันก็ไม่ใช่คำตอบ ฉันอยากบอกว่าให้ใส่ไว้ในคำถามเพื่อเป็นทางออกอ้างอิง
Rɪᴋᴇʀ

4
@Vi ไม่มีกอล์ฟมันที่ดีที่สุดของคุณขยาย
NoOneIsHere

1

Bash + 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
ไว

ฉันไม่เห็นอันดับซ้ำเมื่อฉันแก้ไขรหัสคำถามถึง 47338 การส่งอาจไม่ถูกต้องเมื่อพวกเขามาถึง (และฉันอาจเพิ่มการหลอกตอบที่ไม่แข่งขันเป็นพิเศษเพื่อบังคับการจัดการลำดับที่ถูกต้อง)
วิ

คำตอบ CJAM ของ Martin Ender มี "CJam, <s> 28 </s> 27 bytes" ควรตีความว่าเป็น 27 ไม่ใช่ 28 เหมือนในตัวอย่างกระดานแต้มนำทางการ หรือ Pyth's 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"]]]

ฉันจะทดสอบได้อย่างไร ฉันจะได้รับหลังจากที่พิมพ์เป็น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 มันแปลกสำหรับฉัน คุณทดสอบคำถามข้อใด ฉันไม่คิดว่ามันเป็นซอร์สโค้ดที่ทำลายมันเพราะ StackExchange API ใช้ HTML escapes สำหรับ <และ> โดยอัตโนมัติ
numbermaniac

อันนี้, 111735. แต่ฉันแทน URL /tmp/q.jsonที่มีการตอบ JSON ที่ดาวน์โหลดล่วงหน้า
วิ

ผลลัพธ์สำหรับ 47338: paste.debian.net/918716
Vi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.