퀵 골프 : 골드 리더


18

도전

여기 API의 데이터를 사용 하여 2016 년 리오 올림픽에서 올림픽 금메달이 가장 많은 3 개국의 이름을 출력하십시오 (즉, 반환 된 목록의 첫 번째 요소).

예를 들어, 게시 시점 (18:23 UTC + 1, 8 월 15 일 월요일)에 미국, 영국 및 중국이 가장 많은 금메달을 획득하므로 결과는 다음과 같습니다.

United States
Great Britain
China

국가 이름은 개행 문자로 구분해야하며 선행 또는 후행 개행 문자가있을 수 있습니다.

올림픽이 끝나면 프로그램이 예상대로 작동하지 않아도됩니다.

URL 단축기는 허용되지 않지만 JSON 구문 분석 라이브러리는 허용됩니다.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

나는 여기에서 올림픽 테마 챌린지를 얻으려고 계속 노력할 것입니다.

리더 보드


6
이것이 미니 골프 라고 할 수 있습니까?
Deusovi

1
@Deusovi Ba-dum 크래쉬
Beta Decay

2
나는 누군가 C 솔루션이 그것을 능가하는지 알 수 있도록 Java 솔루션을 게시하고 싶다…
Dave

3
"영국 ... 그래서 출력 ... 영국"
trichoplax

1
@Dave NI 운동 선수는 팀 GB 또는 팀 아일랜드를 대표하도록 선택할 수 있습니다. NI 운동 선수가 Team GB에 가입해야한다면 Team UK가됩니다.
SGR

답변:


12

bash + w3m + grep + cut, 65 59 58 54 바이트

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • @Joe의 제안 덕분에 6 바이트가 줄었습니다.
  • @YOU 덕분에 1 바이트가 줄었습니다.
  • 메달 봇 API가 www없이 작동하는 것으로 보이는 @manatwork 의 제안 덕분에 4 바이트가 줄었습니다 . 하위 도메인도 .

2
변경 cut -d '"'하기 위해 cut -d\"2 바이트를 저장합니다. w3m대신에 사용 curl -s하면 4를 더 절약 할 수 있습니다.
Joe

_n을 m으로 변경할 수 있습니다.
YOU

@YOU : 실제로 "id": "germany", id ":"colombia "등 예상보다 많은 행을 반환하므로 실제로는 아닙니다.
Master_ex

그들이 1에서 3까지가 될 수 없다면 괜찮을 것입니다 -m3 가드입니다.
당신은

1
@YOU : 이것은 현재 점수에 해당되는 것으로 생각되며 2016 년 올림픽에서는 괜찮을 것 같습니다 (미국이 미국으로 변경되는 경우는 제외 : P). 변경하겠습니다.
Master_ex

13

C (+ 소켓) 433 429 280 276 270 259 바이트

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

따라서 C는 인터넷에서 리소스를 다운로드하고 JSON으로 구문 분석하는 데 좋지 않습니다. 누가 알았 겠어?

내 생각 때문에 medalbot.com 트리거 버퍼 오버 플로우 등을 그들이 할 수있을 것 악의적 인 데이터를 전송하기를 원한다면이 코드는 또한 최신 코드가 기대하는, 오류 검사와 (자연) 슈퍼 느슨한 인 상수에 대한 특정 값 (예를 들어 AF_INET = 2)하는 아마도 모든 곳에서 일어날 수 있지만 보장되지는 않습니다.

깨지기 쉽지 않은 원래 코드는 다음과 같습니다 (그러나 여전히 강력하거나 안전하지는 않습니다).

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

고장:

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

Connection: close\r\nHTTP 요청의 일부로 보내지 않기 때문에 서버에는 좋지 않습니다 . Acceptmedalbot.com은 압축을 사용하지 않는 것처럼 보이기 때문에 헤더를 생략하고 공백을 놓칩니다 Host:(다시 말하면 서버는 이것으로 괜찮습니다). 그래도 다른 것을 제거 할 수있는 것처럼 보이지 않습니다.


