Quick Golf: O Líder do Ouro

18

Desafio

Usando os dados da API aqui , produza os nomes dos três países com mais medalhas de ouro olímpicas nos Jogos Olímpicos do Rio 2016 (ou seja, o primeiro elemento da lista retornada).

Por exemplo, no momento da postagem (18:23 UTC + 1, segunda-feira, 15 de agosto), os EUA, o Reino Unido e a China têm mais medalhas de ouro; portanto, a saída seria:

United States
Great Britain
China

Os nomes dos países devem ser separados por novas linhas e você pode ter uma nova ou à direita.

Depois que as Olimpíadas terminam, o programa não precisa funcionar como o esperado.

Os encurtadores de URL não são permitidos, mas as bibliotecas de análise JSON são permitidas.

Este é o código golf, portanto o código mais curto em bytes vence.

Vou continuar tentando obter um desafio temático das Olimpíadas aqui

Entre os melhores

Beta Decay
fonte
6
Você diria que isso é um ... mini-golfe ?
Deusovi 15/08/16
1
@Deusovi Ba-dum crash
Decay Beta
2
Eu realmente quero que alguém postar uma solução Java para que eu possa ver se a minha solução C bate-lo ...
Dave
3
"O Reino Unido ... então
produziu
1
Os atletas da @Dave NI podem optar por representar o Team GB ou o Team Ireland. Se os atletas da NI precisassem se juntar ao Team GB, seria o Team UK.
SGR

Respostas:

12

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

w3m medalbot.com/api/v1/medals|grep -m3 m|cut -d\" -f4
  • 6 bytes a menos, graças às sugestões de @ Joe.
  • 1 byte a menos, graças a @YOU.
  • 4 bytes menos graças a @manatwork sugestão de que a API medalbot parece funcionar sem www. subdomínio também .
Master_ex
fonte
2
Mude cut -d '"'para cut -d\"para salvar dois bytes. Se você usar em w3mvez de, curl -spoderá economizar mais 4.
Joe
você pode alterar _n para m
YOU
@YOU: Na verdade não, porque dessa forma ele vai retornar mais linhas do que o esperado, ou seja, "id": "Alemanha", id ": 'colombia' etc.
Master_ex
se não puderem ser de 1 a 3, tudo bem, você tem -m3 de guarda.
VOCÊ
1
@YOU: Eu acho que isso é verdade para a pontuação atual e parece que será bom para as Olimpíadas de 2016 (exceto se elas mudarem dos Estados Unidos para os Estados Unidos da América: P). Eu vou mudar isso.
Master_ex 16/08/19
13

C (+ soquetes), 433 429 280 276 270 259 bytes

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

Acontece que C não é bom em baixar recursos da Internet e analisá-los como JSON. Quem sabia?

Esse código é (naturalmente) super flexível na verificação de erros, então acho que se o medalbot.com quisesse enviar dados maliciosos, seria capaz de acionar estouros de buffer, etc. Além disso, o código mais recente espera certos valores para as constantes (por exemplo AF_INET = 2) irá provavelmente ser o caso em todos os lugares, mas não é garantido.

Aqui está o código original que não é tão frágil (mas ainda não é muito robusto ou seguro):

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

Demolir:

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

Isso não é muito agradável para o servidor, pois não enviamos Connection: close\r\ncomo parte da solicitação HTTP. Ele também omite o Acceptcabeçalho, pois o medalbot.com não parece usar compressão em nenhum caso e perde o espaço depois Host:(novamente, o servidor parece estar bem com isso). Parece que nada mais pode ser removido.


Quando os jogos olímpicos terminam, o comportamento mais provável para este programa é segfault ao tentar ler o local da memória 9. A menos que um hacker maligno domine o domínio, nesse caso, o comportamento mais provável é que ele defina algum byte como 0 no endereço estruturas de informação, o que provavelmente não é realmente muito perigoso. Mas quem pode dizer com esses hackers do mal?

Dave
fonte
1
Sim, é uma praga com esses hackers. Ainda bem que estamos em um site no qual os hackers de qualquer tipo é improvável que alguma vez transformar-se ...
deixou de vez counterclockwis
1
Esse foi o grande salto!
NonlinearFruit
2
@NonlinearFruit sim, é incrível quantos caracteres podem ser salvos quando você joga a precaução ao vento e usa números definidos pela implementação diretamente no código! Isso se tornou um exercício de "qual é a maneira mais louca, perigosa e mais provável de quebrar - mas atualmente funciona - a maneira de baixar texto em C?"
Dave
Vamos apenas torcer para que as pequenas mesas de Bobby não tenham parentes competindo este ano.
GuitarPicker 17/08/16
A legibilidade também é uma das primeiras vítimas do bacalhau. . .
NonlinearFruit
12

