Швидкий гольф: Золотий лідер


18

Виклик

Використовуючи дані з API тут , Виведе імена трьох країн з найбільшим кількістю золотих олімпійських медалей на 2016 Ріо Олімпійських ігор (тобто перший елемент повертається списку).

Наприклад, на момент публікації (18:23 UTC + 1, понеділок, 15 серпня) у США, Великобританії та Китаї найбільше золотих медалей, тож результат:

United States
Great Britain
China

Назви країн повинні бути розділені новими рядками, і у вас можуть бути провідні або зворотні нові рядки.

Після закінчення Олімпіади програма не повинна працювати так, як очікувалося.

Скорочувачі URL-адрес заборонені, але допускається розбір бібліотек JSON.

Це код гольфу, тому виграє найкоротший код у байтах.

Я намагатимуся тут отримати виклик з тематикою на Олімпіаду

Таблиця лідерів


6
Ви б сказали, що це ... міні-гольф ?
Деусови

1
Аварія @Deusovi Ba-dum
Beta Decay

2
Я дуже хочу, щоб хтось опублікував рішення Java, щоб я міг бачити, чи моє це рішення C…
Дейв

3
"Великобританія ... так вихід ... Великобританія"
трихоплакс

1
@Dave NI Спортсмени можуть вибрати або представляти Team GB або Team Ireland. Якщо для спортсменів NI потрібно було приєднатися до команди GB, то це була б команда Великобританії.
СГР

Відповіді:


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 про те, що API medalbot, здається, працює без www. субдомен теж .

2
Змініть, cut -d '"'щоб cut -d\"зберегти два байти. Якщо ви використовуєте w3mзамість curl -sвас, ви можете заощадити ще 4.
Джо

ви можете змінити _n на m
ВИ

@YOU: Не дуже, тому що вона поверне більше рядків, ніж очікувалося, тобто "id": "германія", id ":"
Колумбія

якщо вони не можуть бути від 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\nчастину HTTP-запиту. Він також опускає Acceptзаголовок, оскільки medalbot.com, здається, ні в якому разі не використовує стиснення, і пропускає пробіл після Host:(знову ж, сервер здається, що з цим все гаразд). Не здається, що все-таки можна видалити все інше.


Як тільки олімпійські ігри закінчуються, найбільш вірогідною поведінкою для цієї програми є сегментація, намагаючись прочитати місце пам'яті 9. Якщо тільки злий хакер не захопить домен, і в цьому випадку найімовірніша поведінка полягає в тому, щоб він встановив деякий байт 0 на адресу інформаційні структури, що, мабуть, не надто небезпечно. Але хто може розказати з цими злими хакерами?


1
Так, це шкідник із тими хакерами. Добре, що ми знаходимось на веб-сайті, на якому хакери будь-якого типу навряд чи колись з’являться ...
перестали повертати проти годинника

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 у спеціальний масив об’єктів. Ми інкапсулюємо цей масив об'єктів у пароні, беремо перші три елементи [0..2]і беремо .country_nameкожен з них.

Потрібно принаймні 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.
Нік Т

@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 байта
ММКФ

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] Покращена заміна регулярних виразів
  • -9 [16-08-16] Видалено java.netімпорт

Eep. Мені потрібно зберегти кілька байт…
Дейв

Я наздоганяю! Тепер лише 15 байт позаду!
Дейв

Ну, я був попереду хоча б на кілька годин. Він працює проти мене, але ви , ймовірно , можна заощадити ще кілька байт, маючи розраховувати петлі вниз від 3 , а не вгору.
Дейв

@Dave Я намагався просто мати умову булевого розриву, iале Java не перетворює булеву в int або візу навпаки, якщо це було те, що ти думав. Крім того, ви мене дуже нервували з цієї останньої редакції.
нелінійний фрукт

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"замість того, "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 байт.

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 байт

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()?
Нік Т

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

З-за крос-запитів запитів на походження їх потрібно запустити з medalbot.comдомену (з jQuery).

Історія

  • -14 байт завдяки @YetiCGN
  • -2 байти завдяки Yay295

