กอล์ฟด่วน: ผู้นำทองคำ


18

ท้าทาย

ใช้ข้อมูลจาก API ที่นี่ส่งออกชื่อของทั้งสามประเทศที่มีเหรียญทองโอลิมปิกมากที่สุดในการแข่งขันกีฬาโอลิมปิกปี 2016 ที่ริโอ (นั่นคือองค์ประกอบแรกของรายการที่ส่งคืน)

ตัวอย่างเช่นในช่วงเวลาของการโพสต์ (18:23 UTC + 1, วันจันทร์, 15 สิงหาคม), สหรัฐอเมริกา, สหราชอาณาจักรและจีนมีเหรียญทองมากที่สุดดังนั้นผลลัพธ์จะเป็น:

United States
Great Britain
China

ชื่อประเทศจะต้องคั่นด้วยการขึ้นบรรทัดใหม่และคุณอาจมีการขึ้นบรรทัดใหม่หรือตามหลัง

เมื่อการแข่งขันกีฬาโอลิมปิกเสร็จสิ้นแล้วโปรแกรมก็ไม่จำเป็นต้องทำงานตามที่คาดไว้

ตัวย่อ URL ไม่ได้รับอนุญาต แต่อนุญาตให้แยกวิเคราะห์ไลบรารี JSON

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ฉันจะพยายามต่อไปเพื่อรับความท้าทายในรูปแบบการแข่งขันกีฬาโอลิมปิกที่นี่

ลีดเดอร์บอร์ด


6
คุณจะบอกว่านี่คือ ... มินิกอล์ฟ ?
Deusovi

1
@Deusovi Ba-dum crash
Beta Decay

2
ผมต้องการคนที่จะโพสต์วิธีการแก้ปัญหา Java เพื่อที่ฉันสามารถดูว่าวิธีการแก้ปัญหาของฉัน C เต้นมัน ...
เดฟ

3
"สหราชอาณาจักร ... เอาท์พุท ... บริเตนใหญ่"
trichoplax

1
@Dave NI Athletes สามารถเลือกที่จะเป็นตัวแทนของทีม GB หรือ Team Ireland ถ้า NI Athletes จำเป็นต้องเข้าร่วม 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
  • ขอบคุณ 6 ไบต์น้อยกว่าด้วยคำแนะนำของ @ Joe
  • น้อยกว่า 1 ไบต์ขอบคุณ @YOU
  • 4 ไบต์ขอบคุณน้อยที่จะ@manatwork 's ข้อเสนอแนะว่าmedalbot API ที่ดูเหมือนว่าจะทำงานไม่มี www โดเมนย่อยเกินไป

2
เปลี่ยนcut -d '"'เป็นcut -d\"บันทึกสองไบต์ ถ้าคุณใช้w3mแทนคุณcurl -sสามารถประหยัดได้มากกว่า 4
โจ

คุณสามารถเปลี่ยน _n เป็น m
คุณ

@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 ใครจะรู้

รหัสนี้คือ (โดยปกติ) super lax พร้อมการตรวจสอบข้อผิดพลาดดังนั้นฉันเดาว่า 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\nเป็นส่วนหนึ่งของคำขอ HTTP นอกจากนี้ยังละเว้นAcceptส่วนหัวเนื่องจาก medalbot.com ดูเหมือนจะไม่ใช้การบีบอัดในทุกกรณีและพลาดช่องว่างหลังHost:(อีกครั้งเซิร์ฟเวอร์ดูเหมือนว่าจะตกลงกับสิ่งนี้) ดูเหมือนว่าจะไม่สามารถลบสิ่งอื่นออกได้


เมื่อการแข่งขันกีฬาโอลิมปิกสิ้นสุดลงพฤติกรรมที่เป็นไปได้มากที่สุดสำหรับโปรแกรมนี้คือ segfault พยายามที่จะอ่านตำแหน่งของหน่วยความจำ 9. เว้นแต่แฮ็กเกอร์ชั่วร้ายจะเข้ายึดโดเมนซึ่งในกรณีนี้พฤติกรรมที่เป็นไปได้มากที่สุดคือ โครงสร้างข้อมูลซึ่งอาจไม่อันตรายเกินไปจริง แต่ใครจะบอกกับแฮ็กเกอร์ผู้ชั่วร้ายเหล่านี้ได้บ้าง


