Golf Cepat: Pemimpin Emas


18

Tantangan

Dengan menggunakan data dari API di sini , berikan nama-nama tiga negara dengan medali emas Olimpiade terbanyak di Olimpiade Rio 2016 (yaitu elemen pertama dari daftar yang dikembalikan).

Misalnya, pada saat posting (18:23 UTC + 1, Senin, 15 Agustus), AS, Inggris, dan Cina memiliki medali emas terbanyak, sehingga hasilnya adalah:

United States
Great Britain
China

Nama-nama negara harus dipisahkan oleh baris baru dan Anda mungkin memiliki baris baru terkemuka atau tambahan.

Setelah Olimpiade selesai, program tidak harus bekerja seperti yang diharapkan.

Pemendek URL tidak diizinkan tetapi parsing pustaka JSON diizinkan.

Ini adalah kode golf, jadi kode terpendek dalam byte menang.

Saya akan terus berusaha mendapatkan tantangan bertema Olimpiade di sini

Papan peringkat


6
Menurut Anda apakah ini ... golf mini ?
Deusovi

1
@Deusovi Kecelakaan Ba-dum
Peluruhan Beta

2
Saya benar-benar ingin seseorang memposting solusi Java sehingga saya dapat melihat apakah solusi C saya mengalahkannya ...
Dave

3
"Inggris ... jadi keluaran ... Inggris Raya"
trichoplax

1
@Dave NI Atlet dapat memilih untuk mewakili Tim GB atau Tim Irlandia. Jika Atlet NI diminta untuk bergabung dengan Tim GB, maka itu akan menjadi Tim Inggris.
SGR

Jawaban:


12

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

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • 6 byte lebih sedikit berkat saran dari Joe.
  • 1 byte lebih sedikit berkat @YOU.
  • 4 byte kurang berkat @manatwork saran 's bahwa para medalbot API tampaknya bekerja tanpa www. subdomain juga .

2
Ubah cut -d '"'ke cut -d\"untuk menyimpan dua byte. Jika Anda menggunakan w3mbukannya curl -sAnda dapat menyimpan 4 lebih.
Joe

Anda dapat mengubah _n menjadi m
ANDA

@ YOU: Tidak juga karena itu akan menghasilkan lebih banyak baris dari yang diharapkan, yaitu "id": "germany", id ":" colombia "dll.
Master_ex

jika mereka tidak bisa 1 sampai 3 itu akan baik-baik saja, Anda memiliki penjaga -m3.
ANDA

1
@ YOU: Saya kira ini berlaku untuk skor saat ini dan tampaknya tidak apa-apa untuk Olimpiade 2016 (kecuali jika mereka mengubah Amerika Serikat ke Amerika Serikat: P). Saya akan mengubahnya.
Master_ex

13

C (+ soket), 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;}

Jadi ternyata C tidak hebat dalam mengunduh sumber daya dari internet dan menguraikannya sebagai JSON. Siapa yang tahu?

Kode ini (tentu saja) super longgar dengan pengecekan kesalahan, jadi saya kira jika medalbot.com ingin mengirim data berbahaya mereka akan dapat memicu buffer overflows, dll. Juga kode terbaru mengharapkan nilai-nilai tertentu untuk konstanta (misalnya AF_INET = 2) yang akan mungkin terjadi di mana-mana, tapi itu tidak dijamin.

Berikut kode asli yang tidak terlalu rapuh (tapi masih tidak terlalu kuat atau aman):

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

Kerusakan:

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

Ini tidak terlalu baik untuk server karena kami tidak mengirim Connection: close\r\nsebagai bagian dari permintaan HTTP. Itu juga menghilangkan Acceptheader karena medalbot.com tampaknya tidak menggunakan kompresi dalam hal apa pun, dan melewatkan ruang setelah Host:(sekali lagi, server tampaknya baik-baik saja dengan ini). Sepertinya tidak ada hal lain yang bisa dihapus.


