Büyük afiş golf


11

Bu sorunun lider tablosunda golf (id = 111735). Programınız StackExchange API'sına bir HTTP veya HTTPS isteği göndermeli, ayrıştırmalı ve tipik bir Lider Tablosu Snippet'ine benzer biçimde kullanıcıya sunmalıdır

Örnek çıktı ( bunun yerine 47338 sorusu için ):

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

Tekrarlanan 3, 5 ve 16. derecelere dikkat edin. Belki de sadece skor kopyalarının doğru ve basit olmayan bir şekilde teslim edilmesini zorlamak için özel bir rakip olmayan cevap ekleyeceğim.

Çıktı şunlardan oluşmalıdır:

  1. "Büyük Afiş" satırı
  2. "\ TAuthor \ tLanguage \ tSize" satırı
  3. Her cevap için sekmeyle ayrılmış sıra ve bir satır ., daha sonra yazar adını, sonra dil adını, sonra puanı cevaplayın; puan için artan sırada
  4. "Dile Göre Kazananlar" satırı
  5. "Dil \ tUser \ tScore" satırı
  6. Kullanılan her dil, sekmeyle ayrılmış dil adı, düşük puan cevabının yazarı ve puan

Başka bir deyişle, bu sorunun büyük şerit snippet'inin bir metin dosyasına ("\ tLink" olmadan) kopyalanması ve yapıştırılması gibi bir şey. Ayrıca bkz . Python'daki referans uygulaması .

kurallar

  • İçin bir API isteği dışında ağ erişimi yok api.stackexchange.com
  • Bu sorunun gönderilmesinden sonra görünen API özelliklerinin veya dillerinin kullanımı yoktur.
  • Cevap mesajının ilk satırı Lider Tablosuyla uyumlu olmalıdır. Eğer soruya ekli skor tablosu betiğini kırarsa, cevap rakip değildir.
  • Yeni eklenen cevap mevcut bir cevabı kırılmışsa, eski cevabın yazarı bunu düzeltmelidir (ya da rakipsiz hale gelir).
  • Dillerin bağlantıları, dikkat çeken puanlar, vb. Ele alınmalıdır.
  • Rütbeler snippet'teki gibi ele alınmalıdır (örn. Eşit puan => eşit rütbe => rütbelerdeki boşluk).

Kabul edilen cevap, yeterli miktarda hareketsizlikten sonra (en az 1 ay) en düşük puana sahip cevaptır.

İyi bir fikir

  • 47338 soru kimlikleriyle test etmek için (mükerrer skor yönetimi + çarpılmış skor yönetimi için) ve 17005 (linklerin kullanımı için). Bu, cevabı Geçerli ila İyiye çarptırır ve sonraki gönderilerden kopmalara karşı korur.
  • Bu ve geçersiz kılınan kimlik sürümleri için çıktı örnekleri dahil etmek.

Gerekli değil

  • 100'den fazla cevabın ele alınması (tek talep için API limiti)
  • Yorum geçersiz kılma işlemlerini yapma
  • "Kazananlar Dile Göre" bölümünün sıralanması
  • Rakip ve kırık cevapların ayrımı

Liderler Sıralaması


Biraz ilgili ve bu (ama çok farklı zorluklar var).
Stewie Griffin

Yanıtlar:


2

Perl + Mojolicious, 468 456 469 504 bayt

Mojolicious kütüphanesini kullanma .

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-> Bu sadece "Perl" değil, "Perl + Mojolicious" olduğu anlamına mı geliyor? Dile dahil olmayan kitaplıkların kullanılması standart bir boşluk olarak sayılmaz mı?
Vi.

Soru kimliğini 47338'e eklersem, bağların doğru bir şekilde ele alındığını göremiyorum. Aklı başında girişleri kaybolmak yerine.
Vi.

Düzeltme: aynı skor girişleri farklı rütbe alır. Bu, bu yanıtı geçersiz kılmasa da (İyi değil).
Vi.

@Vi. Sabit bağlar.
Denis Ibaev