PowerShell v4 +, 88 69 bytes

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

Usa iwr(o alias para Invoke-WebRequest) para pegar a API. Nós alimentamos isso como o parâmetro de entrada para o ConvertFrom-Jsoninterno que puxa o texto JSON para uma matriz de objetos personalizados. Encapsulamos essa matriz de objetos em parênteses, pegamos os três primeiros elementos [0..2]e pegamos o .country_namede cada um deles.

Requer pelo menos v4 + para as propriedades de vários objetos; caso contrário, precisaríamos usar algo parecido |Select "country_name". Requer pelo menos v3 + para o ConvertFrom-Jsonbuilt-in.

PS C:\Tools\Scripts\golfing> .\olympics-gold-leader.ps1
United States
Great Britain
China
AdmBorkBork
fonte
Você pode soltar http://www.e o PS não se importa com http://o site www.. Meu PS (5.1.14393) também nem parece se importar com o .content.
Nick T
@ NickT Obrigado pelos campos de golfe. Eu não sabia que ConvertFrom-Jsonisso não precisava explicitamente apenas da .contentparte da solicitação da Web, mas também funciona na minha configuração.
AdmBorkBork 16/08
6

R, 98, 112 , 108 bytes

golfed 4 graças a @miff

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

A primeira linha importa dados usando uma biblioteca JSON. A segunda linha pega os nomes de países relevantes. Classifica os países por medalhas de ouro em ordem crescente, reverte os índices e recebe os 3 primeiros, imprimindo-os.

user5957401
fonte
1
Eu acho que você pode substituir rev(order(a$g))com order(-a$g)a salvar 4 bytes
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`))

Devido a um problema de segurança do navegador , esse código deve ser executado medalbot.com. No entanto, ele não tira proveito disso e pode ser executado em outro lugar. Observe também que inseri o \ncaractere, mas estou contando apenas como um, porque eu poderia substituí-lo por um

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

Isso seria muito mais curto se a API retornasse os dados de uma só vez, mas, como retorna em duas seções, devo concatenar as partes e combiná-las, e depois analisá-las.

Node.js (ES6) + solicitação, 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`))

Melhor, mas ainda não tão bom quanto a versão do navegador. Obrigado buscar API! Request é uma biblioteca cliente HTTP popular usada para simplificar solicitações, e você pode ver isso entrar em vigor aqui.

MayorMonty
fonte
Qual destes funciona em qualquer navegador? Você pode colocar os mais curtos entre os que estão no topo da sua resposta (para a tabela de líderes)
Decay Beta
A primeira delas funciona nos navegadores mais modernos e também é a mais curta. Os outros dois estão no Node.js, uma maneira de escrever JavaScript no servidor (além de outras coisas).
MayorMonty 15/08/19
@ βετѧΛєҫαγ tomar nota de que ele não funciona em qualquer versão do IE ou Safari
MayorMonty
Entendo, eu estava ficando com o problema do CORS desligado
Beta Decay
4

bash + w3m + jq ,83 59 bytes

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

Graças à Jordânia por três bytes.

Obrigado a você por mais 24 bytes! Acontece que os dados estão classificados. Uau. : D

Lynn
fonte
1
Você pode omitir .|e indexar o resultado sort_bydiretamente e salvar outro byte usando em [:3][]vez de [0,1,2]. Todos juntos: sort_by(-.gold_count)[:3][].country_name.
Jordan
w3m medalbot.com/api/v1/medals|jq -r '.[:3][].country_name'
VOCÊ
4

Java 8, 261 258 bytes

Isso usa um lambda para salvar alguns bytes e a biblioteca de rede para obter a página da web. Fora isso, é apenas 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){}}

Aqui está o meu (antigo) POJO para testes (e golfe):

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

Atualizar

  • -3 declaração de impressão [16-08-17] Mover em loop
  • -5 [16-08-16] Substituição de regex aprimorada
  • -9 [16-08-16] java.netImportação removida
NonlinearFruit
fonte
Eep. Eu preciso para salvar alguns bytes ...
Dave
Estou alcançando! Agora, apenas 15 bytes atrás!
Dave
Bem, fiquei à frente por algumas horas, pelo menos. Funciona contra mim, mas você provavelmente pode economizar mais alguns bytes fazendo a contagem decrescente de loop de 3 em vez de para cima.
Dave
@ Dave Tentei ter a condição de quebra booleana, imas o Java não converte booleano em int ou vice-versa, se era isso que você estava pensando. Você também me deixou muito nervoso com a última edição.
NonlinearFruit
3