Setelah olimpiade berakhir, perilaku yang paling mungkin untuk program ini adalah untuk segfault mencoba membaca lokasi memori. info struct, yang mungkin sebenarnya tidak terlalu berbahaya. Tapi siapa yang bisa tahu dengan peretas jahat ini?


1
Ya, itu hama pada para peretas itu. Untung kita di situs web di mana peretas dalam bentuk apa pun tidak mungkin untuk muncul ...
berhenti mengubah counterclockwis

1
Itu cukup lompatan!
NonlinearFruit

2
@NonlinearFruit, ya, sungguh menakjubkan berapa banyak karakter yang bisa diselamatkan ketika Anda berhati-hati dan menggunakan angka implementasi yang ditentukan langsung dalam kode! Ini telah menjadi latihan untuk "apa cara yang paling gila, paling berbahaya, paling mungkin rusak - tetapi saat ini berfungsi - untuk mengunduh teks dalam C?"
Dave

Semoga saja Bobby Tables kecil tidak memiliki saudara yang bersaing tahun ini.
GuitarPicker

Keterbacaan juga merupakan salah satu korban pertama dari golf cod. . .
NonlinearFruit

12

PowerShell v4 +, 88 69 byte

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

Menggunakan iwr(alias untuk Invoke-WebRequest) untuk mengambil API. Kami memberi makan itu sebagai parameter input keConvertFrom-Json built-in yang menarik teks JSON ke dalam array objek kustom. Kami merangkum array objek dalam parens, mengambil tiga elemen pertama [0..2], dan mengambil .country_namemasing-masing darinya.

Membutuhkan setidaknya v4 + untuk properti multi-objek, kalau tidak kita harus menggunakan sesuatu seperti itu |Select "country_name". Membutuhkan setidaknya v3 + untuk ConvertFrom-Jsonbuilt-in.

PS C:\Tools\Scripts\golfing> .\olympics-gold-leader.ps1
United States
Great Britain
China

Anda dapat drop http://www.dan PS tidak peduli tentang http://atau tentang situs www.. PS saya (5.1.14393) juga tidak peduli .content.
Nick T

@NickT Terima kasih untuk golfnya. Saya tidak menyadari bahwa ConvertFrom-Jsontidak secara eksplisit hanya membutuhkan .contentsebagian dari permintaan web, tetapi itu berfungsi pada pengaturan saya juga.
AdmBorkBork

6

R, 98, 112 , 108 byte

bermain golf 4 berkat @miff

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

Baris pertama mengimpor data menggunakan pustaka JSON. Baris kedua mengambil nama negara yang relevan. Itu mengurutkan negara-negara dengan medali emas dalam urutan yang meningkat, membalikkan indeks, dan mengambil 3 pertama, mencetaknya.


1
Saya pikir Anda dapat mengganti rev(order(a$g))dengan order(-a$g)untuk menyimpan 4 byte
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`))

Karena masalah keamanan browser , kode ini harus dijalankan medalbot.com. Namun itu tidak mengambil keuntungan dari itu dan berpotensi dijalankan di tempat lain. Perhatikan juga bahwa saya memasukkan \nkarakter, tetapi saya hanya menghitung adalah satu, karena saya bisa menggantinya dengan satu

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

Ini akan menjadi jauh lebih singkat jika API mengembalikan semua data dalam satu rentang, tetapi karena kembali dalam dua bagian, saya harus menggabungkan bagian-bagian dan menggabungkannya, dan kemudian menguraikannya.

Node.js (ES6) + Permintaan, 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`))

Lebih baik, tetapi masih tidak sebagus versi browser. Terima kasih, ambil API! Permintaan adalah pustaka klien HTTP populer yang digunakan untuk menyederhanakan permintaan, dan Anda dapat melihat itu berlaku di sini.


Manakah dari ini yang berfungsi di browser apa saja? Bisakah Anda menempatkan yang paling pendek di atas jawaban Anda (untuk leaderboard)
Beta Decay

Yang paling atas ini berfungsi di sebagian besar browser modern, dan juga yang terpendek. Dua lainnya di Node.js cara menulis JavaScript di server (ditambah hal-hal lain).
MayorMonty

