Resposta à votação

18

Esta pergunta é inspirada no fato de eu adorar ver perguntas com igual número de votos e respostas ...


Então, aqui está um desafio simples de para todos vocês:

Desafio:

Dado o codegolf.stackexchangeID da pergunta, mostre a razão entre os votos da pergunta e o número de respostas (por exemplo votes/answers).

Específicos:

  • Você pode acessar a Internet, mas pode acessar apenas stackexchange.come seus vários subdomínios. Você não pode usar encurtadores de URL.

  • Você pode receber e dar saída em qualquer formato padrão.

  • Você deve exibir a proporção como um número decimal na base 10, com pelo menos 4 dígitos {precisos} após o decimal (zeros podem ser truncados).

  • Se a pergunta não for respondida, seu programa poderá produzir um comportamento indefinido.

  • Você deve usar o scoreda pergunta como contagem de votos, veja aqui .

Isso é , menos bytes em cada idioma ganha para esse idioma, menos bytes em geral ganha em geral.

Aqui está um exemplo de programa em Python 3 + requests:

import requests
import json

id = input("id> ")
url = "https://api.stackexchange.com/2.2/questions/" + id + "?site=codegolf"
content = requests.get(url).text
question = json.loads(content)["items"][0]

print(float(question["score"]) / question["answer_count"])
Phoenix socrático
fonte
A relação precisa de pelo menos 4 dígitos decimais após o ponto decinal, mesmo que sejam zero? Por exemplo 41/4 = 10,25 ou 10,2500
pizzapants184
@ pizzapants184 10,25 is fine #
Socratic Phoenix
E se o desafio não for respondido? Então a proporção seria infinita?
Sr. Xcoder
Você quer dizer pontuação ou total de votos na questão?
AdmBorkBork 18/09
@ Mr.Xcoder nesse caso, um comportamento indefinido é bom
socrático Phoenix

Respostas:

10

JavaScript (ES6), 103 102 bytes

Precisa ser executado a partir do nível raiz de api.stackexchange.com. Retorna um Promiseobjeto que contém o resultado.

n=>fetch(`questions/${n}?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)

Se a permissão de execução a partir de um caminho específico for permitida , isso se tornará 92 90 bytes.

n=>fetch(n+`?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)

Tente

URL completo adicionado para permitir que ele funcione aqui.

f=
n=>fetch(`//api.stackexchange.com/questions/${n}?site=codegolf`).then(r=>r.json()).then(({items:[j]})=>j.score/j.answer_count)
onchange=_=>f(+i.value).then(t=>o.innerText=t)
<input id=i type=number><pre id=o>

Shaggy
fonte
7
Substitua i=>(j=i.items[0])por ({items:[j]})=>jpara salvar um byte.
kamoroso94
Bom truque, obrigado, @ kamoroso94. Vou ter que lembrar disso.
Shaggy
8

Stratos , 40 bytes

-4 bytes graças a Shaggy

