लीडरबोर्ड गोल्फ


11

इस सवाल का लीडरबोर्ड गोल्फ (आईडी = 111735)। आपके प्रोग्राम को StackExchange API के लिए एक HTTP या HTTPS अनुरोध जारी करना चाहिए , इसे पार्स करना चाहिए और एक विशिष्ट लीडरबोर्ड स्निपेट के समान उपयोगकर्ता के रूप में प्रस्तुत करना चाहिए।

नमूना आउटपुट ( इसके बजाय प्रश्न 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. प्रत्येक उत्तर के लिए, रैंक की अलग-अलग पंक्ति और ए ., फिर लेखक का नाम, फिर भाषा का नाम, फिर स्कोर; स्कोर के लिए आरोही क्रम में
  4. लाइन "विजेताओं द्वारा भाषा"
  5. लाइन "भाषा \ tUser \ tScore"
  6. प्रत्येक प्रयुक्त भाषा के लिए, टैब-अलग भाषा का नाम, निचले स्कोर के उत्तर का लेखक और स्कोर

दूसरे शब्दों में, कुछ इस तरह से होता है जैसे कि एक कॉपी और पेस्ट इस प्रश्न के लीडरबोर्ड के परिणाम को एक टेक्स्ट फाइल ("\ tLink" चीजों के बिना) के रूप में चिपका देता है। पायथन में संदर्भ कार्यान्वयन भी देखें ।

नियम

  • एक एपीआई अनुरोध के अलावा कोई नेटवर्क एक्सेस नहीं api.stackexchange.com
  • इस प्रश्न के प्रस्तुत होने के बाद दिखाई देने वाली एपीआई सुविधाओं या भाषाओं का कोई उपयोग नहीं।
  • उत्तर पोस्ट की पहली पंक्ति लीडरबोर्ड-संगत होनी चाहिए। यदि यह प्रश्न से जुड़ी लीडरबोर्ड स्क्रिप्ट को तोड़ता है तो उत्तर गैर-प्रतिस्पर्धात्मक है।
  • यदि नया जोड़ा गया उत्तर कुछ मौजूदा उत्तर को तोड़ता है तो पुराने उत्तर के लेखक को इसे ठीक करना चाहिए (या यह गैर-प्रतिस्पर्धी हो जाता है)।
  • भाषाओं के लिंक, स्ट्राइक आउट स्कोर आदि को संभाला जाना चाहिए।
  • स्निपेट में रैंक को संभालना चाहिए (जैसे कि बराबर स्कोर => समान रैंक => रैंक में अंतर)।

स्वीकृत उत्तर पर्याप्त मात्रा में निष्क्रियता (न्यूनतम 1 महीने) के बाद सबसे कम स्कोर के साथ उत्तर है।

अच्छा विचार

  • प्रश्न आईडी 47338 (डुप्लीकेट स्कोर हैंडलिंग + स्ट्राइक आउट स्कोर हैंडलिंग के लिए) और 17005 (लिंक हैंडलिंग के लिए) का परीक्षण करने के लिए। यह उत्तर को वैलिड से गुड तक देता है और बाद में प्रस्तुतियाँ से टूटने से बचाता है।
  • इसके लिए और ओवरराइड आईडी संस्करणों के लिए आउटपुट उदाहरणों को शामिल करना।

आवश्यक नहीं

  • 100 से अधिक उत्तरों की हैंडलिंग (एकल अनुरोध के लिए एपीआई की सीमा)
  • टिप्पणी की हैंडलिंग ओवरराइड होती है
  • "विजेताओं द्वारा भाषा" खंड को छाँटना
  • प्रतिस्पर्धा और टूटे हुए जवाबों का भेदभाव

लीडरबोर्ड


कुछ हद तक संबंधित और यह (लेकिन वे बहुत अलग चुनौतियां हैं)।
स्टीवी ग्रिफिन

जवाबों:


2

पर्ल + मोजोलियस, 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-> इसका मतलब यह है कि यह सिर्फ "पर्ल" नहीं है, बल्कि "पर्ल + मोजोलियस" है? गैर-शामिल-के-साथ-भाषा पुस्तकालयों का उपयोग एक मानक खामियों के रूप में नहीं करता है?
वि।

यदि मैं प्रश्न आईडी को 47338 पर पैच करता हूं, तो मुझे संबंधों की सही हैंडलिंग नहीं दिखती है। इसके बजाय साने रैंक प्रविष्टियाँ गायब हो जाती हैं।
वि।

सुधार: समान स्कोर वाली प्रविष्टियाँ अलग-अलग रैंक प्राप्त करती हैं। हालाँकि यह इस उत्तर को अमान्य (अभी तक) प्रस्तुत नहीं करता है, लेकिन यह अच्छा नहीं है।
वि।

@Vi। निश्चित संबंध।
डेनिस इबाव

1
काम करता है। संभवतः सबसे गंभीर शेष मुद्दा (और माना जाता है कि डाउनवोट का स्रोत) सबमिशन नाम है। शायद शुद्ध पर्ल समाधान के साथ प्रतिस्पर्धा से बचने के लिए इसे "पर्ल + मोजोलियस" में बदल दें? Mojolicious अधिकांश पर्ल तैनाती में स्थापित नहीं किया गया है, इसलिए oneliner-उन्मुख (गोल्फ के लिए उपयोगी) पुस्तकालय प्रतीत होता है, इसलिए इसे भाषा का हिस्सा नहीं माना जा सकता है।
वि।

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

टैब के साथ प्रस्तुत किया गया। अंतिम printको गणितीय रूपp से गणित के उत्तर के साथ स्कोर टाई बनाने के लिए नहीं बदला गया है ।

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

@NoOneIsHere, मुझे यकीन नहीं है "के बारे में है"। केवल अगर "यदि आप एक कोड-गोल्फ प्रश्न पर काम करते हैं और जीतना चाहते हैं "।
वि।

3
@Vi। फिर इसे संदर्भ समाधान के रूप में प्रश्न में शामिल करें। यह एक उत्तर है, जो (अपने खुद के) सवाल का जवाब नहीं देता है, जो प्रति कोड-गोल्फ प्रति गोल्फर कोड के लिए पूछता है ।
NoOneIsHere

1
@Vi। नहीं। या तो यह पूरी तरह से गोल्फ है या इसकी अनुमति नहीं है। यदि यह आसानी से गोल्फ हो सकता है, तो इसका जवाब नहीं है। मैं वास्तव में इसे संदर्भ समाधान के रूप में प्रश्न में रखना चाहूंगा।
R

4
@Vi। नहीं, इसे अपने विस्तार के लिए सबसे अच्छा करें
NoOneIsHere

1

बैश + JQ, 399 बाइट्स

ध्यान दें, यह लगभग निश्चित रूप से jqअभिव्यक्ति तर्क को अनुकूलित करके, आगे बढ़ाया जा सकता है।

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

नमूना आउटपुट

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।

जब मैं प्रश्न संख्या 47338 को पैच करता हूं तो मुझे बार-बार रैंक नहीं दिखाई देता है। प्रस्तुत करने के रूप में वे अमान्य हो सकते हैं (और मैं बाद में एक विशेष गैर-प्रतिस्पर्धात्मक छद्म उत्तर जोड़ सकता हूं ताकि रैंकों की सही हैंडलिंग के लिए मजबूर किया जा सके)।
वि।

मार्टिन एंडर के CJAM उत्तर में "CJam, <s> 28 </ s> 27 बाइट्स" हैं। आधिकारिक लीडरबोर्ड स्निपेट की तरह इसकी व्याख्या 27 के रूप में की जानी चाहिए, न कि 28 की। या पायथ के 19 बनाम 22 बाइट्स।
वि।

बिंदु पर ध्यान दें "* भाषाओं के लिंक, स्ट्राइक आउट स्कोर आदि को संभाला जाना चाहिए।" चुनौती के नियमों में।
वि।

@Vi - अब सब सेट होना चाहिए (देखें jqplay.org/s/LuZfAn2Pxr )। Pyth का उत्तर अभी भी 22 बाइट्स है, क्योंकि यह केवल सही ढंग से स्वरूपित नहीं है (अंतिम बाइट गिनती पहले आती है)।
टसेपेल्लिन

1

गणितज्ञ, 852 856 बाइट्स

अंतर्निहित JSONToolsपैकेज का उपयोग करता है । यह उस तरह की चीज नहीं है जिस तरह से मैथमेटिका का इस्तेमाल किया जाना है ... इसलिए मैंने इसका इस्तेमाल किया है!

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 <और> के लिए स्वचालित रूप से बच निकलता है।
नंबरमैनी

यह एक, १११35३५। लेकिन मैंने उस URL को प्रतिस्थापित कर दिया है /tmp/q.jsonजहाँ पहले से डाउनलोड किया गया JSON उत्तर है।
वि।

47338 के लिए आउटपुट: paste.debian.net/918716
Vi।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.