@ βετѧΛєҫαγ Perhatikan bahwa ini tidak berfungsi di versi IE atau Safari mana pun
MayorMonty

Saya mengerti, saya terpaku pada masalah CORS
Beta Decay

4

bash + w3m + jq ,83 59 byte

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

Terima kasih kepada Jordan untuk tiga byte.

Terima kasih untuk ANDA selama 24 byte lagi! Ternyata data diurutkan. Wow. : D


1
Anda dapat menghilangkan .|dan mengindeks hasilsort_by secara langsung, dan Anda dapat menyimpan byte lain dengan menggunakan [:3][]alih-alih [0,1,2]. Semua bersama-sama: sort_by(-.gold_count)[:3][].country_name.
Jordan

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

4

Java 8, 261 258 byte

Ini menggunakan lambda untuk menyimpan beberapa byte dan pustaka internet untuk mendapatkan halaman web. Selain itu hanya Jawa.

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

Inilah POJO (lama) saya untuk pengujian (dan 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){}}
    );
  }
}

Memperbarui

  • -3 [16-08-17] Pindahkan pernyataan cetak ke dalam untuk loop
  • -5 [16-08-16] Peningkatan ganti regex
  • -9 [16-08-16] java.netImpor dihapus

Eep. Saya perlu menyimpan beberapa byte ...
Dave

Saya mengejar ketinggalan! Sekarang hanya 15 byte di belakang!
Dave

Yah, setidaknya aku sudah berada di depan selama beberapa jam. Ini bekerja melawan saya, tetapi Anda mungkin dapat menyimpan lebih banyak byte dengan memiliki loop menghitung mundur dari 3 bukannya naik.
Dave

@ Pernah saya mencoba memiliki kondisi break boolean, itetapi Java tidak mengubah boolean menjadi int atau sebaliknya, jika itu yang Anda pikirkan. Anda juga membuat saya sangat gugup dengan suntingan terakhir.
NonlinearFruit

3

MATL , 67 byte

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

Ini tidak berfungsi online karena berfungsi Xi(urlread ) tidak diizinkan.

Contoh dijalankan:

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

Penjelasan

Ini membaca konten sebagai string dan kemudian menerapkan regex '(?<="c.+e": ")[^"]+'untuk mengekstrak nama negara. Regex menggunakan tampilan-belakang dengan "c.+e"bukannya "country_name"mengurangi panjang kode.

'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

3

Python 3, 202 , 164 byte.

Python 3 tidak melakukan penanganan url / json pendek. : /
Tidak menyadari API sudah mengurutkan berdasarkan jumlah emas

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

3

Python 2, 120 113 byte

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

Terima kasih @Nick T dan @Value Ink


1
from urllib import*dan menggunakan hanya urlopenmenghemat 1 byte. Selain itu, Anda harus dapat mengambil pernyataan cetak dan meletakkannya tepat setelah tanda titik dua, menyelamatkan Anda dari lekukan.
Nilai Tinta

1
Jika Anda memberi makan urlopenobjek list(), apakah itu melakukan hal yang sama .readlines()?
Nick T

3

JavaScript + jQuery, 114 100 byte

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

Karena alasan Cross Origin Requests, ini harus dijalankan dari medalbot.comdomain (dengan jQuery).

Sejarah

  • -14 byte berkat @YetiCGN
  • -2 byte terima kasih kepada Yay295

