Szybki golf: Złoty lider

18

Wyzwanie

Wykorzystując dane z API tutaj , wyjście nazwy trzech krajów z największą ilością złote medale olimpijskie w Rio 2016 Olympic Games (czyli pierwszym elementem zwracanej listy).

Na przykład w momencie wysyłania (18:23 UTC + 1, poniedziałek, 15 sierpnia) USA, Wielka Brytania i Chiny mają najwięcej złotych medali, więc wynik będzie:

United States
Great Britain
China

Nazwy krajów muszą być oddzielone znakami nowej linii, ponieważ możesz mieć wiodące lub końcowe znaki nowej linii.

Po zakończeniu Igrzysk Olimpijskich program nie musi działać zgodnie z oczekiwaniami.

Skracacze URL są niedozwolone, ale biblioteki parsujące JSON są dozwolone.

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.

Zamierzam nadal podejmować wyzwanie związane z Olimpiadą

Tabela liderów

Rozpad beta
źródło
6
Czy powiedziałbyś, że to ... mini-golf ?
Deusovi,
1
@ Katastrofa Deusovi Ba-dum
Beta Decay
2
Naprawdę chcę, aby ktoś opublikował rozwiązanie Java, dzięki czemu mogę zobaczyć, czy moje rozwiązanie C go pokonuje…
Dave
3
„Wielka Brytania… więc wyjście… Wielka Brytania”
trichoplax
1
@Dave NI Sportowcy mogą reprezentować drużynę GB lub drużynę Irlandii. Gdyby zawodnicy NI byli zobowiązani do dołączenia do zespołu GB, byłby to zespół brytyjski.
SGR,

Odpowiedzi:

12

bash + w3m + grep + cut, 65 59 58 54 bajtów

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • 6 bajtów mniej dzięki sugestiom @ Joe.
  • 1 bajt mniej dzięki @YOU.
  • 4 bajty mniej dzięki @manatwork sugestią, jakoby API medalbot wydaje się działać bez www. subdomena też .
Master_ex
źródło
2
Zmień, cut -d '"'aby cut -d\"zapisać dwa bajty. Jeśli użyjesz w3mzamiast curl -smożesz zaoszczędzić 4 więcej.
Joe
możesz zmienić _n na m
TY
@YOU: Nie bardzo, bo w ten sposób zwróci więcej wierszy niż oczekiwano, tj. „Id”: „niemcy”, id „:„ kolumbia ”itd.
Master_ex,
jeśli nie mogą być od 1 do 3, będzie dobrze, masz -m3 strażnika.
TY
1
@YOU: Wydaje mi się, że jest to prawdą w przypadku obecnego wyniku i wydaje się, że będzie to OK podczas Igrzysk Olimpijskich 2016 (z wyjątkiem sytuacji, gdy zmienią one Stany Zjednoczone na Stany Zjednoczone Ameryki: P). Zmienię to.
Master_ex,
13

C (+ gniazda), 433 429 280 276 270 259 bajtów

#define H"medalbot.com"
char**p,B[999],*b=B;main(f){connect(f=socket(2,1,getaddrinfo("www."H,"80",0,&p)),p[4],16);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);read(f,b,998);for(f=3;f--;puts(p))b=strchr(p=strstr(++b,"_n")+9,34),*b=0;}

Okazuje 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):

#include<netdb.h>
#define H"medalbot.com"
char*b,*B,d[999];struct addrinfo*p,h;main(f){h.ai_socktype=SOCK_STREAM;getaddrinfo("www."H,"80",&h,&p);f=socket(p->ai_family,p->ai_socktype,p->ai_protocol);connect(f,p->ai_addr,p->ai_addrlen);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost: "H":80\r\nConnection: close\r\n\r\n",92,0);recv(f,d,998,0);for(f=0,b=d;f<3;++f)B=strstr(b,"_n")+9,b=strchr(B,'}'),*strchr(B,'"')=0,puts(B);}

Awaria:

                            // No imports needed whatsoever!
#define H"medalbot.com"     // Re-use the host in multiple places
char**p,                    // This is actually a "struct addrinfo*"
    B[999],                 // The download buffer (global to init with 0)
    *b=B;                   // A mutable pointer to the buffer

main(f){
    // Hope for the best: try the first suggested address with no fallback:
    // (medalbot.com runs on Heroku which has dynamic IPs, so we must look up the
    // IP each time using getaddrinfo)
    f=socket(2,1,getaddrinfo("www."H,"80",0,&p));
                            // 2 = AF_INET
                            // 1 = SOCK_STREAM
                            //     (may not match getaddrinfo, but works anyway)
                            // 0 = IP protocol (getaddrinfo returns 0 on success)
    connect(f,p[4],16);     // struct addrinfo contains a "struct sockaddr" pointer
                            // which is aligned at 32 bytes (4*8)

    // Send the HTTP request (not quite standard, but works. 69 bytes long)
    send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);
    // (omit flags arg in send and hope 0 will be assumed)

    read(f,b,998);          // Get first 998 bytes of response; same as recv(...,0)

    // Loop through the top 3 & print country names:
    // (p is re-used as a char* now)
    for(f=3;f--;puts(p))        // Loop and print:
        p=strstr(++b,"_n")+9,   //  Find "country_name": "
        b=strchr(p,34),         //  Jump to closing "
        *b=0;                   //  Set the closing " to \0
}

