Quick Golf: le leader d'or

18

Défi

En utilisant les données de l'API ici , sortez les noms des trois pays avec le plus de médailles d'or olympiques aux Jeux Olympiques de Rio 2016 (c'est-à-dire le premier élément de la liste retournée).

Par exemple, au moment de la publication (18:23 UTC + 1, lundi 15 août), les États-Unis, le Royaume-Uni et la Chine ont le plus de médailles d'or, donc le résultat serait:

United States
Great Britain
China

Les noms de pays doivent être séparés par des retours à la ligne et vous pouvez avoir un retour à la ligne de début ou de fin.

Une fois les Jeux Olympiques terminés, le programme ne doit pas fonctionner comme prévu.

Les raccourcisseurs d'URL sont interdits mais les bibliothèques d'analyse JSON sont autorisées.

Il s'agit du code golf, donc le code le plus court en octets l'emporte.

Je vais continuer d'essayer d'obtenir un défi sur le thème des Jeux olympiques ici

Classement

Beta Decay
la source
6
Diriez-vous que c'est un ... mini-golf ?
Deusovi
1
@Deusovi Ba-dum crash
Beta Decay
2
Je veux vraiment que quelqu'un poste une solution Java pour que je puisse voir si ma solution C la bat…
Dave
3
"Le Royaume-Uni ... donc la sortie ... la Grande-Bretagne"
trichoplax
1
@Dave NI Les athlètes peuvent choisir de représenter l'équipe GB ou l'équipe Irlande. Si les athlètes NI devaient rejoindre l'équipe GB, ce serait l'équipe britannique.
SGR

Réponses:

12

bash + w3m + grep + cut, 65 59 58 54 octets

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • 6 octets de moins grâce aux suggestions de @ Joe.
  • 1 octet de moins grâce à @YOU.
  • 4 octets de moins grâce à la suggestion de @manatwork selon laquelle l'API medalbot semble fonctionner sans www. sous-domaine aussi .
Master_ex
la source
2
Passez cut -d '"'à cut -d\"pour enregistrer deux octets. Si vous utilisez w3mau lieu de, curl -svous pouvez économiser 4 de plus.
Joe
vous pouvez changer _n en m
VOUS
@YOU: Pas vraiment parce que de cette façon, il retournera plus de lignes que prévu, c'est-à-dire "id": "allemagne", id ":" colombie "etc.
Master_ex
S'ils ne peuvent pas être de 1 à 3, ce sera parfait, vous avez un garde -m3.
VOUS
1
@YOU: Je suppose que cela est vrai pour le score actuel et il semble que ce sera OK pour les Jeux olympiques de 2016 (sauf s'ils changent des États-Unis en États-Unis d'Amérique: P). Je vais le changer.
Master_ex
13

C (+ prises), 433 429 280 276 270 259 octets

#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;}

Il s'avère donc que C n'est pas génial pour télécharger des ressources à partir d'Internet et les analyser en JSON. Qui savait?

Ce code est (naturellement) super laxiste avec vérification des erreurs, donc je suppose que si medalbot.com voulait envoyer des données malveillantes, il serait capable de déclencher des dépassements de tampon, etc. De plus, le dernier code attend certaines valeurs pour les constantes (par exemple AF_INET = 2) qui sera probablement le cas partout, mais ce n'est pas garanti.

Voici le code original qui n'est pas si fragile (mais qui n'est toujours pas très robuste ou sûr):

#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);}

Panne:

                            // 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
}

