Golf nhanh: Thủ lĩnh vàng


18

Thử thách

Sử dụng dữ liệu từ API tại đây , xuất tên của ba quốc gia có nhiều huy chương vàng Olympic nhất tại Thế vận hội Olympic Rio 2016 (tức là yếu tố đầu tiên của danh sách được trả về).

Ví dụ: tại thời điểm đăng bài (18h23 UTC + 1, Thứ Hai, ngày 15 tháng 8), Hoa Kỳ, Anh và Trung Quốc có nhiều huy chương vàng nhất, vì vậy đầu ra sẽ là:

United States
Great Britain
China

Tên quốc gia phải được phân tách bằng dòng mới và bạn có thể có dòng mới hàng đầu hoặc dấu.

Khi Thế vận hội kết thúc, chương trình không phải hoạt động như mong đợi.

Các trình rút ngắn URL không được phép nhưng các thư viện phân tích cú pháp JSON được cho phép.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

Tôi sẽ tiếp tục cố gắng để có được một thử thách theo chủ đề Thế vận hội ở đây

Bảng xếp hạng


6
Bạn có thể nói đây là một ... sân golf mini ?
Deusovi

1
Tai nạn @Deusovi Ba-dum
Beta Decay

2
Tôi thực sự muốn ai đó đăng một giải pháp Java để tôi có thể xem liệu giải pháp C của tôi có đánh bại nó hay không
Dave

3
"Vương quốc Anh ... vì vậy sản lượng ... Vương quốc Anh"
trichoplax

1
Các vận động viên @Dave NI có thể chọn đại diện cho Đội GB hoặc Đội Ireland. Nếu các vận động viên NI được yêu cầu tham gia Đội GB, thì đó sẽ là Đội Anh.
SGR

Câu trả lời:


12

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

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • Giảm 6 byte nhờ các đề xuất của @ Joe.
  • Ít hơn 1 byte nhờ @YOU.
  • Giảm 4 byte nhờ đề xuất của @manatwork rằng API medalbot dường như hoạt động mà không có www. tên miền phụ cũng vậy .

2
Thay đổi cut -d '"'để cut -d\"lưu hai byte. Nếu bạn sử dụng w3mthay vì curl -sbạn có thể tiết kiệm thêm 4.
Joe

bạn có thể đổi _n thành m
BẠN

@YOU: Không thực sự bởi vì theo cách đó, nó sẽ trả về nhiều dòng hơn dự kiến, tức là "id": "đức", id ":" colombia ", v.v.
Master_ex 16/8/2016

Nếu họ không thể là 1 đến 3 thì sẽ ổn thôi, bạn có -m3 bảo vệ.
BẠN

1
@YOU: Tôi đoán điều này đúng với điểm số hiện tại và có vẻ như nó sẽ ổn cho Thế vận hội 2016 (trừ khi họ đổi Hoa Kỳ thành Hoa Kỳ: P). Tôi sẽ thay đổi nó.
Master_ex

13

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

Vì vậy, hóa ra C không giỏi trong việc tải xuống các tài nguyên từ internet và phân tích chúng dưới dạng JSON. Ai biết?

Mã này (tự nhiên) siêu lỏng lẻo với kiểm tra lỗi, vì vậy tôi đoán nếu medalbot.com muốn gửi dữ liệu độc hại thì họ có thể kích hoạt tràn bộ đệm, v.v. Ngoài ra, mã mới nhất mong đợi các giá trị nhất định cho các hằng số (ví dụ AF_INET = 2) có thể sẽ là trường hợp ở khắp mọi nơi, nhưng nó không được bảo đảm.

Đây là mã ban đầu không quá mong manh (nhưng vẫn không mạnh mẽ hoặc an toàn):

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

Phá vỡ:

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

Điều này không tốt cho máy chủ vì chúng tôi không gửi Connection: close\r\nnhư một phần của yêu cầu HTTP. Nó cũng bỏ qua Accepttiêu đề vì medalbot.com dường như không sử dụng nén trong mọi trường hợp và bỏ lỡ khoảng trống sau Host:(một lần nữa, máy chủ có vẻ ổn với điều này). Dường như không có gì khác có thể được gỡ bỏ mặc dù.