Або запустіть хром без веб-безпеки {chrome.exe
відключити-

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 байт

Використовує модифікацію схеми регулярних виразів з відповіді MATL Луїса Мендо , додатково оптимізованої @Jordan, оскільки Ruby не підтримує кількісні показники у відсталі.

-18 байт від @Jordan.

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

Ви можете опустити .map(&:last)повністю на 12 байт, і опускаєте провідні /в /apiпротягом ще одного.
Йорданія

Крім того, коротший регулярний вираз, який, здається, працює добре:/"cou.+"(.+)"/
Йордан

Або: /y_.+"(.+)"/.
Йорданія

@ Джордан, опускаючи провідні, /призводить до помилок у моїй версії Ruby. Або це може бути мережа, в якій я ввімкнувся? Що б там не було. Я пішов з дещо іншим регулярним виразом, ніж той, який ви запропонували, але такої ж довжини.
Значення чорнила

Цікаво. FWIW я використовую 2.3.1.
Йорданія

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імпортує файл у вигляді сирого JSON-файлу. [[;;3,2]]займає рядки 1-3, другий запис (назва країни).


Import["http://www.medalbot.com/api/v1/medals","RawJSON"][[;;3,2]]
алефальфа

2

PHP, 205 139 124 116 111 109 байт

Я просто хотів один раз використати новий оператор космічного корабля для PHP 7 ( EDIT : Це зайве, оскільки сортування не потрібно):

<?$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 доставляє вже відсортовані дані за золотою кількістю рахунків (як здавалося б), ми можемо додатково скоротити це:

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

Примітка: Розрив рядка в рядку навмисно зберігає байт від \ n

Історія

  • Пропущено кілька лапок і дужок, які будуть кидати повідомлення, видалено змінну $ c для індексу країни-імені. Завдяки @manatwork за ці поради, щоб зберегти ще більше символів.
  • Завдяки @jeroen за вказівку на коротший цикл, а також перейшов на доступ до об'єктів, щоб перейти від 124 до 116
  • Збережено ще 5 байт викликом API в циклі. Звичайно, це займає більше часу і клобує API, але це Code Golf. Потрібно, щоб PHP 5.5 працював через перенаправлення масиву.
  • Збережено ще 2 байти, видаливши короткий відкритий тег, відповідно до цього метавідповіді

Спасибі! Я просто побачив, як усі інші записи сортують і подумав, що я щось пропустив.
YetiCGN

1
Чому ви ставите "ім'я країни" у змінну? І в будь-якому випадку, оскільки error_reportingзначення за замовчуванням не відображає повідомлень, ви можете опустити подвійні лапки. І API Med medalbot, здається, працює без www. субдомен теж. Тоді вам не потрібні брекети навколо echo.
манатурка

Дякую купу! Ну, було пізно ... Змінна $ c - це залишок від попередньої оптимізації, яку я викинув, коли перейшов на цикл for. Я думаю, чисте кодування (без повідомлення) все ще надто глибоко вкорінене, тому я навіть не враховую ці оптимізації, на які ви вказали. Тож ще раз дякую!
YetiCGN

замінивши foreach наступним forloop: for(;$i<3;)echo$d[+$i++][country_name]." "зменшує його на 5 байт. Останній простір - це вхідний курс. Або просто на певний час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

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 замість **до та після своїх заголовків.
NoOneIsHere

1
Зазвичай ми вимагаємо від відправників включити будь-які сторонні бібліотеки, необхідні в заголовку відповідей. Оскільки запити не є стандартним модулем бібліотеки, мовою цієї відповіді має бути "Python 2 + запити".
Мего

1

Clojure, 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

Java 8 386 384 459 байт

2 байти збережено від @Easterly Irk

Моє перше подання коду для гольфу, тому я впевнений, що є спосіб зберегти багато байтів, але так добре :)

Він використовує 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;}

Код без вогню:

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 = новий 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")

Невелике покращення щодо відповіді користувача5957401, не потрібне сортування та скорочення назви бібліотеки. Також моя перша спроба гольфу;)


Ви можете, як і в усіх мовах, опустити "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>або через 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])}

Дякую людям з Котлінської команди, яка допомогла мені обрізати пару десятків байтів!


На 3 символи коротше Clojure та JS? Я візьму це.
CypherAJ

0

Javascript 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"])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.