Ce n'est pas très agréable pour le serveur car nous n'envoyons pas Connection: close\r\ndans le cadre de la requête HTTP. Il omet également l'en- Accepttête, car medalbot.com ne semble en aucun cas utiliser la compression et manque l'espace après Host:(encore une fois, le serveur semble être d'accord avec cela). Il ne semble pas que quelque chose d'autre puisse être supprimé.


Une fois les Jeux Olympiques terminés, le comportement le plus probable de ce programme consiste à segfault en essayant de lire l'emplacement de la mémoire 9. À moins qu'un pirate malveillant ne prenne le contrôle du domaine, auquel cas le comportement le plus probable consiste à définir un octet à 0 dans l'adresse structs info, ce qui n'est probablement pas trop dangereux en fait. Mais qui peut dire avec ces pirates maléfiques?

Dave
la source
1
Ouais, c'est un ravageur avec ces hackers. Heureusement que nous sommes sur un site Web sur lequel il est peu probable que des pirates informatiques de toute sorte se présentent ...
cessé de tourner dans
1
C'était tout un saut!
NonlinearFruit
2
@NonlinearFruit oui, il est étonnant de voir combien de caractères peuvent être enregistrés lorsque vous jetez des précautions et utilisez des nombres définis par l'implémentation directement dans le code! Ceci est devenu un exercice sur "quelle est la manière la plus folle, la plus dangereuse, la plus susceptible de casser - mais actuellement fonctionnelle - pour télécharger du texte en C?"
Dave
Espérons juste que la petite Bobby Tables n'a pas de parents en compétition cette année.
GuitarPicker
La lisibilité est également l'une des premières victimes du golf de la morue. . .
NonlinearFruit
12

PowerShell v4 +, 88 69 octets

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

Utilise iwr(l'alias de Invoke-WebRequest) pour récupérer l'API. Nous alimentons cela en tant que paramètre d'entrée dans la fonction ConvertFrom-Jsonintégrée qui extrait le texte JSON dans un tableau d'objets personnalisé. Nous encapsulons ce tableau d'objets en parens, prenons les trois premiers éléments [0..2]et prenons .country_namechacun de ceux-ci.

Nécessite au moins v4 + pour les propriétés multi-objets, sinon nous aurions besoin d'utiliser quelque chose comme à la |Select "country_name"place. Nécessite au moins v3 + pour le ConvertFrom-Jsonintégré.

PS C:\Tools\Scripts\golfing> .\olympics-gold-leader.ps1
United States
Great Britain
China
AdmBorkBork
la source
Vous pouvez laisser tomber http://www.et PS ne s'en soucie pas http://ou du site www.. Mon PS (5.1.14393) ne semble même pas se soucier du .content.
Nick T
@NickT Merci pour les golfs. Je ne savais pas que cela ConvertFrom-Jsonn'avait explicitement besoin que de la .contentpartie de la demande Web, mais cela fonctionne également sur ma configuration.
AdmBorkBork
6

R, 98, 112 , 108 octets

golfé 4 grâce à @miff

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

La première ligne importe des données à l'aide d'une bibliothèque JSON. La deuxième ligne saisit les noms de pays pertinents. Il trie les pays par médailles d'or dans l'ordre croissant, inverse les indices et prend les 3 premiers, les imprimant.

user5957401
la source
1
Je pense que vous pouvez remplacer rev(order(a$g))avec order(-a$g)pour sauver 4 octets
Miff
5

JavaScript (ES6), 122 octets

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

En raison d'un problème de sécurité du navigateur , ce code doit être exécuté medalbot.com. Il n'en tire cependant pas parti et pourrait éventuellement être exploité ailleurs. Notez également que j'ai inséré le \ncaractère, mais je ne compte que comme un, car je pourrais le remplacer par un

Node.js (ES6), 173 octets

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

Cela aurait été beaucoup plus court si l'API renvoyait les données en une seule fois, mais comme elle revient en deux sections, je dois concaténer les parties et les combiner, puis les analyser.

Node.js (ES6) + demande, 138 octets

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

Mieux, mais toujours pas aussi bon que la version du navigateur. Merci d'aller chercher l'API! Request est une bibliothèque client HTTP populaire utilisée pour simplifier les requêtes, et vous pouvez voir qu'elle prend effet ici.

MayorMonty
la source
Laquelle de ces fonctionnalités fonctionne dans n'importe quel navigateur? Pouvez-vous mettre le plus court de ceux en haut de votre réponse (pour le classement)
Beta Decay
Le premier de ces travaux dans la plupart des navigateurs modernes, et est également le plus court. Les deux autres sont dans Node.js un moyen d'écrire du JavaScript sur le serveur (ainsi que d'autres choses).
MayorMonty
@ βετѧΛєҫαγ Prenez note que cela ne fonctionne dans aucune version d'IE ou de Safari
MayorMonty
Je vois, je me suis accroché au problème CORS
Beta Decay
4

bash + w3m + jq ,83 59 octets

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

Merci à Jordan pour trois octets.

Merci à VOUS pour 24 octets de plus! Il s'avère que les données sont triées. Sensationnel. :RÉ

Lynn
la source
1
Vous pouvez omettre .|et indexer le résultat de sort_bydirectement, et vous pouvez enregistrer un autre octet en utilisant à la [:3][]place de [0,1,2]. Tous ensemble:sort_by(-.gold_count)[:3][].country_name .
Jordan
w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'
VOUS
4

Java 8, 261 258 octets

Cela utilise un lambda pour enregistrer quelques octets et la bibliothèque net pour obtenir la page Web. À part ça, c'est juste 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){}}

Voici mon (ancien) POJO pour les tests (et le golf):

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){}}
    );
  }
}