Khi olympics kết thúc, hành vi có khả năng nhất của chương trình này là segfault cố đọc vị trí bộ nhớ 9. Trừ khi một hacker độc ác chiếm lấy miền, trong trường hợp đó, hành vi rất có thể là để đặt một số byte thành 0 trong địa chỉ thông tin cấu trúc, mà có lẽ không quá nguy hiểm thực sự. Nhưng ai có thể nói với những tin tặc xấu xa này?


1
Vâng, đó là một dịch hại với những tin tặc. Điều tốt là chúng tôi đang ở trên một trang web mà tin tặc dưới bất kỳ hình thức nào dường như không bao giờ xuất hiện ...
đã ngừng quay ngược chiều

1
Đó là một bước nhảy vọt!
Phi tuyến

2
@NonlinearFnut yeah, thật đáng kinh ngạc có bao nhiêu ký tự có thể được lưu khi bạn thận trọng với gió và sử dụng các số được xác định trực tiếp trong mã! Điều này đã trở thành một bài tập thành "điều gì điên rồ nhất, nguy hiểm nhất, có khả năng phá vỡ nhất - nhưng hiện tại là chức năng - để tải xuống văn bản trong C?"
Dave

Chúng ta hãy hy vọng rằng Bobby Bảng nhỏ không có bất kỳ người thân nào cạnh tranh trong năm nay.
GuitarPicker 17/8/2016

Khả năng đọc cũng là một trong những thương vong đầu tiên của môn đánh gôn. . .
Phi tuyến

12

PowerShell v4 +, 88 69 byte

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

Sử dụng iwr(bí danh cho Invoke-WebRequest) để lấy API. Chúng tôi cung cấp thông số đó làm tham số đầu vào cho tích ConvertFrom-Jsonhợp kéo văn bản JSON vào một mảng đối tượng tùy chỉnh. Chúng tôi gói gọn mảng đối tượng đó trong parens, lấy ba phần tử đầu tiên [0..2]và lấy .country_nametừng phần tử của nó.

Yêu cầu ít nhất v4 + cho các thuộc tính đa đối tượng, thay vào đó chúng ta cần sử dụng một cái gì đó như |Select "country_name"thay thế. Yêu cầu ít nhất v3 + cho tích ConvertFrom-Jsonhợp.

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

Bạn có thể thả http://www.và PS không bận tâm về http://hoặc trang web về www.. PS của tôi (5.1.14393) thậm chí dường như không quan tâm đến .content.
Nick T

@NickT Cảm ơn các golf. Tôi đã không nhận ra rằng ConvertFrom-Jsonrõ ràng không chỉ cần một .contentphần của yêu cầu web, nhưng nó cũng hoạt động trên thiết lập của tôi.
admBorkBork

6

R, 98, 112 , 108 byte

chơi golf 4 nhờ @miff

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

Dòng đầu tiên nhập dữ liệu bằng thư viện JSON. Dòng thứ hai lấy tên quốc gia có liên quan. Nó sắp xếp các quốc gia theo huy chương vàng theo thứ tự tăng dần, đảo ngược các chỉ số và lấy 3 đầu tiên, in chúng.


1
Tôi nghĩ rằng bạn có thể thay thế rev(order(a$g))bằng order(-a$g)để lưu 4 byte
Miff

5

JavaScript (ES6), 122 byte

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

Do vấn đề an toàn của trình duyệt , mã này phải được chạy medalbot.com. Tuy nhiên, nó không tận dụng lợi thế đó và có khả năng có thể được chạy ở nơi khác. Cũng lưu ý rằng tôi đã chèn \nký tự, nhưng tôi chỉ đếm là một, bởi vì tôi có thể thay thế nó bằng một ký tự

Node.js (ES6), 173 byte

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

Điều này sẽ ngắn hơn rất nhiều nếu API trả về tất cả dữ liệu trong một lần, nhưng vì nó trả về trong hai phần, tôi phải nối các phần và kết hợp chúng, sau đó phân tích chúng.

Node.js (ES6) + Yêu cầu, 138 byte

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

Tốt hơn, nhưng vẫn không tốt như phiên bản trình duyệt. Cảm ơn đã tải API! Yêu cầu là một thư viện máy khách HTTP phổ biến được sử dụng để đơn giản hóa các yêu cầu và bạn có thể thấy điều đó có hiệu lực ở đây.


