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

Peluruhan Beta
sumber
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 .
Master_ex
sumber
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?

Dave
sumber
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
AdmBorkBork
sumber
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.

pengguna5957401
sumber
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.

MayorMonty
sumber
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

Lynn
sumber
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
Buah Nonlinier
sumber
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
Luis Mendo
sumber
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]))
Morgan Thrapp
sumber
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

Joe
sumber
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
Tidak Ada Di Sini
sumber
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]
Nilai Tinta
sumber
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 :-)

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

DavidC
sumber
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
YetiCGN
sumber
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.

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

Peter Taylor
sumber
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'])
Sethascope
sumber
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.

cliffroot
sumber
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;
}
Yitzih
sumber
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;)

topol817
sumber
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!

CypherAJ
sumber
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"])
Dylan Meeus
sumber