Mise à jour

  • -3 [16-08-17] Déplacer la déclaration d'impression dans la boucle for
  • -5 [16-08-16] Remplacement amélioré des regex
  • -9 [16-08-16] java.netImportation supprimée
NonlinearFruit
la source
Eep. J'ai besoin de sauvegarder quelques octets…
Dave
Je rattrape! Maintenant seulement 15 octets derrière!
Dave
Eh bien, j'étais en avance pendant quelques heures au moins. Cela fonctionne contre moi, mais vous pouvez probablement économiser quelques octets supplémentaires en ayant le compte à rebours de la boucle de 3 au lieu de up.
Dave
@Dave J'ai essayé d'avoir la condition de rupture booléenne juste imais Java ne convertit pas booléen en int ou vice versa, si c'était ce que vous pensiez. Vous m'aviez aussi assez nerveux avec ce dernier montage.
NonlinearFruit
3

MATL , 67 octets

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

Cela ne fonctionne pas en ligne car la fonction Xi ( urlread) n'est pas autorisée.

Exemple d'exécution:

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

Explication

Cela lit le contenu sous forme de chaîne, puis applique l'expression régulière '(?<="c.+e": ")[^"]+'pour extraire les noms de pays. Le regex utilise le look-behind avec "c.+e"au lieu de "country_name"pour réduire la longueur du code.

'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
la source
3

Python 3, 202 , 164 octets.

Python 3 ne fait pas de gestion d'url / json courte. : /
Je ne savais pas que l'API triait déjà par nombre d'or

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
la source
3

Python 2, 120 113 octets

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

Merci @Nick T et @Value Ink

Joe
la source
1
from urllib import*et l'utilisation juste urlopenplus tard permet d'économiser 1 octet. En outre, vous devriez être en mesure de prendre l'instruction print et de la placer juste après les deux points, ce qui vous évite le retrait.
Value Ink
1
Si vous alimentez l' urlopenobjet list(), cela fait-il la même chose que .readlines()?
Nick T
3

JavaScript + jQuery, 114100 octets

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

Pour les demandes d'origine croisée, celle-ci doit être exécutée à partir du medalbot.com domaine (avec jQuery).

Histoire

  • -14 octets grâce à @YetiCGN
  • -2 octets grâce à Yay295