Cái nào trong số này hoạt động trong bất kỳ trình duyệt nào? Bạn có thể đặt câu trả lời ngắn nhất ở đầu câu trả lời của bạn (cho bảng xếp hạng)
Beta Decay

Một trong những đầu này hoạt động trong hầu hết các trình duyệt hiện đại, và cũng là ngắn nhất. Hai cái còn lại trong Node.js là cách viết JavaScript trên máy chủ (cộng với những thứ khác).
MayorMonty

@ αγ Lưu ý rằng nó không hoạt động trong bất kỳ phiên bản IE hoặc Safari nào
MayorMonty

Tôi hiểu rồi, tôi đã bị treo lên vì vấn đề CORS
Beta Decay

4

bash + w3m + jq ,83 59 byte

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

Cảm ơn Jordan cho ba byte.

Cảm ơn BẠN đã có thêm 24 byte! Hóa ra dữ liệu được sắp xếp. Ồ : D


1
Bạn có thể bỏ qua .|và lập chỉ mục kết quả sort_bytrực tiếp và bạn có thể lưu một byte khác bằng cách sử dụng [:3][]thay vì [0,1,2]. Tất cả cùng nhau : sort_by(-.gold_count)[:3][].country_name.
Jordan

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

4

Java 8, 261 258 byte

Điều này sử dụng lambda để lưu một vài byte và thư viện mạng để có được trang web. Khác hơn là 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){}}

Đây là POJO (cũ) của tôi để thử nghiệm (và chơi gôn):

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

Cập nhật

  • -3 [16-08-17] Di chuyển câu lệnh in vào vòng lặp for
  • -5 [16-08-16] Thay thế regex được cải thiện
  • -9 [16-08-16] Đã xóa java.netnhập

Eep. Tôi cần lưu vài byte byte
Dave

Tôi đang bắt kịp! Bây giờ chỉ còn 15 byte phía sau!
Dave

Vâng, tôi đã đi trước ít nhất một vài giờ. Nó hoạt động chống lại tôi, nhưng có lẽ bạn có thể tiết kiệm một số byte hơn bởi có vòng lặp đếm xuống từ 3 thay vì lên.
Dave

@ Tôi đã cố gắng có điều kiện boolean break inhưng Java không chuyển đổi boolean thành int hoặc ngược lại, nếu đó là những gì bạn đang nghĩ. Ngoài ra bạn đã làm tôi khá lo lắng với lần chỉnh sửa cuối cùng đó.
Phi tuyến

3

MATL , 67 byte

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

Điều này không hoạt động trực tuyến vì hàm Xi( urlread) không được phép.

Chạy ví dụ:

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

Giải trình

Điều này đọc nội dung dưới dạng một chuỗi và sau đó áp dụng biểu thức chính quy '(?<="c.+e": ")[^"]+'để trích xuất tên quốc gia. Regex sử dụng look-đằng sau "c.+e"thay vì "country_name"để giảm độ dài mã.

'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

Con trăn 3 202 , 164 byte.

Python 3 không thực hiện xử lý url / json ngắn. : /
Không nhận ra API đã được sắp xếp theo số vàng

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]

Cảm ơn @Nick T và @Value Ink


1
from urllib import*và sử dụng chỉ urlopensau này tiết kiệm 1 byte. Ngoài ra, bạn sẽ có thể lấy câu lệnh in và đặt nó ngay sau dấu hai chấm, cứu bạn khỏi vết lõm.
Mực giá trị

1
Nếu bạn cho urlopenđối tượng vào list(), điều đó có làm điều tương tự .readlines()không?
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]))

Vì lý do Yêu cầu nguồn gốc chéo, điều này phải được chạy từ medalbot.commiền (với jQuery).

Lịch sử

  • -14 byte nhờ @YetiCGN
  • -2 byte nhờ Yay295

