Schnelles Golf: Der Goldführer

18

Herausforderung

Geben Sie hier anhand der API-Daten die Namen der drei Länder mit den meisten olympischen Goldmedaillen bei den Olympischen Spielen 2016 in Rio aus (dh das erste Element der zurückgegebenen Liste).

Zum Zeitpunkt der Veröffentlichung (18:23 UTC + 1, Montag, 15. August) haben beispielsweise die USA, das Vereinigte Königreich und China die meisten Goldmedaillen. Die Ausgabe wäre also:

United States
Great Britain
China

Die Ländernamen müssen durch Zeilenumbrüche getrennt werden, und es kann vor- oder nachgestellte Zeilenumbrüche geben.

Sobald die Olympischen Spiele beendet sind, muss das Programm nicht mehr wie erwartet funktionieren.

URL-Kürzungen sind nicht zulässig, JSON-Parsing-Bibliotheken sind jedoch zulässig.

Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes.

Ich werde weiterhin versuchen, hier eine olympische Herausforderung zu bekommen

Bestenliste

Beta-Zerfall
quelle
6
Würden Sie sagen, dass dies ein ... Minigolf ist ?
Deusovi
1
@ Deusovi Ba-Dum Absturz
Beta Decay
2
Ich möchte wirklich, dass jemand eine Java-Lösung veröffentlicht, damit ich sehen kann, ob meine C-Lösung sie schlägt…
Dave
3
"Großbritannien ... also Ausgabe ... Großbritannien"
trichoplax
1
@ Dave NI Athleten können entweder Team GB oder Team Irland vertreten. Wenn NI-Athleten Team GB beitreten müssten, wäre dies Team UK.
SGR

Antworten:

12

Bash + W3M + Grep + Cut, 65 59 58 54 Bytes

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • 6 Bytes weniger dank @ Joes Vorschlägen.
  • Dank @YOU 1 Byte weniger.
  • 4 Bytes weniger dank @manatworks Vorschlag, dass die medalbot API ohne www zu funktionieren scheint. Subdomain auch .
Master_ex
quelle
2
Wechseln Sie cut -d '"'zu cut -d\", um zwei Bytes zu speichern. Wenn Sie w3mstattdessen verwenden curl -s, können Sie 4 weitere sparen.
Joe
Sie können _n zu m ändern
SIE
@YOU: Nicht wirklich, weil auf diese Weise mehr Zeilen als erwartet zurückgegeben werden, dh "id": "germany", id ":" colombia "usw.
Master_ex
Wenn sie nicht 1 bis 3 sein können, ist es in Ordnung, Sie haben -m3 Wache.
SIE
1
@YOU: Ich denke, dies gilt für die aktuelle Punktzahl und es scheint, dass es für die Olympischen Spiele 2016 in Ordnung sein wird (außer, wenn sie die USA in die Vereinigten Staaten von Amerika ändern: P). Ich werde es ändern.
Master_ex
13

C (+ Sockets): 433 429 280 276 270 259 Byte

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

Es stellt sich also heraus, dass C nicht gut darin ist, Ressourcen aus dem Internet herunterzuladen und sie als JSON zu analysieren. Wer wusste?

Dieser Code ist (natürlich) sehr lasch bei der Fehlerprüfung. Wenn medalbot.com also bösartige Daten senden möchte, können sie möglicherweise Pufferüberläufe auslösen. Auch der neueste Code erwartet bestimmte Werte für die Konstanten (z. B. AF_INET = 2), die wird wahrscheinlich überall der Fall sein, aber es ist nicht garantiert.

Hier ist der Originalcode, der nicht so zerbrechlich ist (aber immer noch nicht sehr robust oder sicher ist):

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

Nervenzusammenbruch:

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

Dies ist für den Server nicht sehr hilfreich, da wir nicht Connection: close\r\nals Teil der HTTP-Anforderung senden . Der AcceptHeader wird ebenfalls weggelassen, da medalbot.com in keinem Fall die Komprimierung zu verwenden scheint und das Leerzeichen danach fehlt Host:(auch hier scheint der Server damit einverstanden zu sein). Es scheint jedoch nicht, dass etwas anderes entfernt werden kann.