f"¹⁵s/%²"r"⁷s"@0
{s"answer_⁰"
⁰s"score"/

Tente!

Stratos é especialista em perguntas sobre .

Explicação:

O código descompacta para o seguinte:

f"api.stackexchange.com/questions/%?site=codegolf"r"items"@0
{s"answer_count"
⁰s"score"/

A partir da primeira linha, Stratos avalia as díades da direita para a esquerda.

f"api.stackexchange.com/questions/%?site=codegolf"r"items"@0significa "avaliar a díade @com o argumento da esquerda f"api.stackexchange.com/questions/%?site=codegolf"r"items"e o argumento da direita 0. @obtém o enésimo elemento de uma matriz JSON.

Para avaliar f"api.stackexchange.com/questions/%?site=codegolf"r"items", avaliaremos a díade rcom o argumento da esquerda f"api.stackexchange.com/questions/%?site=codegolf"e o argumento da direita "items". robtém a matriz JSON com o nome especificado.

Em seguida, precisaremos avaliar f"api.stackexchange.com/questions/%?site=codegolf". Primeiro, %é substituído pela entrada. fsignifica "obter o conteúdo deste URL".

Agora, podemos passar para a segunda linha. A nova linha significa "adicionar o que avaliamos à lista de argumentos implícitos"

Em seguida, avaliamos s(obter string no objeto JSON com um determinado nome) com {e "answer_count". {pega um elemento da pilha de argumentos implícitos, retorna e os adiciona de volta à pilha.

Em seguida, adicionamos a saída disso à pilha de argumentos implícitos.

Para avaliar ⁰s"score"/, estamos aplicando a díade /(divisão) ⁰s"score"e um elemento da pilha de argumentos implícitos.

Para avaliar ⁰s"score", estamos obtendo a string "score"do objeto JSON do 0º elemento na pilha de argumentos implícitos.

Agora, a saída de /é impressa e o programa termina.

Okx
fonte
Salve 4 bytes descartando a versão da API ( 2.2/).
Shaggy
1
@ Shaggy Não sabia que a versão da API não era necessária, obrigado. Não riscando 44: P
Okx
5

R + jsonlite , 111 bytes

function(n,x=jsonlite::fromJSON(sprintf('http://api.stackexchange.com/questions/%s?site=codegolf',n))$i)x$s/x$a

Link R-violino

O jsonlite é uma boa biblioteca de conversão JSON <-> R que funciona muito bem. Eu não estava disposto a jogar um analisador JSON para R ...

Giuseppe
fonte
Você pode salvar um byte usando o httpprotocolo Além disso, acho 142729que não deve ser codificado lá?
Shaggy
@ Chamada boa e desagradável, obrigado. Copiei e colei rápido demais.
Giuseppe
4

T-SQL, 64 54 bytes

É raro o SQL vencer (a maioria) de outros idiomas! Em vez do URL da API, fui diretamente ao Stack Exchange Data Explorer :

SELECT 1.0*Score/AnswerCount FROM Posts WHERE Id=##i##

O ##i##SQL não é padrão, esse é o formato do Stack Exchange para solicitar entrada.

Observe que a fonte do explorador de dados é atualizada apenas todas as noites, portanto, os valores não são atuais.

Irá gerar um erro de divisão por zero em perguntas sem respostas.

Editar : salvou 10 bytes multiplicando por 1,0 em vez de um explícito CONVERTpara FLOAT.

BradC
fonte
pode derrotar os outros, mas não todos :)
Okx
Ah, maaan, eu tinha outra solução, mas estava na escola e nunca acabei postando ... A minha resposta é muito parecida com a sua? Devo excluir o meu?
totallyhuman
@icrieverytim Ha, sim, parece a mesma consulta, embora eu tenha editado a minha para economizar mais 10 bytes.
BradC 18/09/19
@BradC Eu editei minha resposta em uma resposta do Mathematica lol.
totallyhuman
3

PowerShell , 130 bytes

($a=(ConvertFrom-Json(iwr("http://api.stackexchange.com/questions/"+$args+"?site=codegolf")).content).items).score/$a.answer_count

Executa um Invoke- Web Request contra a URL, obtém o .contentmesmo, faz ConvertFrom-Jsonparte desse conteúdo e obtém o .itemsobjeto JSON. Armazena isso $ae extrai o .scorecomo numerador. O denominador é o .answer_count. Esse valor é deixado no pipeline e a saída é implícita.

Se a pergunta não for respondida, isso deve gerar um erro "Dividir por zero".

AdmBorkBork
fonte
3

Japt , 83 82 bytes

Queria tentar dar uma olhada para ver como isso funcionaria, já que Japt não pode realizá-lo nativamente. Essencialmente, tudo o que isso está fazendo é evaluma versão compactada da minha solução JS . Como Japt é JS, podemos exigir que isso seja executado a partir do nível raiz api.stackexchange.come também retornar um Promiseobjeto contendo o resultado.

Ox`fet®("quÀËs/{U}?ÐÒ=¬¸golf").È(r=>r.js()).È(i=>(j=i.ems[0]).sÖ/j.s³r_Öt)
  • Veja isto
  • Experimente - os bytes extras nesta versão são contabilizados pela inclusão de //api.stackexchange.com/no URL e console.logpara que você possa realmente vê-lo funcionando
Shaggy
fonte
1
o0 Por que você transformou o código em um link? Ele ainda mexe com a exibição de contagem de bytes do userscript lol. i.imgur.com/SO2zgAy.png
totallyhuman
2

Mathematica, 124 bytes

N@("score"/.(u="items"/.Import["http://api.stackexchange.com/questions/"<>#<>"?site=codegolf","JSON"]))/("answer_count"/.u)&

O Mathematica tem um tipo de dados chamado Rulee me confunde muito. : P

totalmente humano
fonte
1

Solicitações Python 3 +, 149 bytes

-1 byte graças ao Sr. Xcoder.

from requests import*
u=get('http://api.stackexchange.com/questions/%s?site=codegolf'%input()).json()['items'][0]
print(u['score']/u['answer_count'])
totalmente humano
fonte
O link é para o Python 2. Btw, gera um erro no Python 2 e no Python 3 (no TIO).
Sem acesso à Internet no OIO grita. Eu apenas usei o TIO para a formatação de respostas lol.
totallyhuman
Eu acho que (por enquanto) httpé suficiente.
Sr. Xcoder
125 bytes
LyricLy
0

PHP, 167 bytes

<?$f=json_decode(gzdecode(file_get_contents('https://api.stackexchange.com/2.2/questions/'.$argv[1].'?site=codegolf')))->items[0];echo $f->score/$f->answer_count;

Rachadura turbo-rápida nisso. Salve como um arquivo e execute no terminal da seguinte maneira:

php -f file.php 143083

Pode ser uma maneira de reduzir isso.

Orfeu
fonte