1
İşler. Muhtemelen kalan en ciddi sorun (ve sözde downvote'un kaynağı) başvuru adıdır. Saf Perl çözümleriyle rekabet etmekten kaçınmak için belki de "Perl + Mojolicious" olarak değiştirin? Mojolicious, çoğu Perl dağıtımında yüklü olmayan oneliner odaklı (dolayısıyla golf için yararlı) bir kütüphane gibi görünüyor, bu nedenle dilin bir parçası olarak kabul edilemez.
Vi.

6

Python 3, 860 856 bayt

Liderlik tablosunu önyüklemek ve diğer golfçüler için bazı şablonlar sağlamak için hafifçe golf yapın:

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

Sekmelerle girintili. Sonuncusu print, Mathematica cevabıp ile bir skor bağı oluşturmak için kasıtlı olarak değiştirilmez .

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

Not: henüz bağlantıları doğru işlemez, bu nedenle örneğin soru 17005 için başarısız olur .


1
Bunu kendiniz cevap bile, sahip golf için bir cevap kodu golf sorusu.
NoOneIsHere

@NoOneIsHere, ben "hakkında emin değilim var etmek". Sadece "Eğer bir kod golf soru cevap ve kazanmak istiyorsanız ".
Vi.

3
@Vi. Daha sonra soruyu referans bir çözüm olarak ekleyin. Bu, kodlu golf için golf kodunu isteyen (kendi) sorunuzu cevaplamayan bir cevaptır .
NoOneIsHere

1
@Vi. Hayır. Ya tamamen golf oynamak ya da izin verilmiyor. Kolayca golf edilebilirse, bu bir cevap değildir. Bunu sadece soruya bir referans çözüm olarak koymak için söyleyebilirim.
Rɪᴋᴇʀ

4
@Vi. Hayır, en iyi şekilde golf .
NoOneIsHere

1

Bash + JQ, 399 bayt

jqİfade mantığını optimize ederek, bu neredeyse kesinlikle daha da golf edilebilir .

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

Örnek Çıktı

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

Hangi jq sürümü gereklidir? Anladımerror: capture is not defined
Vi.

Soru ID'sini 47338'e eklediğimde tekrarlanan sıralar görmüyorum. Gönderme geldikçe geçersiz hale gelebilir (ve daha sonra sadece sıralamaların doğru işlenmesini zorlamak için özel bir rakip olmayan sahte cevap ekleyebilirim).
Vi.

Martin Ender'in CJAM cevabı "CJam, <s> 28 </s> 27 bayt". Resmi skor tablosu snippet'inde olduğu gibi 28 değil 27 olarak yorumlanmalıdır. Veya Pyth'in 19'a karşı 22 bayt.
Vi.

"* Dillere bağlantılar, çarpıcı puanlar, vb. Ele alınmalıdır." meydan okuma kurallarında.
Vi.

@Vi - Şimdi ayarlanmış olmalı (bkz. Jqplay.org/s/LuZfAn2Pxr ). Pyth yanıtı hala 22 bayttır, çünkü doğru şekilde biçimlendirilmemiştir (son bayt sayısı önce gelir).
zeplin

1

Mathematica, 852785 bayt

Yerleşik JSONToolspaketi kullanır . Bu Mathematica'nın kullanılması gereken bir şey değil ... ben de kullandım!

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

Nasıl test ederim? Anladım 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., bundan sonra baskılar {$Failed, $Failed, $Failed, $Failed, $Failed, bytes, $Failed, $Failed}}.
Vi.

Belki de çözüm kendi kaynak koduyla (açıkçası içerir <h1>) kırılmıştır ?
Vi.

@Vi. Bu garip, benim için çalışıyor. Hangi soru üzerinde test ettiniz? StackExchange API <ve> otomatik olarak HTML kaçar kullanır çünkü onu kırma kaynak kodu olduğunu sanmıyorum.
numbermaniac

Bu 111735. Ancak URL'yi /tmp/q.jsonönceden indirilmiş bir JSON yanıtı olan yerle değiştirdim .
Vi.

47338 için çıktı: paste.debian.net/918716
Vi.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.