Sobald die Olympischen Spiele zu Ende sind, versucht dieses Programm am wahrscheinlichsten, den Speicherort 9 auszulesen. In diesem Fall ist es am wahrscheinlichsten, dass ein Byte in der Adresse auf 0 gesetzt wird, es sei denn, ein böser Hacker übernimmt die Domäne info structs, was eigentlich wahrscheinlich nicht allzu gefährlich ist. Aber wer kann es mit diesen bösen Hackern sagen?

Dave
quelle
1
Ja, es ist eine Plage mit diesen Hackern. Gut, dass wir auf einer Website sind, auf der Hacker aller Art wahrscheinlich nie auftauchen werden ...
nicht mehr gegen den Uhrzeigersinn
1
Das war schon der Sprung!
NonlinearFruit
2
@NonlinearFruit Ja, es ist erstaunlich, wie viele Zeichen gespeichert werden können, wenn Sie Vorsicht walten lassen und implementierungsdefinierte Zahlen direkt im Code verwenden! Dies hat sich zu einer Übung entwickelt: "Was ist die verrückteste, gefährlichste und wahrscheinlichste Art, Text in C herunterzuladen - aber derzeit funktionsfähig?"
Dave
Hoffen wir nur, dass in diesem Jahr an den kleinen Bobby Tables keine Verwandten teilnehmen.
GuitarPicker
Die Lesbarkeit ist auch eines der ersten Opfer des Kabeljau-Golfsports. . .
NonlinearFruit
12

PowerShell v4 +, 88 bis 69 Byte

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

Verwendet iwr(den Alias ​​für Invoke-WebRequest), um die API abzurufen. Wir geben das als Eingabeparameter an das ConvertFrom-Jsonintegrierte Element weiter, das den JSON-Text in ein benutzerdefiniertes Objektarray zieht. Wir kapseln dieses Objektarray in Parens, nehmen die ersten drei Elemente [0..2]und nehmen die .country_namevon jedem davon.

Benötigt mindestens v4 + für die Eigenschaften mehrerer Objekte, sonst müssten wir |Select "country_name"stattdessen so etwas verwenden. Benötigt mindestens v3 + für das ConvertFrom-Jsoneingebaute.

PS C:\Tools\Scripts\golfing> .\olympics-gold-leader.ps1
United States
Great Britain
China
AdmBorkBork
quelle
Sie können fallen http://www.und PS kümmert sich nicht um http://oder die Website über www.. Mein PS (5.1.14393) scheint sich auch nicht einmal um das zu kümmern .content.
Nick T
@ NickT Danke für die Golfer. Mir war nicht klar, dass ich ConvertFrom-Jsonnicht explizit nur den .contentTeil der Webanfrage benötigte, aber es funktioniert auch bei meinem Setup.
AdmBorkBork
6

R, 98, 112 , 108 Bytes

Golf 4 dank @miff

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

In der ersten Zeile werden Daten mithilfe einer JSON-Bibliothek importiert. In der zweiten Zeile werden die relevanten Ländernamen angezeigt. Es sortiert die Länder nach Goldmedaillen in aufsteigender Reihenfolge, kehrt die Indizes um und druckt die ersten 3 aus.

user5957401
quelle
1
Ich denke , dass Sie ersetzen können rev(order(a$g))mit order(-a$g)zu speichern 4 Bytes
Miff
5

JavaScript (ES6), 122 Bytes

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

Aus Sicherheitsgründen muss dieser Code ausgeführt werden medalbot.com. Dies wird jedoch nicht ausgenutzt und kann möglicherweise an anderer Stelle ausgeführt werden. Beachten Sie auch, dass ich das \nZeichen eingefügt habe , aber nur als eins zähle, weil ich es durch eins ersetzen könnte

Node.js (ES6), 173 Bytes

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

Dies wäre so viel kürzer gewesen, wenn die API die Daten auf einmal zurückgegeben hätte, aber da sie in zwei Abschnitten zurückgegeben wurden, muss ich die Teile verketten und kombinieren und sie dann analysieren.

Node.js (ES6) + Request, 138 Bytes

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

Besser, aber immer noch nicht so gut wie die Browserversion. Danke API holen! Request ist eine beliebte HTTP-Clientbibliothek, die zur Vereinfachung von Anforderungen verwendet wird. Dies wird hier angezeigt.