1
ใช่มันเป็นศัตรูพืชกับแฮ็กเกอร์เหล่านั้น สิ่งที่ดีเราอยู่ในเว็บไซต์ที่แฮ็กเกอร์ทุกชนิดไม่น่าจะเปิดขึ้น ...
หยุดที่จะเปิด counterclock ซึ่งเป็น

1
นั่นเป็นการก้าวกระโดด!
ไม่เชิงเส้น

2
@NonlinearFruit ใช่มันน่าอัศจรรย์ว่าสามารถบันทึกตัวละครได้กี่ตัวเมื่อคุณระมัดระวังลมและใช้ตัวเลขที่กำหนดในการนำไปใช้โดยตรงในโค้ด! สิ่งนี้ได้กลายเป็นแบบฝึกหัดไปว่า "อะไรคือสิ่งที่บ้าที่สุดอันตรายที่สุดและมีแนวโน้มมากที่สุดที่จะแตก - แต่วิธีการทำงานในปัจจุบัน - วิธีดาวน์โหลดข้อความใน C?"
เดฟ

เราแค่หวังว่าBobby Tables เล็ก ๆ น้อย ๆจะไม่มีญาติพี่น้องเข้าร่วมแข่งขันในปีนี้
GuitarPicker

การอ่านเป็นหนึ่งในการบาดเจ็บล้มตายครั้งแรกของคอดกอล์ฟ . .
ไม่เชิงเส้น

12

PowerShell v4 +, 88 69 ไบต์

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

ใช้iwr(นามแฝงสำหรับInvoke-WebRequest) เพื่อคว้า API เราป้อนว่าเป็นพารามิเตอร์อินพุตไปยังConvertFrom-Jsonบิวด์อินที่ดึงข้อความ JSON ไปยังอาร์เรย์วัตถุที่กำหนดเอง เราสรุปแคเรย์ออบเจ็กต์นั้นเป็นแบบ parens ใช้องค์ประกอบสามอย่างแรก[0..2]และรับ.country_nameนั้นมาใช้

ต้องการอย่างน้อย v4 + สำหรับคุณสมบัติหลายออบเจ็กต์มิฉะนั้นเราจะต้องใช้บางอย่าง|Select "country_name"แทน ต้องการอย่างน้อย v3 + สำหรับConvertFrom-Jsonบิวด์อิน

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 ไบต์

golfed 4 ขอบคุณ @miff

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 ไบต์
Miff

5

JavaScript (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 บนเซิร์ฟเวอร์ (รวมถึงสิ่งอื่น ๆ )
นายกเทศมนตรีราย

@ βετѧΛєҫαγโปรดทราบว่ามันไม่ทำงานใน IE หรือ Safari เวอร์ชันใด ๆ
MayorMonty

ฉันเข้าใจแล้วว่าฉันกำลังถูกแขวนคอกับปัญหา CORS
Beta Decay

4

bash + w3m + jq ,83 59 ไบต์

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

ขอบคุณจอร์แดนเป็นเวลาสามไบต์

ขอขอบคุณคุณอีก 24 ไบต์! เปิดใช้งานการเรียงลำดับข้อมูล ว้าว. : D


1
คุณสามารถละเว้น.|และดัชนีผลมาจากการsort_byโดยตรงและคุณสามารถบันทึกไบต์อื่นโดยใช้แทน[:3][] [0,1,2]ทั้งหมดเข้าด้วยกัน: sort_by(-.gold_count)[:3][].country_name.
จอร์แดน

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

4

Java 8, 261 258 ไบต์

วิธีนี้ใช้แลมบ์ดาเพื่อบันทึกสองสามไบต์และไลบรารีสุทธิเพื่อรับหน้าเว็บ นอกเหนือจากนั้นเป็นเพียง 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] ย้ายคำสั่งการพิมพ์ไปหาลูป
  • -5 [16-08-16] การแทนที่ regex ที่ปรับปรุงแล้ว
  • -9 [16-08-16] นำjava.netเข้าที่ถูกลบออก

EEP ฉันจำเป็นต้องบันทึกบางไบต์ ...
เดฟ

ฉันกำลังตามทัน! ตอนนี้เหลือเพียง 15 ไบต์!
เดฟ

ฉันไปข้างหน้าอย่างน้อยสองสามชั่วโมงเป็นอย่างน้อย มันทำงานกับฉัน แต่คุณอาจจะสามารถช่วยลดขนาดบางมากขึ้นโดยมีวงนับลงจาก 3 แทนการขึ้น
เดฟ

@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

คำอธิบาย