올림픽이 끝나면이 프로그램에서 가장 가능성이 높은 동작은 segfault가 메모리 위치 9를 읽으려고 시도하는 것입니다. 사악한 해커가 도메인을 인계하지 않는 한, 가장 가능성이 높은 동작은 주소에서 바이트를 0으로 설정하는 것입니다. info 구조체는 실제로 그렇게 위험하지는 않습니다. 그러나 누가이 사악한 해커들에게 말할 수 있습니까?


1
네, 해커들에게는 해충입니다. 좋은 것은 우리가 ... 어떤 종류의 해커가 지금까지 출현 할 가능성이있는 웹 사이트에있어
차례에 중단는 counterclockwis

1
그것은 꽤 도약이었습니다!
NonlinearFruit

2
@NonlinearFruit 네, 바람에주의를 기울이고 코드에서 직접 구현 정의 숫자를 사용할 때 얼마나 많은 문자를 저장할 수 있는지 놀랍습니다! 이것은 "C에서 텍스트를 다운로드하는 가장 끔찍하고, 가장 위험하며, 깨지기 쉽지만 현재 기능적인 방법"에 대한 연습이되었습니다.
Dave

작은 바비 테이블 에는 올해 경쟁하는 친척이 없기를 바랍니다 .
GuitarPicker

가독성은 또한 대구 골프의 첫 사상자 중 하나입니다. . .
NonlinearFruit

12

PowerShell v4 +, 88 69 바이트

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

iwr(를위한 별칭 Invoke-WebRequest)을 사용 하여 API를 가져옵니다. ConvertFrom-JsonJSON 텍스트를 사용자 정의 객체 배열로 가져 오는 입력 매개 변수로 기본 제공합니다. 우리는 그 객체 배열을 parens로 캡슐화하고 처음 세 요소 [0..2]를 취하고 .country_name각각을 취합니다 .

multiple-object-properties에는 v4 이상이 필요합니다. 그렇지 않으면 |Select "country_name"대신 비슷한 것을 사용해야 합니다. ConvertFrom-Json내장을 위해 최소한 v3 +가 필요합니다 .

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

당신은 떨어질 수 http://www.있으며 PS는 http://또는 사이트에 대해 신경 쓰지 않습니다 www.. 내 PS (5.1.14393)도 신경 쓰지 않는 것 같습니다 .content.
Nick T

@NickT 골프 주셔서 감사합니다. 나는 몰랐 ConvertFrom-Json만 명시 적으로 필요하지 않은 .content웹 요청의 일부를하지만 내 설정에서 작동뿐만 아니라.
AdmBorkBork

6

R, 98, 112 , 108 바이트

@miff에게 4 골프를했습니다.

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

첫 번째 줄은 JSON 라이브러리를 사용하여 데이터를 가져옵니다. 두 번째 줄은 관련 국가 이름을 가져옵니다. 국가별로 금메달을 기준으로 순서를 정렬하고 지수를 뒤집은 다음 첫 3 개를 인쇄하여 인쇄합니다.


1
나는 당신이 대체 할 수 있다고 생각 rev(order(a$g))order(-a$g)할인율 4 바이트
쓸데없는 싸움

5

자바 스크립트 (ES6), 122 바이트

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

브라우저 안전 문제 로 인해이 코드를 실행해야합니다 medalbot.com. 그러나이를 활용하지는 않으며 잠재적으로 다른 곳에서 실행될 수 있습니다. 또한 \n문자를 삽입 했지만 하나만 바꿀 수 있기 때문에 하나만 계산합니다.

Node.js (ES6), 173 바이트

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

API가 데이터를 한 번에 모두 리턴하면 훨씬 짧았지만 두 섹션으로 리턴하므로 파트를 연결하고 결합한 다음 구문 분석해야합니다.

Node.js (ES6) + 요청, 138 바이트

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

더 좋지만 여전히 브라우저 버전만큼 좋지 않습니다. 감사 페치 API! 요청 은 요청을 단순화하는 데 사용되는 널리 사용되는 HTTP 클라이언트 라이브러리이며 여기에서 적용되는 것을 볼 수 있습니다.