BürgermeisterMonty
quelle
Welche davon funktioniert in jedem Browser? Kannst du die kürzeste davon an die Spitze deiner Antwort setzen (für die Rangliste)
Beta-Zerfall
Die oberste davon funktioniert in den meisten modernen Browsern und ist auch die kürzeste. Die anderen beiden sind in Node.js eine Art, JavaScript auf dem Server zu schreiben (plus andere Dinge).
BürgermeisterMonty
@ βετѧΛєҫαγ Beachten Sie, dass es in keiner Version von IE oder Safari
funktioniert
Ich habe mich auf das CORS-Problem eingelassen
Beta-Zerfall
4

bash + w3m + jq ,83 59 Bytes

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

Danke an Jordan für drei Bytes.

Vielen Dank an SIE für 24 weitere Bytes! Es stellt sich heraus, dass die Daten sortiert sind. Wow. : D

Lynn
quelle
1
Sie können .|das Ergebnis von sort_bydirekt weglassen und indizieren , und Sie können ein weiteres Byte speichern, indem Sie [:3][]anstelle von verwenden [0,1,2]. Alle zusammen: sort_by(-.gold_count)[:3][].country_name.
Jordanien
w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'
SIE
4

Java 8, 261 258 Bytes

Dies verwendet ein Lambda, um ein paar Bytes zu speichern, und die Netzbibliothek, um die Webseite abzurufen. Davon abgesehen ist es nur 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){}}

Hier ist mein (alter) POJO zum Testen (und Golfen):

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

Aktualisieren

  • -3 [16-08-17] Verschiebt die print-Anweisung in die for-Schleife
  • -5 [16-08-16] Verbessertes Ersetzen von Regex
  • -9 [16-08-16] java.netImport entfernt
NichtlinearFruit
quelle
Eep. Ich muss ein paar Bytes speichern ...
Dave
Ich hole auf! Jetzt nur noch 15 Bytes dahinter!
Dave
Nun, ich war wenigstens ein paar Stunden voraus. Es funktioniert gegen mich, aber Sie können wahrscheinlich mehr Bytes sparen, indem Sie die Schleife von 3 nach unten statt nach oben zählen lassen.
Dave
@ Dave Ich habe versucht, die Boolesche Unterbrechungsbedingung zu haben, iaber Java konvertiert keine Booleschen Werte in int oder umgekehrt, wenn Sie das gedacht haben. Auch du hattest mich ziemlich nervös mit dieser letzten Änderung.
NonlinearFruit
3

MATL , 67 Bytes

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

Dies funktioniert online nicht, da function Xi( urlread) nicht erlaubt ist.

Beispiellauf:

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

Erläuterung

Dies liest den Inhalt als Zeichenfolge und wendet dann den regulären Ausdruck '(?<="c.+e": ")[^"]+'an, um die Ländernamen zu extrahieren. Der reguläre Ausdruck verwendet Look-Behind mit, "c.+e"anstatt "country_name"die Codelänge zu verringern.

'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
quelle
3

Python 3, 202 , 164 Bytes.

Python 3 verarbeitet keine kurzen URLs / Json. : /
Wusste nicht, dass die API bereits nach Gold sortiert ist

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
quelle
3

Python 2, 120 113 Bytes

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

Vielen Dank an @Nick T und @Value Ink

Joe
quelle
1
from urllib import*und mit nur urlopenspäter spart 1 Byte. Außerdem sollten Sie in der Lage sein, die print-Anweisung direkt nach dem Doppelpunkt einzufügen, um den Einzug zu vermeiden.
Value Ink
1
Wenn Sie das urlopenObjekt füttern list(), ist das das Gleiche wie .readlines()?
Nick T
3

JavaScript + jQuery, 114 100 Bytes

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

Aus Gründen von Cross Origin Requests muss dies von der medalbot.comDomain aus (mit jQuery) ausgeführt werden.

Geschichte

  • -14 Bytes dank @YetiCGN
  • -2 Bytes dank Yay295