สิ่งนี้จะอ่านเนื้อหาเป็นสตริงจากนั้นใช้ regex '(?<="c.+e": ")[^"]+'เพื่อแยกชื่อประเทศ regex ใช้ look-behind ด้วย"c.+e"แทน"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

Python 3, 202 , 164 ไบต์

Python 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

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]

ขอบคุณ @Nick T และ @Value Ink


1
from urllib import*และใช้ในurlopenภายหลังประหยัด 1 ไบต์ นอกจากนี้คุณควรจะสามารถพิมพ์คำสั่งและวางไว้ด้านหลังลำไส้ใหญ่ช่วยให้คุณประหยัดจากการเยื้อง
หมึกมูลค่า

1
ถ้าคุณป้อนurlopenวัตถุให้list()ทำเช่นนั้น.readlines()ใช่ไหม
Nick T

3

JavaScript + jQuery, 114 100 ไบต์

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

สำหรับเหตุผลของคำขอ Cross Origin ต้องเรียกใช้จากmedalbot.comโดเมน (ที่มี jQuery)

ประวัติศาสตร์

  • -14 ไบต์ขอบคุณ @YetiCGN
  • -2 ไบต์ขอบคุณ Yay295

หรือเรียกใช้ chrome โดยไม่มีการรักษาความปลอดภัยเว็บ {chrome.exe - ปิดใช้งานการรักษาความปลอดภัยเว็บ}
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

Ruby, 97 79 + -rnet/http(11) = 90 ไบต์

ใช้การดัดแปลงรูปแบบ regex จากคำตอบ MATL ของ Luis Mendo ซึ่งได้รับการปรับให้เหมาะสมโดย @Jordan เนื่องจาก Ruby ไม่สนับสนุนปริมาณในการค้นหา

-18 ไบต์จาก @Jordan

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

คุณสามารถละเว้นได้.map(&:last)ทั้งหมด 12 ไบต์และละเว้นส่วนนำ/ใน/apiอีกหนึ่ง
จอร์แดน

ยิ่งไปกว่านั้น regex ที่สั้นลงซึ่งดูเหมือนว่าจะทำงานได้ดี:/"cou.+"(.+)"/
จอร์แดน

หรือ: /y_.+"(.+)"/.
จอร์แดน

@Jordan ไม่สนใจ/สาเหตุที่ทำให้เกิดข้อผิดพลาดในรุ่น Ruby ของฉัน หรืออาจเป็นเครือข่ายที่ฉันใช้อยู่ อะไรก็ตาม ฉันไปกับ regex แตกต่างกันเล็กน้อยกว่าที่คุณแนะนำ แต่ความยาวเท่ากัน
หมึกมูลค่า

น่าสนใจ 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 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, 205 139 124 116 111 109 ไบต์

ฉันแค่ต้องการใช้โอเปอเรเตอร์ยานอวกาศตัวใหม่สำหรับ 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

ประวัติศาสตร์

  • การใส่เครื่องหมายคำพูดและวงเล็บปีกกาที่จะทำให้เกิดข้อสังเกตเอาตัวแปร $ c สำหรับดัชนี country_name ขอบคุณ @manatwork สำหรับเคล็ดลับเหล่านี้เพื่อประหยัดอักขระได้มากขึ้น
  • ขอบคุณ @jeroen สำหรับการชี้ให้สั้นลงในขณะที่วนซ้ำยังเปลี่ยนเป็นการเข้าถึงวัตถุเพื่อไปจาก 124 เป็น 116
  • บันทึกอีก 5 ไบต์โดยการเรียก API ภายในลูป ได้รับแล้วมันใช้เวลานานขึ้นและขัดขวาง API แต่มันคือ Code Golf ต้องการ PHP 5.5 ในการทำงานเนื่องจากการยกเลิกการอ้างอิงอาเรย์
  • บันทึกอีก 2 ไบต์โดยการลบแท็กเปิดสั้น ๆ ตามคำตอบเมตานี้

ขอบคุณ! ฉันเพิ่งเห็นรายการอื่น ๆ เรียงลำดับและคิดว่าฉันพลาดอะไรบางอย่าง
YetiCGN

1
เหตุใดคุณจึงใส่ "country_name" ในตัวแปร และอย่างไรก็ตามเนื่องจากerror_reportingค่าเริ่มต้นของไม่แสดงประกาศคุณสามารถละเว้นเครื่องหมายคำพูดคู่ และ API ของ medalbot ดูเหมือนว่าจะทำงานโดยไม่มี www โดเมนย่อยด้วย echoแล้วคุณไม่จำเป็นต้องจัดฟันที่อยู่รอบ ๆ
จัดการ