Nie jest to zbyt miłe dla serwera, ponieważ nie wysyłamy go Connection: close\r\nw ramach żądania HTTP. Pomija również Acceptnagłówek, ponieważ medalbot.com w żadnym wypadku nie używa kompresji i po tym brakuje miejsca Host:(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?

Dave
źródło
1
Tak, to szkodnik dla tych hakerów. Dobrze, że jesteśmy na stronie internetowej, na której hakerzy wszelkiego rodzaju raczej się nie pojawią ...
przestali obracać się przeciwnie do zegara
1
To był duży skok!
NielinioweOwoce
2
@NonlinearFruit tak, to niesamowite, ile znaków można uratować, rzucając ostrożność na wiatr i używając liczb zdefiniowanych w implementacji bezpośrednio w kodzie! To stało się ćwiczeniem do „jaki jest najbardziej szalony, najniebezpieczniejszy, który może złamać - ale obecnie funkcjonalny - sposób pobierania tekstu w C?”
Dave
Miejmy tylko nadzieję, że w małych stolikach Bobby'ego nie ma żadnych krewnych konkurujących w tym roku.
GuitarPicker,
Czytelność jest również jedną z pierwszych ofiar dorsza. . .
NielinioweOwoce
12

PowerShell v4 +, 88 69 bajtów

(ConvertFrom-Json(iwr medalbot.com/api/v1/medals))[0..2].country_name

Używa iwr(alias dla Invoke-WebRequest) do pobrania interfejsu API. Podajemy to jako parametr wejściowy do ConvertFrom-Jsonwbudowanej, 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_namekaż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 + dla ConvertFrom-Jsonwbudowanego.

PS C:\Tools\Scripts\golfing> .\olympics-gold-leader.ps1
United States
Great Britain
China
AdmBorkBork
źródło
Możesz upuścić, http://www.a PS nie ma nic przeciwko http://ani o stronie www.. Moje PS (5.1.14393) też nie wydaje się nawet obchodzić .content.
Nick T
@NickT Dzięki za golfa. Nie zdawałem sobie sprawy, że ConvertFrom-Jsonnie potrzebowałem wyraźnie tylko .contentczęści żądania internetowego, ale działa to również w mojej konfiguracji.
AdmBorkBork
6

R, 98, 112 , 108 bajtów

grał w golfa 4 dzięki @miff

a=jsonlite::fromJSON(readLines("http://www.medalbot.com/api/v1/medals"))
cat(a$c[order(-a$g)[1:3]],sep="\n")

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.

użytkownik5957401
źródło
1
Myślę, że można zastąpić rev(order(a$g))z order(-a$g)aby zapisać 4 bajty
MIFF
5

JavaScript (ES6), 122 bajtów

fetch`http://www.medalbot.com/api/v1/medals`.then(a=>a.json()).then(b=>alert(b.slice(0,3).map(c=>c.country_name).join`\n`))

Ze względu na problem z bezpieczeństwem przeglądarki należy uruchomić ten kodmedalbot.com . Nie korzysta jednak z tego i może być potencjalnie uruchamiany w innym miejscu. Zauważ też, że wstawiłem \nznak, ale liczę tylko jako jeden, ponieważ mógłbym go zastąpić jednym

Node.js (ES6), 173 bajtów

require("http").get("http://www.medalbot.com/api/v1/medals",s=>s.on("data",d=>t+=d,t="").on("end",q=>console.log(JSON.parse(t).slice(0,3).map(a=>a.country_name).join`\n`)))

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

require("request")("http://www.medalbot.com/api/v1/medals",(e,r,b)=>console.log(JSON.parse(b).slice(0,3).map(a=>a.country_name).join`\n`))

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.

MayorMonty
źródło
Który z nich działa w dowolnej przeglądarce? Czy możesz umieścić najkrótszą z tych na górze swojej odpowiedzi (dla tabeli liderów)
Rozpad Beta
Pierwsza z nich działa w większości nowoczesnych przeglądarek i jest również najkrótsza. Pozostałe dwa są w Node.js sposobem pisania JavaScript na serwerze (plus inne rzeczy).
MayorMonty,
@ βετѧΛєҫαγ Pamiętaj, że nie działa w żadnej wersji IE ani Safari
MayorMonty
Rozumiem, że miałem problem z CORS
beta
4

bash + w3m + jq ,83 59 bajtów

w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'

Dzięki Jordanowi za trzy bajty.

Dziękujemy za 24 bajty więcej! Okazuje się, że dane są posortowane. Łał. :RE

Lynn
źródło
1
Możesz pominąć .|i zindeksować wynik sort_bybezpośrednio, a możesz zapisać kolejny bajt, używając [:3][]zamiast [0,1,2]. Wszystko razem: sort_by(-.gold_count)[:3][].country_name.
Jordania
w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'
TY
4

Java 8, 261 258 bajtów

Używa lambda, aby zaoszczędzić kilka bajtów, a biblioteka sieciowa, aby uzyskać stronę internetową. Poza tym to tylko Java.

()->{try{for(int i=0;i<3;System.out.println(new java.util.Scanner(new java.net.URL("http://www.medalbot.com/api/v1/medals").openConnection().getInputStream()).useDelimiter("\\A").next().split("\n")[i++*9+3].replaceAll(".* \"|\",","")));}catch(Exception e){}}

Oto moje (stare) POJO do testowania (i gry w golfa):

class QuickGolf {
  static void f(h x){x.g();}
  static interface h{ void g(); }
  static void main(String[] args){
    f(
      ()->{try{for(int i=0;i<3;i++){System.out.println(new java.util.Scanner(new java.net.URL("http://www.medalbot.com/api/v1/medals").openConnection().getInputStream()).useDelimiter("\\A").next().split("\n")[i*9+3].substring(21).replace("\",",""));}}catch(Exception e){}}
    );
  }
}

Aktualizacja

  • -3 [16-08-17] Przenieś instrukcję print do pętli for
  • -5 [16-08-16] Poprawiona wymiana wyrażeń regularnych
  • -9 [16-08-16] Usunięto java.netimport
Nieliniowe Owoce
źródło
Eep. Muszę zaoszczędzić trochę bajtów…
Dave
Nadrabiam zaległości! Teraz tylko 15 bajtów za!
Dave
Cóż, byłem przed sobą przynajmniej przez kilka godzin. To działa przeciwko mnie, ale prawdopodobnie można zaoszczędzić trochę więcej bajtów poprzez pętlę liczyć dół z 3 zamiast w górę.
Dave
@Dave Próbowałem mieć warunek przerwania wartości logicznej, iale 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ą.
NielinioweOwoce
3

MATL , 67 bajtów

'http://www.medalbot.com/api/v1/medals'Xi'(?<="c.+e": ")[^"]+'XX3:)

