Papan golf

11

Golf papan peringkat dari pertanyaan ini (id = 111735). Program Anda harus mengeluarkan satu permintaan HTTP atau HTTPS ke StackExchange API, menguraikannya dan menyajikannya kepada pengguna dalam bentuk yang mirip dengan Cuplikan Papan Skor khas

Contoh keluaran (untuk pertanyaan 47338 alih-alih ini):

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

Perhatikan peringkat berulang 3, 5 dan 16. Mungkin saya bahkan akan menambahkan jawaban khusus yang tidak bersaing hanya untuk memaksa penyerahan skor duplikat yang benar dan tidak disederhanakan.

Output harus terdiri dari:

  1. Garis "Papan Peringkat"
  2. Baris "\ tAuthor \ tLanguage \ tSize"
  3. Untuk setiap jawaban, garis pangkat dan a yang dipisahkan tab ., lalu jawab nama penulis, lalu nama bahasa, lalu skor; dalam urutan naik untuk skor
  4. Baris "Pemenang berdasarkan Bahasa"
  5. Baris "Bahasa \ t Pengguna \ tScore"
  6. Untuk setiap bahasa yang digunakan, nama bahasa yang dipisahkan tab, pembuat jawaban dengan skor lebih rendah dan skor

Dengan kata lain, sesuatu seperti seolah-olah seseorang menyalin dan menempelkan hasil potongan leaderboard pertanyaan ini ke file teks (tanpa hal-hal "\ tLink"). Lihat juga implementasi referensi dalam Python .

Aturan

  • Tidak ada akses jaringan selain dari satu permintaan API ke api.stackexchange.com
  • Tidak ada penggunaan fitur atau bahasa API yang muncul setelah pengajuan pertanyaan ini.
  • Baris pertama dari pos jawaban harus kompatibel dengan Papan. Jika itu merusak skrip leaderboard yang dilampirkan pada pertanyaan maka jawabannya tidak bersaing.
  • Jika jawaban yang baru ditambahkan membuat beberapa jawaban yang ada rusak, maka penulis jawaban lama harus memperbaikinya (atau menjadi tidak bersaing).
  • Tautan ke bahasa, mencoret skor, dll. Harus ditangani.
  • Peringkat harus ditangani seperti dalam cuplikan (misalnya skor sama => peringkat sama => kesenjangan dalam peringkat).

Jawaban yang diterima adalah jawaban dengan skor terendah setelah tidak aktif dalam jumlah yang cukup (minimal 1 bulan).

Ide bagus

  • Untuk menguji dengan ID pertanyaan 47338 (untuk penanganan skor rangkap + penanganan skor berganda) dan 17005 (untuk penanganan tautan). Ini menabrak jawaban dari Valid ke Good dan melindungi dari jeda dari pengiriman selanjutnya.
  • Untuk memasukkan contoh output baik untuk ini dan untuk versi ID yang diganti.

Tidak perlu

  • Penanganan lebih dari 100 jawaban (batas API untuk satu permintaan)
  • Penanganan menimpa komentar
  • Menyortir bagian "Pemenang berdasarkan Bahasa"
  • Diskriminasi atas jawaban yang bersaing dan rusak

Papan peringkat

Vi.
sumber
Agak terkait dan ini (tetapi mereka tantangan yang sangat berbeda).
Stewie Griffin

Jawaban:

2

Perl + Mojolicious, 468 456 469 504 byte

Menggunakan perpustakaan 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

Tidak Disatukan:

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
sumber
Can't locate ojo.pm in @INC-> Apakah itu berarti bahwa itu bukan hanya "Perl", tetapi "Perl + Mojolicious"? Tidak menggunakan pustaka non-termasuk-dengan-bahasa dianggap sebagai celah standar?
Vi.
Jika saya menambal ID pertanyaan ke 47338, saya tidak melihat penanganan ikatan yang benar. Alih-alih memiliki entri peringkat waras menghilang.
Vi.
Koreksi: entri dengan skor yang sama menerima peringkat yang berbeda. Meskipun ini tidak membuat jawaban ini tidak valid (belum), itu Tidak Baik.
Vi.
@ Vi. Ikatan tetap.
Denis Ibaev
1
Bekerja Mungkin masalah yang tersisa paling serius (dan diduga sumber downvote) adalah nama pengiriman. Mungkin mengubahnya menjadi "Perl + Mojolicious" untuk menghindari bersaing dengan solusi Perl murni? Perpustakaan Mojolicious tampaknya berorientasi pada satu jalur (karenanya berguna untuk bermain golf) tidak diinstal di sebagian besar penyebaran Perl, jadi tidak dapat dianggap sebagai bagian dari bahasa.
Vi.
6