ขอบคุณมัด! มันก็สาย ... ตัวแปร $ c เป็นของเหลือจากการปรับให้เหมาะสมก่อนหน้านี้ที่ฉันโยนทิ้งไปเมื่อฉันเปลี่ยนไปใช้ลูป for ฉันเดาว่าการเข้ารหัสที่สะอาด (ไม่ต้องแจ้งให้ทราบล่วงหน้า) ยังฝังลึกเกินไปดังนั้นฉันไม่ได้พิจารณาการเพิ่มประสิทธิภาพเหล่านี้ที่คุณชี้ให้เห็น ดังนั้นขอบคุณอีกครั้ง!
YetiCGN

แทนที่ foreach ด้วย forloop ต่อไปนี้: for(;$i<3;)echo$d[+$i++][country_name]." "ลดขนาดด้วยไบต์ที่ 5 ช่องว่างสุดท้ายคือการก้าวเข้าออก หรือเพียงชั่วขณะหนึ่งwhile($i<3)
Jeroen

1

BASH + w3m + core utils, 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

Python 2, 117 ไบต์

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

ยินดีต้อนรับสู่ PPCG! คุณสามารถบันทึกไม่กี่ไบต์โดยการลบช่องว่างระหว่างimportและ*และโดยการย้ายไปโดยตรงหลังจากลำไส้ใหญ่ในบรรทัดprint 2โดยทั่วไปเราใช้#s แทน**ก่อนและหลังสำหรับส่วนหัวของเรา
NoOne อยู่ที่นี่

1
โดยทั่วไปเราต้องการให้ผู้ส่งรวมไลบรารีบุคคลที่สามใด ๆ ที่จำเป็นในส่วนหัวคำตอบ เนื่องจากคำขอไม่ใช่โมดูลไลบรารีมาตรฐานภาษาของคำตอบนี้ควรเป็น "Python 2 + ร้องขอ"
Mego

1

Clojure 122 ไบต์

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

ไม่ใช้ไลบรารี JSON :) อ่านสตริงจาก URL แทนที่โคลอนด้วยสตริงว่างและ Evals สตริงซึ่งเป็นผลลัพธ์ในแผนที่ Clojure ใช้ 3 องค์ประกอบแรกและแผนที่ฟังก์ชั่นอย่างกระตือรือร้นซึ่งพิมพ์country_nameคุณสมบัติของแต่ละองค์ประกอบ


1

Java 8 386 384 459 ไบต์

บันทึก 2 ไบต์จาก @Easterly Irk

การส่งรหัสกอล์ฟครั้งแรกของฉันดังนั้นฉันแน่ใจว่ามีวิธีการบันทึกจำนวนมากไบต์ แต่แหมดี :)

มันใช้ Gson เพื่ออ่าน JSON

ต้องใช้:

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

รหัส Golfed:

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:

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รวบรวม
เดฟ

จำเป็นต้องเพิ่มคำสั่งการนำเข้าลงในจำนวนไบต์หรือไม่
yitzih

คุณคำนวณการนำเข้าอย่างไร
yitzih

ไม่ทราบว่ากฎที่แน่นอนสำหรับ Java คืออะไรเพราะฉันไม่ได้โพสต์ไว้ที่นี่มาก่อน แต่กฎปกติคือคุณต้องนับทุกอย่างที่จำเป็นเพื่อให้รหัสถูกต้อง (และจากการค้นหาคำแนะนำ Java อย่างรวดเร็ว หน้าฉันสามารถดูคำแนะนำต่าง ๆ เกี่ยวกับวิธีย่อรหัสการนำเข้าได้ดังนั้นฉันจึงคาดว่าจะต้องนับ) แต่แล้วอีกครั้งฉันก็พยายามหาคำตอบ C ของฉันที่จะชนะกับ Java ในคำถามนี้ดังนั้นฉันจึงลำเอียง: D
เดฟ

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

Kotlin (สคริปต์) , 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>หรือผ่าน IDEA เป็นไฟล์ * .kts

ตอนนี้ถ้าเราตั้งสมมติฐานอย่างมากเกี่ยวกับรูปแบบรวมถึงจำนวนบรรทัดเราสามารถตัดให้เป็น:

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 ที่ช่วยฉันตัดแต่งสองสามสิบไบต์!


3 symbols shorter than Clojure and JS? I'll take that.
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"])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.