Atau jalankan chrome tanpa keamanan web {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5

1
simpan 2 byte$.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 byte

Menggunakan modifikasi pola regex dari jawaban MATL Luis Mendo , yang lebih dioptimalkan oleh @Jordan, karena Ruby tidak mendukung quantifiers di lookbehinds.

-18 byte dari @Jordan.

puts Net::HTTP.get("www.medalbot.com","/api/v1/medals").scan(/"c.+"(.+)"/)[0,3]

Anda dapat menghilangkan .map(&:last)seluruhnya selama 12 byte, dan menghilangkan yang utama/ di /apiuntuk satu lagi.
Jordan

Juga, regex pendek yang tampaknya berfungsi dengan baik: /"cou.+"(.+)"/
Jordan

Atau: /y_.+"(.+)"/ .
Jordan

@Jordan menghilangkan yang terkemuka / penyebab kesalahan pada versi Ruby saya. Atau mungkin jaringan saya aktif? Masa bodo. Saya menggunakan regex yang sedikit berbeda dari yang Anda sarankan tetapi panjangnya sama.
Nilai Tinta

Menarik. FWIW Saya menggunakan 2.3.1.
Jordan

2

PowerShell, 60

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

Ide dasar yang sama seperti TimmyD (tidak melihat jawaban mereka sebelum saya diposting), tetapi sedikit lebih pendek :-)


1
Bagaimana iblis itu |% c*bekerja parsing? Maksudku, memang, aku baru saja mencobanya, tapi itu beberapa sintaks aneh (bahkan menyoroti ISE saya sebagai kesalahan).
AdmBorkBork

1
@TimmyD: foreach-Obyek memiliki seperangkat parameter yang memperluas properti tunggal, atau panggilan metode dengan argumen: ForEach-Object [-MemberName] <String>. The -MemberNamemendukung parameter wildcard, sehingga dalam hal ini mengembang hanya cocok anggota yang wildcard: country_name. Menyimpan beberapa karakter juga ;-)
Joey

2

Mathematica 96 66 byte

@alephalpha menemukan cara untuk bekerja langsung dari file (tanpa menyimpannya), sehingga menghemat 30 byte!

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

Importmengimpor file sebagai file JSON Mentah. [[;;3,2]]membutuhkan baris 1-3, entri kedua (nama negara).


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

2

PHP, 205 139 124 116 111 109 byte

Saya hanya ingin menggunakan operator pesawat ruang angkasa baru untuk PHP 7 sekali ( EDIT : Ini berlebihan, karena penyortiran tidak diperlukan):

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

Jika kami menghilangkan langkah penyortiran yang tidak perlu dan menganggap API memberikan data yang sudah diurutkan berdasarkan gold_count turun (seperti yang terlihat), kami dapat mempersingkat ini lebih lanjut:

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

Catatan: Pemutus baris dalam string sengaja untuk menyimpan byte dari \ n

Sejarah

  • Ommitted beberapa kutipan dan kawat gigi yang akan membuang pemberitahuan, menghapus variabel $ c untuk indeks country_name. Terima kasih kepada @manatwork untuk tip ini untuk menyimpan lebih banyak karakter.
  • Terima kasih kepada @jeroen untuk menunjukkan loop sementara yang lebih pendek, juga beralih ke akses objek untuk beralih dari 124 menjadi 116
  • Disimpan 5 byte lebih banyak dengan memanggil API di dalam loop. Memang, ini membutuhkan waktu lebih lama dan mengganggu API, tapi itu Code Golf. Perlu PHP 5.5 untuk bekerja karena dereferencing array.
  • Menyimpan 2 byte lebih banyak dengan menghapus tag terbuka pendek, sesuai jawaban meta ini

Terima kasih! Saya hanya melihat semua entri lainnya menyortir dan berpikir saya melewatkan sesuatu.
YetiCGN

1
Mengapa Anda memasukkan "country_name" ke dalam variabel? Lagi pula, karena error_reportingnilai default tidak menampilkan pemberitahuan, Anda dapat menghilangkan tanda kutip ganda. Dan API medalbot tampaknya berfungsi tanpa www. subdomain juga. Maka Anda tidak perlu kawat gigi di sekitar echo.
manatwork

Terima kasih banyak! Ya, sudah terlambat ... Variabel $ c adalah sisa dari optimasi sebelumnya yang saya buang ketika saya beralih ke for loop. Saya kira pengkodean bersih (bebas pemberitahuan) masih terlalu mendalam sehingga saya bahkan tidak mempertimbangkan optimasi yang Anda tunjukkan. Jadi terima kasih lagi!
YetiCGN

