var QUESTION_ID=89919,OVERRIDE_USER=30525;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Odpowiedzi:
bash + w3m + grep + cut,
65595854 bajtówźródło
cut -d '"'
abycut -d\"
zapisać dwa bajty. Jeśli użyjeszw3m
zamiastcurl -s
możesz zaoszczędzić 4 więcej.C (+ gniazda),
433429280276270259 bajtówOkazuje się, że C nie jest świetny w pobieraniu zasobów z Internetu i analizowaniu ich jako JSON. Kto wiedział?
Ten kod jest (oczywiście) bardzo luźny ze sprawdzaniem błędów, więc sądzę, że gdyby medalbot.com chciał wysłać szkodliwe dane, byłyby w stanie wywołać przepełnienie bufora itp. Również najnowszy kod oczekuje pewnych wartości stałych (np.
AF_INET = 2
), Które będzie prawdopodobnie być tak wszędzie, ale nie jest gwarantowana.Oto oryginalny kod, który nie jest tak delikatny (ale nadal nie jest zbyt solidny ani bezpieczny):
Awaria:
Nie jest to zbyt miłe dla serwera, ponieważ nie wysyłamy go
Connection: close\r\n
w ramach żądania HTTP. Pomija równieżAccept
nagłówek, ponieważ medalbot.com w żadnym wypadku nie używa kompresji i po tym brakuje miejscaHost:
(ponownie, serwer wydaje się być w porządku z tym). Nie wydaje się jednak, aby cokolwiek innego można było usunąć.Po zakończeniu olimpiady najbardziej prawdopodobnym zachowaniem tego programu jest segfault próbujący odczytać lokalizację pamięci 9. O ile zły haker nie przejmie domeny, w takim przypadku najbardziej prawdopodobnym zachowaniem jest ustawienie bajtu na 0 w adresie struktury informacji, które prawdopodobnie nie są zbyt niebezpieczne. Ale kto może powiedzieć z tymi złymi hakerami?
źródło
PowerShell v4 +,
8869 bajtówUżywa
iwr
(alias dlaInvoke-WebRequest
) do pobrania interfejsu API. Podajemy to jako parametr wejściowy doConvertFrom-Json
wbudowanej, która ściąga tekst JSON do niestandardowej tablicy obiektów. Otaczamy tablicę obiektów w pareny, bierzemy pierwsze trzy elementy[0..2]
i bierzemy.country_name
każdy z nich.Wymaga co najmniej v4 + dla właściwości wielu obiektów, w przeciwnym razie musielibyśmy użyć czegoś takiego jak
|Select "country_name"
. Wymaga co najmniej v3 + dlaConvertFrom-Json
wbudowanego.źródło
http://www.
a PS nie ma nic przeciwkohttp://
ani o stroniewww.
. Moje PS (5.1.14393) też nie wydaje się nawet obchodzić.content
.ConvertFrom-Json
nie potrzebowałem wyraźnie tylko.content
części żądania internetowego, ale działa to również w mojej konfiguracji.R,
98, 112, 108 bajtówgrał w golfa 4 dzięki @miff
Pierwszy wiersz importuje dane przy użyciu biblioteki JSON. Druga linia pobiera nazwy odpowiednich krajów. Sortuje kraje według złotych medali w kolejności rosnącej, odwraca indeksy i bierze pierwsze 3, drukując je.
źródło
rev(order(a$g))
zorder(-a$g)
aby zapisać 4 bajtyJavaScript (ES6), 122 bajtów
Ze względu na problem z bezpieczeństwem przeglądarki należy uruchomić ten kod
medalbot.com
. Nie korzysta jednak z tego i może być potencjalnie uruchamiany w innym miejscu. Zauważ też, że wstawiłem\n
znak, ale liczę tylko jako jeden, ponieważ mógłbym go zastąpić jednymNode.js (ES6), 173 bajtów
Byłoby to o wiele krótsze, gdyby API zwróciło dane w jednym odcinku, ale ponieważ zwraca w dwóch sekcjach, muszę połączyć części i połączyć je, a następnie parsować.
Node.js (ES6) + żądanie, 138 bajtów
Lepsze, ale wciąż nie tak dobre, jak wersja przeglądarki. Dzięki, pobierz API! Żądanie jest popularną biblioteką klienta HTTP używaną w celu uproszczenia żądań. Można to zobaczyć tutaj.
źródło
bash + w3m + jq ,
8359 bajtówDzięki Jordanowi za trzy bajty.
Dziękujemy za 24 bajty więcej! Okazuje się, że dane są posortowane. Łał. :RE
źródło
.|
i zindeksować wyniksort_by
bezpośrednio, a możesz zapisać kolejny bajt, używając[:3][]
zamiast[0,1,2]
. Wszystko razem:sort_by(-.gold_count)[:3][].country_name
.w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'
Java 8,
261258 bajtówUżywa lambda, aby zaoszczędzić kilka bajtów, a biblioteka sieciowa, aby uzyskać stronę internetową. Poza tym to tylko Java.
Oto moje (stare) POJO do testowania (i gry w golfa):
Aktualizacja
java.net
importźródło
i
ale Java nie konwertuje wartości logicznej na int lub visa versa, jeśli tak myślałeś. Również denerwowałeś mnie tą ostatnią edycją.MATL , 67 bajtów
To nie działa online, ponieważ funkcja
Xi
(urlread
) jest niedozwolona.Przykładowy przebieg:
Wyjaśnienie
Odczytuje zawartość jako ciąg znaków, a następnie stosuje wyrażenie regularne w
'(?<="c.+e": ")[^"]+'
celu wyodrębnienia nazw krajów. Wyrażenie regularne używa wstecz"c.+e"
zamiast zamiast,"country_name"
aby zmniejszyć długość kodu.źródło
Python 3,
202, 164 bajtów.Python 3 nie obsługuje krótkich adresów URL / JSON. : /
Nie zdawałem sobie sprawy, że interfejs API jest już sortowany według liczby sztuk złota
źródło
Python 2,
120113 bajtówDzięki @Nick T i @Value Ink
źródło
from urllib import*
a użycieurlopen
później oszczędza 1 bajt. Ponadto powinieneś być w stanie wziąć instrukcję print i umieścić ją zaraz za dwukropkiem, ratując cię przed wcięciem.urlopen
obiektlist()
, czy robi to to samo, co.readlines()
?JavaScript + jQuery,
114100 bajtówZ powodu wniosków o pochodzenie krzyżowe należy go uruchomić z
medalbot.com
domeny (za pomocą jQuery).Historia
źródło
$.get("www.medalbot.com/api/v1/medals",a=>alert(a[0][c='country_name']+'\n'+a[1][c]+'\n'+a[2][c]))
Ruby,
9779 +-rnet/http
(11) = 90 bajtówWykorzystuje modyfikację wzoru wyrażenia regularnego z odpowiedzi MATL Luisa Mendo, further optimized by @Jordan, since Ruby doesn't support quantifiers in lookbehinds.
-18 bajtów od @Jordan.
źródło
.map(&:last)
w całości przez 12 bajtów, a pomijać wiodącym/
w/api
jednego więcej./"cou.+"(.+)"/
/y_.+"(.+)"/
./
causes errors on my Ruby version. Or it might be the network I'm on? Whatever. I went with a slightly different regex than the one you suggested but same length.PowerShell, 60
Same basic idea as TimmyD (didn't see their answer before I posted), but quite a bit shorter :-)
źródło
|% c*
parsing work? I mean, it does, I just tried it, but that's some weird syntax (it even highlights in my ISE as an error).ForEach-Object [-MemberName] <String>
. The-MemberName
parameter supports wildcards, so in this case it expands the only member matching that wildcard:country_name
. Saves quite a few characters, too ;-)Mathematica
9666 bytes@alephalpha found a way to work directly from the file (without saving it), thereby saving 30 bytes!
Import
imports the file as a Raw JSON file.[[;;3,2]]
takes rows 1-3, second entry (country name).źródło
Import["http://www.medalbot.com/api/v1/medals","RawJSON"][[;;3,2]]
PHP,
205 139 124 116 111109 bytesI just wanted to use the new spaceship operator for PHP 7 once (EDIT: It's superfluous, as sorting isn't required):
If we omit the unneccesary sorting step and assume the API delivers the data already sorted by gold_count descending (as it would seem), we can shorten this further:
Note: The line break within the string is intentional to save a byte from \n
History
źródło
error_reporting
's default value not displays notices, you can omit the double quotes. And the medalbot API seems to work without www. subdomain too. Then you not need the braces aroundecho
.for(;$i<3;)echo$d[+$i++][country_name]." "
reduces it with 5 bytes. Last space being an enter offcourse. Or just as a while loopwhile($i<3)
BASH + w3m + core utils, 70 bytes
Looks like the output comes sorted already. Just need to throw out all of the extra text.
źródło
CJam (57 bytes)
Online demo not available because it fetches content from the web. This cheats by not actually parsing JSON, but assuming that the structure won't change. (But then so do most of the existing answers, in different ways).
źródło
Python 2, 117 bytes
źródło
import
and*
, and by moving theprint
to directly after the colon on line2
. We generally use#
s instead of**
before and after for our headers.Clojure, 122 bytes
No JSON library used :). Reads string from the URL, replaces colons with empty string and evals the string which results into Clojure map. Takes first 3 elements and maps eagerly function which prints
country_name
property of each elements.źródło
Java 8
386384459 bytes2 bytes saved from @Easterly Irk
My first code golf submission so I'm sure there's a way to save plenty of bytes, but oh well :)
It uses Gson to read the JSON
Requires:
Golfed code:
Ungolfed Code:
źródło
import
s to compile?R,
9795 bytesLittle improvement over user5957401's answer, no sorting required, and shorter library name. Also my first attempt at golfing ;)
źródło
Kotlin (Script),
125121119 bytesRunnable with
kotlinc -script <filename>
or through IDEA as *.kts file.now, if we make a VERY big assumption about the format, including numbers of lines, we can trim it to:
or even
Thanks to folks at Kotlin slack team for helping me trim a couple dozens of bytes!
źródło
Javascript 167 bytes
źródło