어떤 브라우저에서 작동합니까? 답의 맨 위에 가장 짧은 것을 넣을 수 있습니까 (리더 보드 용)
Beta Decay

이 중 하나는 최신 브라우저에서 작동하며 가장 짧습니다. 다른 두 가지는 Node.js 에 서버에서 JavaScript를 작성하는 방법 (및 기타 사항)입니다.
MayorMonty

이 IE 또는 Safari의 모든 버전에서 작동하지 않는 것을 βετѧΛєҫαγ에 적어 둡니다 @
MayorMonty

나는 CORS 문제에 매달리고 있었다
Beta Decay

4

bash + w3m + jq ,83 59 바이트

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

3 바이트 동안 Jordan에게 감사합니다.

24 바이트 더 감사합니다! 데이터가 정렬되어 있습니다. 와. :디


1
직접 .|결과를 생략 하고 인덱싱 sort_by할 수 있으며 [:3][]대신을 사용하여 다른 바이트를 저장할 수 있습니다 [0,1,2]. 모두 함께 : sort_by(-.gold_count)[:3][].country_name.
Jordan

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

4

자바 8, 261258 바이트

이것은 람다를 사용하여 몇 바이트를 저장하고 넷 라이브러리는 웹 페이지를 가져옵니다. 그 외에는 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){}}

다음은 테스트 (및 골프)를위한 (구) POJO입니다.

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

최신 정보

  • -3 [16-08-17] 인쇄 문 for 루프 이동
  • -5 [16-08-16] 정규식 교체 개선
  • -9 [16-08-16] java.net수입 제거

엡. 바이트를 절약해야합니다…
Dave

나는 따라 잡고있다! 이제 15 바이트 만 남았습니다!
Dave

글쎄, 나는 적어도 몇 시간 동안 앞서 있었다. 그것은 나에 대해 작동하지만 루프 가 위로가 아닌 3에서 카운트 다운 하여 더 많은 바이트를 절약 할 수 있습니다 .
Dave

@Dave 부울 브레이크 조건을 시도 i했지만 Java가 부울을 int로 변환하거나 비자로 변환하지 않습니다. 또한 당신은 저 마지막 편집에 꽤 긴장했습니다.
NonlinearFruit

3

MATL , 67 바이트

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

함수 Xi( urlread)가 허용되지 않기 때문에 온라인에서 작동 하지 않습니다.

예제 실행 :

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

설명

이것은 내용을 문자열로 읽은 다음 정규식 '(?<="c.+e": ")[^"]+'을 적용하여 국가 이름을 추출합니다. 정규 표현식은 코드 길이를 줄이는 "c.+e"대신 look-behind를 사용 "country_name"합니다.

'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

파이썬 3, 202 , 164 바이트

파이썬 3은 짧은 URL / json 처리를하지 않습니다. : /
API가 이미 골드 수별로 정렬되어 있다는 것을 인식하지 못했습니다.

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

파이썬 2, 120 113 바이트

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

감사합니다 @Nick T와 @Value Ink


1
from urllib import*그냥 사용하는 것은 urlopen나중에 1 바이트를 저장합니다. 또한 인쇄 문을 가져 와서 콜론 바로 뒤에 두어 들여 쓰기를 방지 할 수 있어야합니다.
Value Ink

1
urlopen개체를 공급하면 list()다음과 같은 작업을 수행 .readlines()합니까?
Nick T

3

자바 스크립트 + jQuery, 114100 바이트

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

Cross Origin Requests 때문에 medalbot.com도메인에서 (jQuery 사용) 실행해야합니다 .

역사

  • @YetiCGN 덕분에 -14 바이트
  • Yay295 덕분에 -2 바이트