mengganti foreach dengan forloop berikut: for(;$i<3;)echo$d[+$i++][country_name]." "menguranginya dengan 5 byte. Ruang terakhir menjadi jalur masuk. Atau hanya sebagai loop sementarawhile($i<3)
Jeroen

1

BASH + w3m + utils core, 70 byte

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

Sepertinya output sudah diurutkan. Hanya perlu membuang semua teks tambahan.


1

CJam (57 byte)

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

Demo online tidak tersedia karena mengambil konten dari web. Ini menipu dengan tidak benar-benar mem-parsing JSON, tetapi dengan asumsi bahwa struktur tidak akan berubah. (Tetapi kemudian begitu juga sebagian besar jawaban yang ada, dengan cara yang berbeda).


1

Python 2, 117 byte

from requests import *
for x in get('http://www.medalbot.com/api/v1/medals').json()[:3]:
    print(x['country_name'])

Selamat datang di PPCG! Anda dapat menyimpan beberapa byte dengan menghapus spasi di antara importdan *, dan dengan memindahkannya printlangsung setelah tanda titik dua di baris 2. Kami biasanya menggunakan #s alih-alih **sebelum dan sesudah untuk tajuk kami.
NoOneIsHere

1
Kami biasanya meminta submitter untuk menyertakan pustaka pihak ketiga yang diperlukan dalam tajuk jawaban. Karena permintaan bukan modul perpustakaan standar, bahasa jawaban ini harus "Python 2 + permintaan".
Mego

1

Clojure, 122 byte

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

Tidak ada perpustakaan JSON yang digunakan :). Membaca string dari URL, mengganti titik dua dengan string kosong dan mengevaluasi string yang menghasilkan peta Clojure. Mengambil 3 elemen pertama dan fungsi peta bersemangat yang mencetak country_nameproperti masing-masing elemen.


1

Java 8 386 384 459 byte

2 byte disimpan dari @Easterly Irk

Pengajuan golf kode pertama saya jadi saya yakin ada cara untuk menghemat banyak byte, tapi oh well :)

Ini menggunakan Gson untuk membaca JSON

Membutuhkan:

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

Kode golf:

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

Kode Tidak Terkunci:

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

Bisakah Anda menghapus spasi di "g = new Gson ()"?
Rɪᴋᴇʀ

2
Tunggu, bukankah ini perlu importdikompilasi?
Dave

pernyataan impor perlu ditambahkan ke jumlah byte?
yitzih

bagaimana Anda menghitung impor?
yitzih

Tidak tahu apa aturan sebenarnya untuk Java, karena saya belum pernah memposting di sini sebelumnya, tetapi aturan yang biasa adalah bahwa Anda harus menghitung semua yang diperlukan untuk membuat kode tersebut valid (dan dengan cepat mencari petunjuk Java) halaman saya dapat melihat berbagai saran tentang cara meminimalkan kode impor, jadi saya rasa itu harus dihitung). Tetapi sekali lagi, saya juga mencoba untuk mendapatkan jawaban C saya untuk menang melawan Jawa dalam pertanyaan ini, jadi saya cukup bias: D
Dave

1

R, 97 95 byte

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

Sedikit perbaikan atas jawaban user5957401, tidak perlu disortir, dan nama perpustakaan lebih pendek. Juga upaya pertama saya bermain golf;)


Anda dapat, seperti dalam setiap bahasa, menghilangkan "www." bagian dari domain dan simpan 4 byte lagi jika perpustakaan Anda mengikuti arahan ulang berikutnya.
YetiCGN

1

Kotlin (Script) , 125 121 119 byte

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

Dapat dijalankan dengan kotlinc -script <filename> atau melalui IDEA sebagai file * .kts.

sekarang, jika kita membuat asumsi yang SANGAT besar tentang format, termasuk jumlah baris, kita dapat memotongnya menjadi:

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

atau bahkan

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

Terima kasih kepada orang-orang di tim slack Kotlin karena membantu saya memotong beberapa lusin byte!


3 simbol lebih pendek dari Clojure dan JS? Aku akan mengambilnya.
CypherAJ

0

Javascript 167 byte

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"])
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.