Hoặc chạy chrome mà không có bảo mật web {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5

1
lưu 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

Sử dụng một sửa đổi của mẫu biểu thức chính quy từ câu trả lời MATL của Luis Mendo , được tối ưu hóa thêm bởi @Jordan, vì Ruby không hỗ trợ các bộ lượng hóa trong giao diện.

-18 byte từ @Jordan.

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

Bạn có thể bỏ qua .map(&:last)hoàn toàn trong 12 byte và bỏ qua phần đầu /trong /apithêm một byte .
Jordan

Ngoài ra, một regex ngắn hơn có vẻ hoạt động tốt:/"cou.+"(.+)"/
Jordan

Hoặc : /y_.+"(.+)"/.
Jordan

@Jordan bỏ qua các /nguyên nhân hàng đầu gây ra lỗi trên phiên bản Ruby của tôi. Hoặc nó có thể là mạng tôi đang ở trên? Bất cứ điều gì. Tôi đã đi với một regex hơi khác so với cái bạn đề nghị nhưng cùng độ dài.
Mực giá trị

Hấp dẫn. FWIW Tôi đang sử dụng 2.3.1.
Jordan

2

PowerShell, 60

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

Cùng một ý tưởng cơ bản như TimmyD (không thấy câu trả lời của họ trước khi tôi đăng), nhưng ngắn hơn một chút :-)


1
Làm thế nào ma quỷ mà |% c*phân tích cú pháp làm việc? Ý tôi là, nó có, tôi chỉ thử nó, nhưng đó là một cú pháp kỳ lạ (nó thậm chí còn nổi bật trong ISE của tôi là một lỗi).
admBorkBork 16/8/2016

1
@TimmyD: ForEach-Object có một bộ tham số mở rộng một thuộc tính hoặc gọi một phương thức với các đối số : ForEach-Object [-MemberName] <String>. Các -MemberNamehỗ trợ tham số ký tự đại diện, vì vậy trong trường hợp này nó mở rộng phù hợp với thành viên duy nhất mà wildcard: country_name. Cũng lưu một vài ký tự ;-)
Joey

2

Mathicala 96 66 byte

@alephalpha tìm thấy một cách để làm việc trực tiếp từ tệp (mà không lưu nó), do đó tiết kiệm được 30 byte!

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

Importnhập tệp dưới dạng tệp JSON thô. [[;;3,2]]mất hàng 1-3, mục thứ hai (tên quốc gia).


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

2

PHP, 205 139 124 116 111 109 byte

Tôi chỉ muốn sử dụng toán tử tàu vũ trụ mới cho PHP 7 một lần ( EDIT : Nó không cần thiết, vì không cần phải sắp xếp):

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

Nếu chúng tôi bỏ qua bước sắp xếp không cần thiết và giả sử API cung cấp dữ liệu đã được sắp xếp theo gold_count giảm dần (có vẻ như vậy), chúng tôi có thể rút ngắn điều này hơn nữa:

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

Lưu ý: Việc ngắt dòng trong chuỗi là cố ý lưu một byte từ \ n

Lịch sử

  • Đã bỏ qua một số trích dẫn và dấu ngoặc nhọn sẽ đưa ra thông báo, đã xóa biến $ c cho chỉ mục country_name. Cảm ơn @manatwork cho các mẹo này để tiết kiệm nhiều ký tự hơn.
  • Cảm ơn @jeroen đã chỉ ra vòng lặp while ngắn hơn, cũng chuyển sang truy cập đối tượng để đi từ 124 đến 116
  • Đã lưu thêm 5 byte bằng cách gọi API trong vòng lặp. Cấp, nó mất nhiều thời gian hơn và làm tắc nghẽn API, nhưng đó là Code Golf. Cần PHP 5.5 để hoạt động vì hội thảo mảng.
  • Đã lưu thêm 2 byte bằng cách xóa thẻ mở ngắn, theo câu trả lời meta này

Cảm ơn! Tôi chỉ thấy tất cả các mục khác sắp xếp và nghĩ rằng tôi đã bỏ lỡ một cái gì đó.
YetiCGN

1
Tại sao bạn đặt "country_name" trong một biến? Và dù sao, vì error_reportinggiá trị mặc định của nó không hiển thị các thông báo, bạn có thể bỏ qua dấu ngoặc kép. Và API medalbot dường như hoạt động mà không có www. tên miền phụ cũng vậy. Sau đó, bạn không cần niềng răng xung quanh echo.
manatwork

Cảm ơn nhiều! Chà, đã muộn rồi ... Biến $ c là phần còn lại từ tối ưu hóa trước đó mà tôi đã vứt đi khi tôi chuyển sang vòng lặp for. Tôi đoán mã hóa sạch (không có thông báo) vẫn ăn sâu quá mức nên tôi thậm chí không xem xét những tối ưu hóa này mà bạn đã chỉ ra. Vì vậy, cảm ơn một lần nữa!
YetiCGN