Il n'y a personne
la source
Ou exécutez Chrome sans sécurité Web {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5
1
enregistrer 2 octets$.get("www.medalbot.com/api/v1/medals",a=>alert(a[0][c='country_name']+'\n'+a[1][c]+'\n'+a[2][c]))
Yay295
2

Rubis, 97 79 +-rnet/http (11) = 90 octets

Utilise une modification du modèle d'expression régulière de la réponse MATL de Luis Mendo expression régulière de la , optimisée par @Jordan, car Ruby ne prend pas en charge les quantificateurs dans les lookbehinds.

-18 octets de @Jordan.

puts Net::HTTP.get("www.medalbot.com","/api/v1/medals").scan(/"c.+"(.+)"/)[0,3]
Encre de valeur
la source
Vous pouvez omettre .map(&:last)entièrement pour 12 octets, et en supprimant le /dans /apipour un plus.
Jordan
En outre, une expression rationnelle plus courte qui semble fonctionner correctement:/"cou.+"(.+)"/
Jordan
Ou: /y_.+"(.+)"/.
Jordan
@Jordan omettre le premier /entraîne des erreurs sur ma version Ruby. Ou c'est peut-être le réseau sur lequel je suis? Peu importe. Je suis allé avec une regex légèrement différente de celle que vous avez suggérée mais de même longueur.
Value Ink
Intéressant. FWIW J'utilise 2.3.1.
Jordan
2

PowerShell, 60

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

Même idée de base que TimmyD (je n'ai pas vu leur réponse avant de poster), mais un peu plus courte :-)

Joey
la source
1
Comment diable fonctionne cette |% c*analyse? Je veux dire, il le fait, je viens de l'essayer, mais c'est une syntaxe étrange (elle apparaît même dans mon ISE comme une erreur).
AdmBorkBork
1
@TimmyD: ForEach-Object dispose d' un ensemble de paramètres qui étend une seule propriété ou appelle une méthode avec des arguments: ForEach-Object [-MemberName] <String>. Le -MemberNameparamètre prend en charge des caractères génériques, de sorte que dans ce cas , il se développe la seule adaptation d'élément générique que: country_name. Enregistre pas mal de caractères aussi ;-)
Joey
2

Mathematica 96 66 octets

@alephalpha a trouvé un moyen de travailler directement à partir du fichier (sans l'enregistrer), économisant ainsi 30 octets!

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

Importimporte le fichier en tant que fichier JSON brut. [[;;3,2]]prend les lignes 1 à 3, deuxième entrée (nom du pays).

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

PHP, 205 139 124 124 116 111 109 octets

Je voulais juste utiliser le nouvel opérateur de vaisseau spatial pour PHP 7 une fois ( EDIT : c'est superflu, car le tri n'est pas nécessaire):

<?$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";}

Si nous omettons l'étape de tri inutile et supposons que l'API fournit les données déjà triées par gold_count décroissant (comme il semble), nous pouvons raccourcir encore plus:

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

Remarque: Le saut de ligne dans la chaîne est intentionnel pour enregistrer un octet de \ n

Histoire

  • Omission de quelques guillemets et accolades qui lèveront des avis, suppression de la variable $ c pour l'index country_name. Merci à @manatwork pour ces astuces pour sauver encore plus de personnages.
  • Merci à @jeroen d'avoir souligné la boucle while la plus courte, également passée à l'accès aux objets pour passer de 124 à 116
  • Enregistré 5 octets supplémentaires en appelant l'API dans la boucle. Certes, cela prend plus de temps et encombre l'API, mais c'est Code Golf. Nécessite PHP 5.5 pour fonctionner en raison du déréférencement des tableaux.
  • Enregistré 2 octets supplémentaires en supprimant la balise ouverte courte, selon cette méta-réponse
YetiCGN
la source
Merci! Je viens de voir toutes les autres entrées trier et j'ai pensé que j'avais raté quelque chose.
YetiCGN
1
Pourquoi mettez-vous "country_name" dans une variable? Et de toute façon, comme error_reportingla valeur par défaut n'affiche pas d'avis, vous pouvez omettre les guillemets doubles. Et l'API medalbot semble fonctionner sans www. sous-domaine aussi. Ensuite, vous n'avez pas besoin des accolades autour echo.
manatwork
Merci beaucoup! Eh bien, il était tard ... La variable $ c est un reste d'une optimisation précédente que j'ai jetée lorsque je suis passée à la boucle for. Je suppose que le codage propre (sans préavis) est encore trop profondément enraciné, donc je ne considère même pas ces optimisations que vous avez signalées. Merci encore!
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
la source
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
la source
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
la source
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
la source
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
la source
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
la source
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
la source
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
la source