To nie działa online, ponieważ funkcja Xi(urlread ) jest niedozwolona.

Przykładowy przebieg:

>> matl
 > 'http://www.medalbot.com/api/v1/medals'Xi'(?<="c.+e": ")[^"]+'XX3:)
 > 
United States
Great Britain
China

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.

'http://www.medalbot.com/api/v1/medals'   % Push string representing the URL
Xi                                        % Read URL contents as a string
'(?<="c.+e": ")[^"]+'                     % String for regex matching
XX                                        % Apply regex
3:)                                       % Get first 3 results
Luis Mendo
źródło
3

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

from urllib.request import*
import json
print('\n'.join(x['country_name']for x in json.loads(urlopen('http://www.medalbot.com/api/v1/medals').read().decode())[:3]))
Morgan Thrapp
źródło
3

Python 2, 120 113 bajtów

from urllib import*
for x in list(urlopen("http://www.medalbot.com/api/v1/medals"))[3:26:9]:
    print x[21:-4]

Dzięki @Nick T i @Value Ink

Joe
źródło
1
from urllib import*a użycie urlopenpóź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.
Wartość tuszu
1
Jeśli karmisz urlopenobiekt list(), czy robi to to samo, co .readlines()?
Nick T
3

JavaScript + jQuery, 114 100 bajtów