또는 웹 보안없이 크롬을 실행 {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5

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

2

루비, 97 79 + -rnet/http(11) = 90 바이트

Ruby는 lookbehinds에서 한정자를 지원하지 않기 때문에 @Jordan에 의해 최적화 된 Luis Mendo의 MATL answer 에서 정규식 패턴의 수정을 사용합니다 .

@Jordan에서 -18 바이트

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

.map(&:last)12 바이트 동안 완전히 생략하고 선행 /을 생략 할 수 있습니다 /api.
Jordan

또한, 더 짧은 정규 표현식은 잘 작동하는 것 같습니다 :/"cou.+"(.+)"/
Jordan

또는 : /y_.+"(.+)"/.
Jordan

@Jordan이 선행을 생략하면 /Ruby 버전에서 오류가 발생합니다. 아니면 내가 사용중인 네트워크일까요? 도대체 무엇이. 나는 당신이 제안했지만 길이는 약간 다른 정규 표현식을 사용했습니다.
가치 잉크

흥미 롭군 FWIW 2.3.1을 사용하고 있습니다.
Jordan

2

PowerShell, 60

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

TimmyD와 같은 기본 아이디어 (내가 게시하기 전에 답변을 보지 못했지만) :-)


1
악마는 그 |% c*파싱을 어떻게 작동합니까? 나는 그것을 시도했지만 방금 시도했지만 이상한 구문입니다 (오류로 ISE에서 강조 표시됨).
AdmBorkBork

1
@TimmyD : ForEach-Object에는 단일 속성을 확장하거나 인수가있는 메서드를 호출하는 매개 변수 집합이 ForEach-Object [-MemberName] <String>있습니다. 이 -MemberName매개 변수는 와일드 카드를 지원하므로이 경우 해당 와일드 카드와 일치하는 유일한 멤버를 확장합니다 country_name. 꽤 많은 문자도 절약합니다 ;-)
Joey

2

Mathematica 96 66 바이트

@alephalpha는 파일을 저장하지 않고 파일에서 직접 작업하여 30 바이트를 절약 할 수있는 방법을 찾았습니다!

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

Import파일을 Raw JSON 파일로 가져옵니다. [[;;3,2]]행 1-3, 두 번째 항목 (국가 이름)을 사용합니다.


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

2

PHP, 205139124116111109 바이트

방금 PHP 7에 새로운 우주선 연산자를 한 번 사용하고 싶었습니다 ( 편집 : 정렬이 필요하지 않으므로 불필요한 것입니다).

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

불필요한 정렬 단계를 생략하고 API가 gold_count로 내림차순으로 정렬 된 데이터를 전달한다고 가정하면 (이것처럼)이를 더 단축 할 수 있습니다.

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

참고 : 문자열 내 줄 바꿈은 의도적으로 \ n에서 바이트를 저장하는 것입니다.

역사

  • 통지를 던질 인용 부호와 중괄호를 생략하고 country_name 색인의 $ c 변수를 제거했습니다. 더 많은 문자를 저장하기위한 팁에 대한 @manatwork 덕분입니다.
  • 더 짧은 while 루프를 지적한 @jeroen에게 감사의 말을 전하며 124에서 116으로 객체 액세스로 전환했습니다.
  • 루프 내에서 API를 호출하여 5 바이트를 더 절약했습니다. 물론 API가 오래 걸리고 코드가 복잡하지만 코드 골프입니다. 배열 역 참조로 인해 PHP 5.5가 작동해야합니다.
  • 이 메타 답변에 따라 짧은 열린 태그를 제거하여 2 바이트를 더 절약했습니다.

감사! 방금 다른 모든 항목이 정렬되는 것을 보았고 내가 뭔가를 놓쳤다 고 생각했습니다.
YetiCGN

1
왜 "country_name"을 변수에 넣습니까? 어쨌든 error_reporting기본값은 알림을 표시하지 않으므로 큰 따옴표를 생략 할 수 있습니다. 그리고 메달 봇 API는 www없이 작동하는 것 같습니다. 하위 도메인도. 그러면 괄호가 필요하지 않습니다 echo.
manatwork

무리 감사! 글쎄, 늦었 어 ... $ c 변수는 for 루프로 전환했을 때 버린 이전 최적화에서 남은 것입니다. 깨끗한 코딩 (공지 사항 없음)이 여전히 너무 깊이 뿌리 박혀 있다고 생각합니다. 그래서 당신이 지적한 최적화를 고려조차하지 않습니다. 다시 한 번 감사드립니다!
YetiCGN