MATL , 67 bytes

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

Isso não funciona online porque a função Xi( urlread) não é permitida.

Exemplo de execução:

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

Explicação

Isso lê o conteúdo como uma sequência e aplica a regex '(?<="c.+e": ")[^"]+'para extrair nomes de países. O regex usa look-behind com em "c.+e"vez de "country_name"reduzir o comprimento do código.

'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
fonte
3

Python 3, 202 , 164 bytes.

O Python 3 não faz tratamento de URL / json curto. : /
Não percebeu que a API já classifica por contagem de ouro

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

Obrigado @Nick T e @Value Ink

Joe
fonte
1
from urllib import*e usar apenas urlopenmais tarde economiza 1 byte. Além disso, você deve poder pegar a declaração de impressão e colocá-la logo após os dois pontos, poupando-o do recuo.
Value Ink
1
Se você alimentar o urlopenobjeto list(), isso faz o mesmo que .readlines()?
Nick T
3

JavaScript + jQuery, 114 100 bytes

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

Por motivos de solicitações de origem cruzada, isso deve ser executado no medalbot.comdomínio (com jQuery).

História

  • -14 bytes graças a @YetiCGN
  • -2 bytes graças a Yay295
Ninguém está aqui
fonte
Ou execute o chrome sem a segurança da web {chrome.exe --disable-web-security}
2b77bee6-5445-4c77-b1eb-4df3e5
1
salvar 2 bytes$.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 bytes

Usa uma modificação do padrão regex da resposta MATL de Luis Mendo , otimizada ainda mais pelo @Jordan, já que Ruby não suporta quantificadores em lookbehinds.

-18 bytes de @Jordan.

puts Net::HTTP.get("www.medalbot.com","/api/v1/medals").scan(/"c.+"(.+)"/)[0,3]
Value Ink
fonte
Você pode omitir .map(&:last)inteiramente para 12 bytes, e omita o /em /apipara mais um.
Jordan
Além disso, um regex mais curto que parece funcionar bem:/"cou.+"(.+)"/
Jordan
Ou: /y_.+"(.+)"/.
Jordan
@ Jordânia omitir os principais /causa erros na minha versão do Ruby. Ou pode ser a rede em que estou? Tanto faz. Fui com um regex ligeiramente diferente do que você sugeriu, mas com o mesmo comprimento.
Valor Ink
Interessante. FWIW eu estou usando 2.3.1.
Jordan
2

PowerShell, 60

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

A mesma ideia básica do TimmyD (não vi a resposta deles antes de eu postar), mas um pouco mais curta :-)

Joey
fonte
1
Como diabos essa |% c*análise funciona? Quero dizer, tentei, mas essa é uma sintaxe estranha (até destaca no meu ISE como um erro).
AdmBorkBork 16/08
1
@TimmyD: ForEach-Object tem um conjunto de parâmetros que se expande uma única propriedade, ou chama um método com argumentos: ForEach-Object [-MemberName] <String>. Os -MemberNamesuportes de parâmetros wildcards, portanto, neste caso ele se expande o único membro correspondente que curinga: country_name. Salva também alguns personagens ;-) #
Joey
2

Mathematica 96 66 bytes

O @alephalpha encontrou uma maneira de trabalhar diretamente a partir do arquivo (sem salvá-lo), economizando 30 bytes!

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

Importimporta o arquivo como um arquivo JSON bruto. [[;;3,2]]leva as linhas 1-3, segunda entrada (nome do país).

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

PHP, 205 139 124 116 111 109 bytes

Eu só queria usar o novo operador de nave espacial para o PHP 7 uma vez ( EDIT : É supérfluo, pois a classificação não é necessária):

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

Se omitirmos a etapa de classificação desnecessária e assumirmos que a API fornece os dados já classificados por gold_count descendente (como parece), podemos abreviá-lo ainda mais:

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

Nota: A quebra de linha na string é intencional para salvar um byte de \ n

História

  • Omitiram algumas aspas e chaves que lançariam avisos, removeu a variável $ c para o índice country_name. Obrigado a @manatwork por essas dicas para salvar ainda mais personagens.
  • Obrigado a @jeroen por apontar o loop while mais curto, também mudou para o acesso a objetos para ir de 124 para 116
  • Economizou mais 5 bytes chamando a API dentro do loop. É verdade que leva mais tempo e prejudica a API, mas é o Code Golf. Precisa do PHP 5.5 para funcionar devido à desreferenciação de array.
  • Economizou mais 2 bytes removendo a pequena etiqueta aberta, de acordo com esta meta resposta