$.get("www.medalbot.com/api/v1/medals",a=>alert(a[0][c='country_name']+'\n'+a[1][c]+'\n'+a[2][c]))

Z powodu wniosków o pochodzenie krzyżowe należy go uruchomić z medalbot.com domeny (za pomocą jQuery).

Historia

  • -14 bajtów dzięki @YetiCGN
  • -2 bajty dzięki Yay295
Nikogo tu nie ma
źródło
Lub uruchom Chrome bez zabezpieczeń internetowych {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5
1
zapisz 2 bajty$.get("www.medalbot.com/api/v1/medals",a=>alert(a[0][c='country_name']+'\n'+a[1][c]+'\n'+a[2][c]))
Yay295
2

Ruby, 97 79 + -rnet/http(11) = 90 bajtów

Wykorzystuje 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.

puts Net::HTTP.get("www.medalbot.com","/api/v1/medals").scan(/"c.+"(.+)"/)[0,3]
Wartość tuszu
źródło
Można pominąć .map(&:last)w całości przez 12 bajtów, a pomijać wiodącym /w /apijednego więcej.
Jordan
Also, a shorter regex that seems to work fine: /"cou.+"(.+)"/
Jordan
Or: /y_.+"(.+)"/.
Jordan
@Jordan omitting the leading / 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.
Value Ink
Interesting. FWIW I'm using 2.3.1.
Jordan
2

PowerShell, 60

(iwr medalbot.com/api/v1/medals|convertfrom-json)[0..2]|% c*

Same basic idea as TimmyD (didn't see their answer before I posted), but quite a bit shorter :-)

Joey
źródło
1
How the devil does that |% 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).
AdmBorkBork
1
@TimmyD: ForEach-Object has a parameter set that expands a single property, or calls a method with arguments: 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 ;-)
Joey
2

Mathematica 96 66 bytes

@alephalpha found a way to work directly from the file (without saving it), thereby saving 30 bytes!

Import["http://www.medalbot.com/api/v1/medals","RawJSON"][[;;3,2]]

Import imports the file as a Raw JSON file. [[;;3,2]]takes rows 1-3, second entry (country name).

DavidC
źródło
Import["http://www.medalbot.com/api/v1/medals","RawJSON"][[;;3,2]]
alephalpha
2

PHP, 205 139 124 116 111 109 bytes

I just wanted to use the new spaceship operator for PHP 7 once (EDIT: It's superfluous, as sorting isn't required):

<?$d=json_decode(file_get_contents('http://www.medalbot.com/api/v1/medals'),1);usort($d,function($a,$b){$g='gold_count';return$b[$g]<=>$a[$g];});$c='country_name';foreach([0,1,2]as$i){echo$d[$i][$c]."\n";}

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:

while($i<3)echo json_decode(file_get_contents('http://medalbot.com/api/v1/medals'))[+$i++]->country_name."
";

Note: The line break within the string is intentional to save a byte from \n

History

  • Ommitted some quotes and braces that will throw notice's, removed the $c variable for country_name index. Thanks to @manatwork for these tipps to save even more characters.
  • Thanks to @jeroen for pointing out the shorter while loop, also switched to object access to go from 124 to 116
  • Saved 5 more bytes by calling the API within the loop. Granted, it takes longer and clobbers the API, but it's Code Golf. Needs PHP 5.5 to work because of array dereferencing.
  • Saved 2 more bytes by removing the short open tag, as per this meta answer
YetiCGN
źródło
Thanks! I just saw all the other entries sorting and thought I missed something.
YetiCGN
1
Why are you putting "country_name" in a variable? And anyway, as 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 around echo.
manatwork
Thanks a bunch! Well, it was late ... The $c variable is a leftover from a previous optimization that I threw away when I switched to the for loop. I guess clean coding (notice-free) is too deeply ingrained still so I don't even consider these optimizations you pointed out. So, thanks again!
YetiCGN
replacing the foreach with the following forloop: for(;$i<3;)echo$d[+$i++][country_name]." " reduces it with 5 bytes. Last space being an enter offcourse. Or just as a while loop while($i<3)
Jeroen
1

BASH + w3m + core utils, 70 bytes

w3m www.medalbot.com/api/v1/medals|grep -m3 tr|cut -f6- -d\ |tr -d \",

Looks like the output comes sorted already. Just need to throw out all of the extra text.

Joe
źródło
1

CJam (57 bytes)

"http://www.medalbot.com/api/v1/medals"gN/3>9%3<{'"/3=N}%

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

Peter Taylor
źródło
1

Python 2, 117 bytes

from requests import *
for x in get('http://www.medalbot.com/api/v1/medals').json()[:3]:
    print(x['country_name'])
sethascope
źródło
Welcome to PPCG! You can save a few bytes by removing the space between import and *, and by moving the print to directly after the colon on line 2. We generally use #s instead of ** before and after for our headers.
NoOneIsHere
1
We typically require submitters to include any third-party libraries required in the answer header. Since requests isn't a standard library module, this answer's language should be "Python 2 + requests".
Mego
1

Clojure, 122 bytes

(fn[](mapv #(println(%"country_name"))(take 3(read-string(.replace(slurp"http://www.medalbot.com/api/v1/medals")":""")))))

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.

cliffroot
źródło
1

Java 8 386 384 459 bytes

2 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:

import java.util.*;
import java.io.*;

Golfed code:

void p()throws Exception{List<A> a=new com.google.gson.Gson().fromJson(new InputStreamReader((InputStream)((new java.net.URL("http://www.medalbot.com/api/v1/medals").openConnection())).getContent()),new com.google.gson.reflect.TypeToken<List<A>>(){}.getType());a.sort((b,c)->c.gold_count.compareTo(b.gold_count));for(int i=0;i<3;)System.out.println(a.get(i++).country_name);}class A{String country_name;Integer gold_count;}

Ungolfed Code:

void p() throws Exception {
    List<A> a = new com.google.gson.Gson().fromJson(new InputStreamReader((InputStream)((new java.net.URL("http://www.medalbot.com/api/v1/medals").openConnection())).getContent()),new com.google.gson.reflect.TypeToken<List<A>>(){}.getType());
    a.sort((b, c) -> c.gold_count.compareTo(b.gold_count));
    for(int i=0; i<3;)
        System.out.println(a.get(i++).country_name);
}

class A {
    String country_name;
    Integer gold_count;
}
yitzih
źródło
Can you remove the space in "g = new Gson()"?
Rɪᴋᴇʀ
2
Wait, doesn't this need some imports to compile?
Dave
import statements need to be added to byte count?
yitzih
how do you calculate imports?
yitzih
Don't know what the exact rules are for Java, since I haven't posted any here before, but the usual rule is that you have to count everything which is needed to make the code valid (and from quickly looking up the Java hints page I can see various suggestions about how to minimise the import code, so I guess it must be counted). But then again, I'm also trying to get my C answer to win against Java in this question, so I'm pretty biased :D
Dave
1

R, 97 95 bytes

t=rjson::fromJSON(f="http://www.medalbot.com/api/v1/medals")
for(i in 1:3)cat(t[[c(i,2)]],"\n")

Little improvement over user5957401's answer, no sorting required, and shorter library name. Also my first attempt at golfing ;)

topol817
źródło
You can, as in every language, omit the "www." part of the domain and save 4 more bytes if your library follows the ensuing redirect.
YetiCGN
1

Kotlin (Script), 125 121 119 bytes

java.net.URL("http://medalbot.com/api/v1/medals").readText().lines().filter{'m' in it}.take(3).map{println(it.split('"')[3])}

Runnable 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:

java.net.URL("http://medalbot.com/api/v1/medals").readText().lines().slice(setOf(3,12,21)).map{println(it.split('"')[3])}

or even

java.net.URL("http://medalbot.com/api/v1/medals").readText().lines().slice(3..21 step 9).map{println(it.split('"')[3])}

Thanks to folks at Kotlin slack team for helping me trim a couple dozens of bytes!

CypherAJ
źródło
3 symbols shorter than Clojure and JS? I'll take that.
CypherAJ
0

Javascript 167 bytes

x=new XMLHttpRequest();x.open("GET","http://www.medalbot.com/api/v1/medals",false);x.send()
i=-3;while(i++)console.log(JSON.parse(x.responseText)[i+2]["country_name"])
Dylan Meeus
źródło