Niemand ist hier
quelle
Oder führen Sie Chrome ohne Websicherheit aus {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5
1
Save 2 Bytes$.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 Bytes

Verwendet eine Modifikation des Regex-Musters aus Luis Mendos MATL-Antwort , die von @Jordan weiter optimiert wurde, da Ruby keine Quantifizierer in Lookbehinds unterstützt.

-18 Bytes von @Jordan.

puts Net::HTTP.get("www.medalbot.com","/api/v1/medals").scan(/"c.+"(.+)"/)[0,3]
Wert Tinte
quelle
Sie können weglassen .map(&:last)für 12 Bytes vollständig, und die führende wegzulassen /in /apifür eine weitere.
Jordanien
Auch eine kürzere Regex, die gut zu funktionieren scheint:/"cou.+"(.+)"/
Jordan
Oder: /y_.+"(.+)"/.
Jordanien
@Jordan das Auslassen der führenden /verursacht Fehler in meiner Ruby-Version. Oder könnte es das Netzwerk sein, in dem ich bin? Wie auch immer. Ich ging mit einem etwas anderen Regex als dem, den Sie vorgeschlagen hatten, aber mit der gleichen Länge.
Wert Tinte
Interessant. FWIW verwende ich 2.3.1.
Jordanien
2

PowerShell, 60

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

Gleiche Grundidee wie TimmyD (habe die Antwort nicht gesehen, bevor ich gepostet habe), aber etwas kürzer :-)

Joey
quelle
1
Wie zum Teufel funktioniert das |% c*Parsen? Ich meine, ich habe es gerade ausprobiert, aber das ist eine seltsame Syntax (die in meiner ISE sogar als Fehler hervorgehoben wird).
AdmBorkBork
1
@TimmyD: FürJeden-Objekt hat einen Parametersatz, der eine einzelne Eigenschaft erweitert oder ruft eine Methode mit Argumenten: ForEach-Object [-MemberName] <String>. Die -MemberNameParameterträger Platzhalter, so dass in diesem Fall dehnt sich das einzige Mitglied Anpassung dass Platzhalter: country_name. Speichert auch einige Charaktere ;-)
Joey
2

Mathematica 96 66 Bytes

@alephalpha hat einen Weg gefunden, direkt aus der Datei heraus zu arbeiten (ohne sie zu speichern), wodurch 30 Bytes gespart werden!

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

ImportImportiert die Datei als Raw-JSON-Datei. [[;;3,2]]Nimmt die Zeilen 1-3, zweiter Eintrag (Ländername).

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

PHP, 205 139 124 116 111 109 Bytes

Ich wollte den neuen Raumschiff-Operator nur einmal für PHP 7 verwenden ( BEARBEITEN : Es ist überflüssig, da keine Sortierung erforderlich ist):

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

Wenn wir den unnötigen Sortierschritt weglassen und annehmen, dass die API die bereits sortierten Daten nach gold_count absteigend liefert (wie es scheint), können wir dies weiter verkürzen:

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

Hinweis: Der Zeilenumbruch in der Zeichenfolge soll ein Byte von \ n speichern

Geschichte

  • Einige Anführungszeichen und geschweifte Klammern wurden weggelassen, und die Variable $ c für den country_name-Index wurde entfernt. Dank @manatwork für diese Tipps, um noch mehr Zeichen zu speichern.
  • Vielen Dank an @jeroen für den Hinweis auf die kürzere while-Schleife, der ebenfalls auf Objektzugriff umgestellt wurde, um von 124 auf 116 zu wechseln
  • 5 weitere Bytes durch Aufrufen der API innerhalb der Schleife gespeichert. Zugegeben, es dauert länger und verstopft die API, aber es ist Code Golf. Benötigt PHP 5.5 wegen Array-Dereferenzierung.
  • Sie haben 2 weitere Bytes gespart, indem Sie das kurze offene Tag gemäß dieser Metaantwort entfernt haben
YetiCGN
quelle
Vielen Dank! Ich habe gerade alle anderen Einträge sortiert gesehen und dachte, ich hätte etwas verpasst.
YetiCGN
1
Warum setzen Sie "country_name" in eine Variable? Da in error_reportingder Standardeinstellung keine Hinweise angezeigt werden, können Sie die doppelten Anführungszeichen auch weglassen. Und die medalbot API scheint ohne www zu funktionieren. Subdomain auch. Dann brauchst du die Hosenträger nicht herum echo.
Manatwork
Vielen Dank! Nun, es war spät ... Die Variable $ c ist ein Überbleibsel einer früheren Optimierung, die ich weggeworfen habe, als ich zur for-Schleife gewechselt bin. Ich denke, sauberes Codieren (ohne Benachrichtigung) ist immer noch zu tief verwurzelt, sodass ich diese Optimierungen, auf die Sie hingewiesen haben, nicht einmal in Betracht ziehe. Also nochmals vielen Dank!
YetiCGN
Ersetzen Sie foreach durch die folgende forloop: for(;$i<3;)echo$d[+$i++][country_name]." "Reduziert es mit 5 Bytes. Der letzte Raum ist ein Zufluchtsort. Oder einfach als eine Weile Schleifewhile($i<3)
Jeroen
1