foreach를 다음 forloop로 바꾸십시오. for(;$i<3;)echo$d[+$i++][country_name]." "5 바이트로 줄입니다. 마지막 공간은 진입 오프 코스입니다. 아니면 while 루프처럼while($i<3)
Jeroen

1

BASH + w3m + 코어 유틸리티, 70 바이트

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

출력이 이미 정렬 된 것 같습니다. 여분의 텍스트를 모두 버려야합니다.


1

CJam (57 바이트)

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

웹에서 컨텐츠를 가져 오기 때문에 온라인 데모를 사용할 수 없습니다. 실제로 JSON을 구문 분석하지 않고 구조가 변경되지 않는다고 가정하여 속임수입니다. (그러나 다른 방법으로 기존 답변의 대부분을 수행하십시오).


1

파이썬 2, 117 바이트

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

PPCG에 오신 것을 환영합니다! import와 사이의 공백을 제거 하고 콜론 바로 다음에 줄 *을 이동하여 몇 바이트를 절약 할 수 있습니다 . 일반적으로 헤더 앞뒤에 s를 사용 합니다. print2#**
NoOneIsHere 여기

1
일반적으로 제출자는 답변 헤더에 필요한 타사 라이브러리를 포함시켜야합니다. 요청은 표준 라이브러리 모듈이 아니기 때문에이 답변의 언어는 "Python 2 + requests"여야합니다.
Mego

1

클로저, 122 바이트

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

사용 된 JSON 라이브러리가 없습니다 :). URL에서 문자열을 읽고 콜론을 빈 문자열로 바꾸고 문자열을 회피하여 Clojure 맵으로 만듭니다. 처음 3 개의 요소를 가져와 country_name각 요소의 속성 을 인쇄하는 맵 기능을 수행합니다 .


1

자바 8 386 384 459 바이트

@Easterly Irk에서 2 바이트 저장

내 첫 번째 코드 골프 제출이므로 많은 바이트를 절약 할 수있는 방법이 있지만 확실합니다 :)

Gson을 사용하여 JSON을 읽습니다.

요구 사항 :

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

골프 코드 :

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

"g = new Gson ()"에서 공백을 제거 할 수 있습니까?
Rɪᴋᴇʀ

2
잠깐, import컴파일에 s가 필요하지 않습니까?
Dave

바이트 수에 import 문을 추가해야합니까?
yitzih

수입은 어떻게 계산합니까?
yitzih

이전에 여기에 게시하지 않았기 때문에 Java에 대한 정확한 규칙이 무엇인지 모르지만 일반적인 규칙은 코드를 유효하게 만드는 데 필요한 모든 것을 계산해야한다는 것입니다 (Java 힌트를 빠르게 조회하는 것) 페이지 가져 오기 코드를 최소화하는 방법에 대한 다양한 제안을 볼 수 있으므로 계산해야합니다.) 그러나 다시, 나는 또한이 질문에서 Java에 대해 C의 대답을 얻으려고 노력하고 있으므로 꽤 편향되어 있습니다 : D
Dave

1

R, 97 95 바이트

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

user5957401의 답변에 비해 거의 개선되지 않았으며 정렬이 필요 없으며 라이브러리 이름이 짧습니다. 또한 골프에 대한 나의 첫 번째 시도;)


모든 언어와 마찬가지로 "www"를 생략 할 수 있습니다. 라이브러리가 다음 리디렉션을 따르는 경우 도메인의 일부를 차지하고 4 바이트를 더 절약하십시오.
YetiCGN

1

코 틀린 (스크립트) , 125 (121) 119 바이트

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

kotlinc -script <filename>* .kts 파일로 IDEA를 사용 하거나 IDEA를 통해 실행할 수 있습니다.

이제 줄 수를 포함하여 형식에 대해 매우 큰 가정을하면 다음과 같이 잘라낼 수 있습니다.

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

또는

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

수십 바이트를 자르는 데 도움을 준 Kotlin 슬랙 팀의 사람들에게 감사합니다!


Clojure와 JS보다 짧은 3 개의 기호? 내가 가져갈 게
CypherAJ

0

자바 스크립트 167 바이트

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"])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.