thay thế foreach bằng forloop sau: for(;$i<3;)echo$d[+$i++][country_name]." "giảm nó bằng 5 byte. Không gian cuối cùng là một cuộc xâm nhập. Hoặc chỉ là một vòng lặp trong một thời gianwhile($i<3)
Jeroen

1

BASH + w3m + các tiện ích lõi, 70 byte

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

Có vẻ như đầu ra đã được sắp xếp. Chỉ cần vứt bỏ tất cả các văn bản thêm.


1

CJam (57 byte)

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

Bản demo trực tuyến không khả dụng vì nó tìm nạp nội dung từ web. Điều này gian lận bằng cách không thực sự phân tích cú pháp JSON, nhưng giả sử rằng cấu trúc sẽ không thay đổi. (Nhưng sau đó, hầu hết các câu trả lời hiện có, theo những cách khác nhau).


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

Chào mừng đến với PPCG! Bạn có thể lưu một vài byte bằng cách xóa khoảng trắng giữa import*và bằng cách di chuyển printtrực tiếp đến dấu hai chấm trên dòng 2. Chúng tôi thường sử dụng #s thay vì **trước và sau cho các tiêu đề của chúng tôi.
NoOneIsĐây là

1
Chúng tôi thường yêu cầu người gửi phải bao gồm bất kỳ thư viện bên thứ ba nào được yêu cầu trong tiêu đề câu trả lời. Vì các yêu cầu không phải là mô-đun thư viện chuẩn, ngôn ngữ của câu trả lời này phải là "yêu cầu Python 2 +".
Mego

1

Clojure, 122 byte

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

Không có thư viện JSON được sử dụng :). Đọc chuỗi từ URL, thay thế dấu hai chấm bằng chuỗi trống và tránh chuỗi kết quả thành bản đồ Clojure. Có 3 yếu tố và bản đồ đầu tiên háo hức với chức năng in country_namethuộc tính của từng yếu tố.


1

Java 8 386 384 459 byte

2 byte được lưu từ @Easterly Irk

Lần gửi mã golf đầu tiên của tôi vì vậy tôi chắc chắn có cách để tiết kiệm nhiều byte, nhưng ồ :)

Nó sử dụng Gson để đọc JSON

Đòi hỏi:

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

Mã đánh gôn:

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

Mã bị hủy bỏ:

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

Bạn có thể xóa khoảng trắng trong "g = new Gson ()" không?
Rɪᴋᴇʀ

2
Đợi đã, không cần cái này importđể biên dịch sao?
Dave

báo cáo nhập khẩu cần được thêm vào số byte?
yitzih

Làm thế nào để bạn tính toán nhập khẩu?
yitzih

Không biết các quy tắc chính xác cho Java là gì, vì tôi chưa đăng bất kỳ quy tắc nào ở đây trước đây, nhưng quy tắc thông thường là bạn phải đếm mọi thứ cần thiết để làm cho mã hợp lệ (và từ đó nhanh chóng tìm kiếm các gợi ý về Java trang Tôi có thể thấy các đề xuất khác nhau về cách giảm thiểu mã nhập, vì vậy tôi đoán nó phải được tính). Nhưng một lần nữa, tôi cũng đang cố gắng để có câu trả lời C của mình để giành chiến thắng trước Java trong câu hỏi này, vì vậy tôi khá thiên vị: 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")

Cải thiện rất ít so với câu trả lời của user5957401, không cần sắp xếp và tên thư viện ngắn hơn. Đây cũng là nỗ lực đầu tiên của tôi khi chơi golf;)


Bạn có thể, như trong mọi ngôn ngữ, bỏ qua "www." một phần của miền và lưu thêm 4 byte nếu thư viện của bạn tuân theo chuyển hướng tiếp theo.
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])}

Có thể chạy với kotlinc -script <filename>hoặc thông qua IDEA dưới dạng tệp * .kts.

bây giờ, nếu chúng ta đưa ra một giả định RẤT lớn về định dạng, bao gồm số lượng dòng, chúng ta có thể cắt nó thành:

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

hoặc thậm chí

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

Cảm ơn mọi người ở nhóm chùng Kotlin đã giúp tôi cắt giảm vài chục byte!


3 biểu tượng ngắn hơn Clojure và JS? Tôi sẽ lấy.
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"])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.