Python 3, 860 856 byte

Golf sedikit, hanya untuk bootstrap leaderboard dan menyediakan beberapa template untuk pegolf lain:

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

Diindentasi dengan tab. Yang terakhir printsengaja tidak digantikan dengan pmembuat skor dasi dengan jawaban Mathematica .

Tidak Disatukan:

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

Catatan: belum menangani tautan dengan benar, jadi gagal untuk, misalnya, pertanyaan 17005 .

Vi.
sumber
1
Bahkan jika Anda menjawabnya sendiri, Anda harus golf jawaban untuk pertanyaan kode-golf .
NoOneIsHere
@NoOneIsHere, saya tidak yakin tentang " harus ". Hanya jika "jika Anda menjawab pertanyaan kode-golf dan ingin menang ".
Vi.
3
@ Vi. Kemudian sertakan dalam pertanyaan sebagai solusi referensi. Ini adalah jawaban, yang tidak menjawab pertanyaan (Anda sendiri), yang meminta kode golf , per kode-golf .
NoOneIsHere
1
@ Vi. nggak. Entah itu sepenuhnya golf atau tidak diizinkan. Jika itu bisa dengan mudah di mainkan, maka itu bukan jawaban. Saya benar-benar mengatakan hanya untuk memasukkannya ke dalam pertanyaan sebagai solusi referensi.
Rɪᴋᴇʀ
4
@ Vi. Tidak, golf sejauh yang Anda inginkan .
NoOneIsHere
1

Bash + JQ, 399 byte

Catatan, ini hampir dapat dipastikan golf lebih lanjut, dengan mengoptimalkan jqlogika ekspresi.

Golf

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

Output Sampel

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
zeppelin
sumber
Versi jq apa yang dibutuhkan? Saya mengertierror: capture is not defined
Vi.
Saya tidak melihat peringkat berulang ketika saya menambal ID pertanyaan ke 47338. Kiriman tersebut mungkin menjadi tidak valid saat mereka tiba (dan nantinya saya dapat menambahkan jawaban semu yang tidak bersaing hanya untuk memaksa penanganan peringkat yang benar).
Vi.
Jawaban CJAM Martin Ender memiliki "CJam, <s> 28 </s> 27 byte". Ini harus ditafsirkan sebagai 27, bukan 28, seperti dalam cuplikan papan peringkat resmi. Atau Pyth's 19 vs 22 byte.
Vi.
Perhatikan poin "* Tautan ke bahasa, skor yang dicoret, dll. Harus ditangani." dalam aturan tantangan.
Vi.
@ Vi - Seharusnya sudah siap sekarang (lihat jqplay.org/s/LuZfAn2Pxr ). Jawaban Pyth masih 22 byte, karena tidak diformat dengan benar (jumlah byte terakhir lebih dulu).
zeppelin
1

Mathematica, 852 856 byte

Menggunakan JSONToolspaket bawaan. Ini bukan jenis yang dimaksudkan untuk digunakan oleh Mathematica ... jadi saya menggunakannya!

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
sumber
Bagaimana saya mengujinya? Saya mendapatkan 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., setelah itu cetak {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.
Mungkin solusinya rusak oleh kode sumbernya sendiri (yang jelas berisi <h1>)?
Vi.
@ Vi. Aneh, itu bekerja untuk saya. Di pertanyaan manakah Anda mengujinya? Saya tidak berpikir itu kode sumber yang memecahkannya, karena StackExchange API menggunakan HTML escapes untuk <dan> secara otomatis.
numbermaniac
Yang ini, 111735. Tapi saya mengganti URL dengan di /tmp/q.jsonmana ada balasan JSON yang sudah diunduh.
Vi.
Output untuk 47338: paste.debian.net/918716
Vi.