YetiCGN
fonte
Obrigado! Acabei de ver todas as outras entradas classificando e pensei que tinha perdido alguma coisa.
precisa saber é o seguinte
1
Por que você está colocando "country_name" em uma variável? De qualquer forma, como error_reportingo valor padrão do não exibe avisos, você pode omitir as aspas duplas. E a API medalbot parece funcionar sem www. subdomínio também. Então você não precisa dos aparelhos ao redor echo.
manatwork
Muitíssimo obrigado! Bem, já era tarde ... A variável $ c é uma sobra de uma otimização anterior que joguei fora quando mudei para o loop for. Acho que a codificação limpa (sem aviso prévio) ainda está profundamente arraigada, por isso nem considero essas otimizações que você apontou. Então, obrigado novamente!
YetiCGN
substituindo o foreach pelo seguinte forloop: for(;$i<3;)echo$d[+$i++][country_name]." "reduz-o em 5 bytes. O último espaço é um enter offcourse. Ou apenas como um loop whilewhile($i<3)
Jeroen
1

Utilitários BASH + w3m + core, 70 bytes

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

Parece que a saída já está classificada. Só precisa jogar fora todo o texto extra.

Joe
fonte
1

CJam (57 bytes)

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

A demonstração on-line não está disponível porque busca conteúdo da web. Isso engana não analisando o JSON, mas assumindo que a estrutura não será alterada. (Mas o mesmo acontece com a maioria das respostas existentes, de maneiras diferentes).

Peter Taylor
fonte
1

Python 2, 117 bytes

from requests import *
for x in get('http://www.medalbot.com/api/v1/medals').json()[:3]:
    print(x['country_name'])
sethascope
fonte
Bem-vindo ao PPCG! Você pode salvar alguns bytes removendo o espaço entre importe *e movendo o printpara diretamente após os dois pontos na linha 2. Geralmente usamos #s em vez de **antes e depois para nossos cabeçalhos.
NoOneIsHere
1
Normalmente, exigimos que os remetentes incluam bibliotecas de terceiros necessárias no cabeçalho da resposta. Como os pedidos não são um módulo de biblioteca padrão, a linguagem da resposta deve ser "Pedidos do Python 2 +".
Mego
1

Clojure, 122 bytes

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

Nenhuma biblioteca JSON usada :). Lê a string do URL, substitui dois pontos por string vazia e avalia a string que resulta no mapa de Clojure. Pega os 3 primeiros elementos e mapeia a função que imprime a country_namepropriedade de cada elemento.

cliffroot
fonte
1

Java 8 386 384 459 bytes

2 bytes salvos do @Easterly Irk

Meu primeiro envio de código de golfe, então tenho certeza de que há uma maneira de economizar muitos bytes, mas tudo bem :)

Ele usa o Gson para ler o JSON

Requer:

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

Código de golfe:

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

Código 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;
}
yitzih
fonte
Você pode remover o espaço em "g = new Gson ()"?
Rɪᴋᴇʀ
2
Espere, isso não precisa de alguns imports para compilar?
Dave
As instruções de importação precisam ser adicionadas à contagem de bytes?
yitzih
como você calcula as importações?
yitzih
Não sei quais são as regras exatas para Java, já que eu não publiquei nenhuma aqui antes, mas a regra usual é que você precise contar tudo o que é necessário para tornar o código válido (e procurar rapidamente as dicas sobre Java) Na página, vejo várias sugestões sobre como minimizar o código de importação, então acho que deve ser contado). Mas, novamente, eu também estou tentando obter minha resposta C para vencer o Java nesta questão, por isso sou bastante tendenciosa: D
Dave
1

R, 97 bytes 95

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

Pouco aprimoramento em relação à resposta do usuário5957401, nenhuma classificação necessária e nome mais curto da biblioteca. Também a minha primeira tentativa de golfe;)

topol817
fonte
Você pode, como em qualquer idioma, omitir o "www". parte do domínio e salve mais 4 bytes se sua biblioteca seguir o redirecionamento resultante.
precisa saber é o seguinte
1

Kotlin (Script) , 125 121 119 bytes

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

Executável com kotlinc -script <filename>ou através da IDEA como arquivo * .kts.

agora, se fizermos uma suposição MUITO grande sobre o formato, incluindo o número de linhas, podemos apará-lo para:

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

ou mesmo

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

Agradeço ao pessoal da equipe Kotlin slack por me ajudar a cortar algumas dezenas de bytes!

CypherAJ
fonte
3 símbolos mais curtos que Clojure e JS? Eu atendo.
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"])
Dylan Meeus
fonte