BASH + W3M + Core Utils, 70 Byte

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

Sieht so aus, als ob die Ausgabe bereits sortiert ist. Ich muss nur den ganzen zusätzlichen Text wegwerfen.

Joe
quelle
1

CJam (57 Bytes)

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

Online-Demo nicht verfügbar, da Inhalte aus dem Web abgerufen werden. Dies führt dazu, dass JSON nicht analysiert wird, vorausgesetzt, dass sich die Struktur nicht ändert. (Aber dann tun Sie die meisten der vorhandenen Antworten auf unterschiedliche Weise).

Peter Taylor
quelle
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
quelle
Willkommen bei PPCG! Sie können ein paar Bytes zu speichern , indem den Raum zwischen importund *, und durch das Bewegen , printum direkt nach dem Doppelpunkt auf der Linie 2. Wir verwenden in der Regel #s anstelle von **before und after für unsere Header.
NoOneIsHere
1
In der Regel müssen Absender alle Bibliotheken von Drittanbietern in den Antwortheader aufnehmen. Da Anfragen kein Standardbibliotheksmodul sind, sollte die Sprache dieser Antwort "Python 2 + Anfragen" sein.
Mego
1

Clojure, 122 Bytes

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

Keine JSON-Bibliothek verwendet :). Liest die Zeichenfolge von der URL, ersetzt die Doppelpunkte durch eine leere Zeichenfolge und wertet die Zeichenfolge aus, die zur Clojure-Map führt. Nimmt die ersten 3 Elemente und ordnet eifrig eine Funktion zu, die die country_nameEigenschaften der einzelnen Elemente druckt .

Cliffroot
quelle
1

Java 8 386 384 459 Bytes

2 Bytes von @Easterly Irk gespeichert

Meine erste Code-Golf-Einsendung, also bin ich sicher, dass es eine Möglichkeit gibt, viele Bytes zu sparen, aber na ja :)

Es verwendet Gson zum Lesen des JSON

Benötigt:

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

Golf 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
quelle
Können Sie das Leerzeichen in "g = new Gson ()" entfernen?
15.
2
Warten Sie, braucht dies nicht einige imports zu kompilieren?
Dave
Import-Anweisungen müssen zur Byteanzahl hinzugefügt werden?
Yitzih
Wie berechnet man Importe?
Yitzih
Ich weiß nicht, wie die genauen Regeln für Java lauten, da ich hier noch keine veröffentlicht habe. Die übliche Regel lautet jedoch, dass Sie alles zählen müssen, was für die Gültigkeit des Codes erforderlich ist (und die Java-Hinweise nicht schnell nachschlagen müssen) Seite Ich kann verschiedene Vorschläge zum Minimieren des Importcodes sehen, daher muss er wohl gezählt werden. Aber andererseits versuche ich in dieser Frage auch, meine C-Antwort gegen Java zu gewinnen, also bin ich ziemlich voreingenommen: 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")

Geringe Verbesserung gegenüber der Antwort von user5957401, keine Sortierung erforderlich und kürzerer Bibliotheksname. Auch mein erster Golfversuch;)

topol817
quelle
Sie können, wie in jeder Sprache, das "www" weglassen. Teil der Domäne und speichern Sie 4 weitere Bytes, wenn Ihre Bibliothek der folgenden Umleitung folgt.
YetiCGN
1

Kotlin (Skript) , 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])}

Kann mit kotlinc -script <filename>oder über IDEA als * .kts-Datei ausgeführt werden.

Wenn wir jetzt eine SEHR große Annahme über das Format machen, einschließlich der Anzahl der Zeilen, können wir es so zuschneiden:

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

oder auch

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

Vielen Dank an die Leute vom Kotlin Slack Team, die mir geholfen haben, ein paar Dutzend Bytes zu kürzen!

CypherAJ
quelle
3 Symbole kürzer als Clojure und JS? Ich nehme das.
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
quelle