Contador de votos da troca de pilhas

40

Escreva um programa / função que retorne a contagem de votos de sua própria resposta do Stack Exchange no momento de sua execução.

  • Seu programa / função pode acessar esta página ( codegolf.stackexchange.com/questions/82609 ) fora da Internet, no entanto:
  • Seu programa / função pode não aceitar nenhuma entrada do usuário e
  • O uso de encurtadores de URL não é permitido
  • Seu programa / função pode usar apenas sua própria fonte como um ponto de referência para sua contagem de votos (por exemplo: nenhuma sequência de texto de referência na sua resposta contida, mas não na sua própria fonte)
  • Seu programa / função deve gerar sua própria contagem de votos e apenas sua própria contagem de votos (por exemplo: não retornar todas as contagens de votos nesta página)

Este é o código-golfe, o código mais curto vence.

Dendrobium
fonte
perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'parece que deve funcionar, mas não. Mas talvez alguém possa usar isso.
msh210
7
Para todos os outros que estão tentando e falhando em usar a API: ela serve a resposta codificada por gzip, mesmo que o cliente não a suporte.
Dennis
13
"Seu programa / função pode usar apenas sua própria fonte como ponto de referência para sua contagem de votos" É um pouco confuso. Isso significa que as respostas devem tentar se identificar apenas usando o conhecimento de seu próprio código, e não através de algo como um ID de postagem? Não acho que essa regra seja boa, pois pode ser violada por qualquer pessoa que poste uma nova resposta.
FryAmTheEggman
@FryAmTheEggman Eu pensei um pouco em quebrar as respostas de outras pessoas, e até pensei em fazer disso um KOTH, onde sua fonte tenta minar outra resposta, embora no final isso parecesse estar pressionando o formato mais do que eu queria ... Adicionei o using its own sourcebit para impedir que os usuários configurem a página para facilitar a localização sem contribuir para a contagem de bytes, caso a resposta não use o método de identificação de postagem.
Dendrobium
2
Tudo bem, a redação é um pouco estranha. Eu recomendaria, em vez de permitir determinado comportamento dessa maneira, banir diretamente o uso de quaisquer serviços da Web além daqueles fornecidos pelo stackexchange (a menos que eu não o tenha entendido). Como observação lateral, devido à natureza do problema de integridade, não é possível tornar algo assim inquebrável. O melhor que você pode fazer é tornar implausível que seja quebrado.
FryAmTheEggman

Respostas:

39

jQuery + JavaScript, 85 bytes

$.get("//api.stackexchange.com/posts/82610?site=codegolf",d=>alert(d.items[0].score))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

História

  • -6 bytes porque eu estava usando o var em datavez de d.
  • -3 bytes graças a @ msh210
  • -13 bytes graças a @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 bytes graças a @ user6188402
  • -5 bytes graças a @Suever
  • -4 bytes graças a @RobW

Uso recomendado

  • Execute o snippet.
  • Voto a favor.
  • Execute o snippet e surpreenda-se à medida que o número aumenta magicamente.

Bônus!!

Quem não gosta de um bônus?

$.getJSON("//api.stackexchange.com/posts/" + prompt() + "?site=codegolf",d=>alert(d.items[0].score));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Digite o ID no bônus e ele informará a pontuação.

Ainda mais bônus !! Execute esse trecho para executar automaticamente o programa, fazer o upvote e executar novamente! (Requer representante> 15, autenticação). Se não funcionar, por favor me diga.

Ninguém está aqui
fonte
2
postsem vez de answerse em httpvez de httpssalva três bytes (ou talvez você possa omitir http:completamente?). (Não testado.)
msh210
2
Você pode usar http://e vai redirecionamento 301 para https://Melhor ainda, basta remover o http completamente//api.stackexchange.com...
Suever
8
O jQuery não é uma linguagem, nem uma biblioteca embutida em JS. Portanto, se você estiver usando isso, inclua também a contagem de bytes do jQuery na sua pontuação.
Optimizer
10
@ Otimizador: Esta é a maneira correta de fazê-lo: considere JS + jQuery efetivamente ser sua própria "linguagem". Veja esta meta post: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman
3
Use em $.getvez de $.getJSON. O tipo de conteúdo da API é application/jsone o jQuery tratará automaticamente a resposta como JSON.
Rob W
24

JavaScript ES6, 107 bytes

fetch`//api.stackexchange.com/posts/82672?site=codegolf`.then(r=>r.json()).then(b=>alert(b.items[0].score))

Programadores reais não usam XMLHttpRequest. Programadores reais usam a API de busca .

Michał Perłakowski
fonte
11
Bem ... você me pegou lá. Eu nunca soube dessa API!
Conor O'Brien
Estou recebendo um erro que fetchnão está definido
Anthony Pham
11
@PythonMaster A API Fetch ainda não está disponível em todos os navegadores: caniuse.com/#feat=fetch
Jordan
21

Bash, 80 79 75 69 bytes

w3m api.stackexchange.com/posts/82616?site=codegolf|tr ,: \\t|cut -f20

Para fins de pontuação, \tdeve ser substituído por um caractere TAB.

Isso requer w3m, que deve estar disponível por padrão na maioria das distribuições Linux.

Graças a @NoOneIsHere por -2 bytes!

Como funciona

w3mé um navegador da web de linha de comando. Ele consulta o URL e (normalmente) exibe seu conteúdo em um formato legível. Aqui, apenas (ab) a usamos para evitar a chamada zcatque curlexigiria, pois o SE atende à resposta da API compactada com gzip.

tr ,: \^Isubstitui todas as vírgulas e dois pontos por tabulações, que são cuto delimitador de campo padrão.

Finalmente, cut -f20remove tudo, exceto o vigésimo campo, que é a contagem de votos.

Dennis
fonte
Ou --compressed, que é ainda mais longo que zcat.
Neil
9

JavaScript ES6, 175 165 160 160 145 bytes

Salva muitos bytes graças ao Optimizer e ao Dendrobium! São todos múltiplos de cinco!

Usando javascript simples e antigo. Quem precisa dessas novas bibliotecas? Programadores reais usamXMLHttpRequest()

with(new XMLHttpRequest)send(open("get","//api.stackexchange.com/posts/82614?site=codegolf"),onload=_=>alert(response.match(/re..([0-9]+)/)[1]))

Teste

alert=x=>o.innerHTML=x;

with(new XMLHttpRequest)send(open("get","//api.stackexchange.com/posts/82614?site=codegolf"),onload=_=>alert(response.match(/re..([0-9]+)/)[1]))
*{font-family:Consolas,monospace;}
<div id=o></div>

Conor O'Brien
fonte
@Optimizer Thanks! Mas por que usar prompt?
Conor O'Brien
@ Otimizador Por algum motivo, "g"não funciona como uma opção para mim.
Conor O'Brien
with(new XMLHttpRequest)(open("get","//api.stackexchange.com/2.2/posts/82614?site=codegolf"),onload=_=>alert(response.items[0].score),send(responseType="json"))para -5 bytes
Dendrobium 10/06
@Dendrobium Oh, bom. Eu esqueciwith
Conor O'Brien
@Optimizer I getTypeError: response.split(...)[12] is undefined",
Conor O'Brien
7

bash + jq , 69 bytes

w3m api.stackexchange.com/posts/82615?site=codegolf|jq .items[].score

Eu usei curle zcatantes; w3mé inspirado na resposta de Dennis (surpreendentemente semelhante). Acontece que / jqe tem o mesmo custo de bytes!trcut

Lynn
fonte
6

0,5, 63 bytes convexos

0000000: 22 d1 2e 46 91 32 e5 69 5d b2 66 81 12 a4 8d d1  "..F.2.i].f.....
0000010: 27 40 b5 32 47 68 97 2c b9 5c 22 05 16 49 10 31  '@.2Gh.,.\"..I.1
0000020: 44 9e f3 0a 6a 16 b0 68 91 93 35 0b 96 dc 91 0a  D...j..h..5.....
0000030: 3c 18 80 22 dc 67 27 3c 2f 32 36 39 3d 37 3e     <..".g'</269=7>

Isso recupera a pontuação da página de pesquisa em vez da API, especificamente da consulta https://codegolf.stackexchange.com/search?q=inquestion:82714 . Felizmente, inquestiontambém funciona para respostas.

Verificação

$ echo $LANG
en_US
$ cat gen.convex
"codegolf.stackexchange.com:80/search?q=inquestion:82714"Ö`"Üg'</269=7>"
$ java -jar Convex/out/builds/convex-0.5/convex/convex.jar gen.conv > count.conv
$ cksum count.conv
2414634109 63 count.conv
$ java -jar Convex/out/builds/convex-0.5/convex/convex.jar count.conv
1

Como funciona

"..."Ü           e# Use the built-in string compression to push
                 e# "codegolf.stackexchange.com:80/search?q=inquestion:82714".
      g          e# Retrieve the HTML page at that URL.
       '</       e# Split at occurrences of '<'.
          269=   e# Select the chunk at index 269.
                 e# This pushes "strong>", followed by the vote count.
              7> e# Discard the leading seven characters.
Dennis
fonte
Isso é incrível. Como você sabia que esse idioma pode fazer isso?
Adnan
3
É um garfo CJam. Originalmente, escrevi minha resposta em CJam (67 bytes), mas lembrei-me de que o Convex possui compactação de string integrada.
Dennis
5

05AB1E , 89 87 81 bytes

Obrigado Python ...

•1Ö8•D’£Ø ˆå§¾.‡¢ as g;#.¾¿„–(g.ˆåƒÛ('·Ç://ƒËŠˆ.‚‹º.ŒŒ/…é/ÿ/').‚Ø())’.er¡14èžz£þ

Usa a codificação CP-1252 .

Adnan
fonte
4

MATLAB, 103 bytes

g=@getfield;g(g(webread('http://api.stackexchange.com/2.2/posts/82611?site=codegolf'),'items'),'score')
Suever
fonte
4

JavaScript (Node.js + Unirest ), 123 bytes

require("unirest").get("http://api.stackexchange.com/posts/82683?site=codegolf").end(x=>console.log(x.body.items[0].score))

Eu gosto desta biblioteca, porque analisa automaticamente o JSON.

Michał Perłakowski
fonte
4

Julia, 128 107 bytes

using Requests
f()=split(readall(get("http://api.stackexchange.com/posts/82621?site=codegolf")),r":|,")[20]

Esta é uma função que não recebe nenhuma entrada e retorna a pontuação desta postagem como uma string. Requer oRequests pacote esteja instalado.

Como funciona:

  • get faz uma solicitação GET para a API SE
  • readall lê os bytes brutos na resposta e retorna uma string
  • split divide a corda em dois pontos e vírgulas
  • O vigésimo elemento do array resultante é a pontuação do post

Economizou 21 bytes graças a Dennis!

Alex A.
fonte
4

JavaScript (Node.js), 166 bytes

-1 byte porque @ CᴏɴᴏʀO'Bʀɪᴇɴ me ensinou a contar;)

-4 bytes graças a @NoOneIsHere

require("http").get("http://api.stackexchange.com/posts/82620?site=codegolf",a=>a.on("data",d=>console.log(JSON.parse(require("zlib").gunzipSync(d)).items[0].score)))

Isso é um pouco embaraçoso. Dang você SE por gzipping sua API! / s

Quaisquer melhorias são muito bem-vindas.

MayorMonty
fonte
3

PHP, 137 bytes

Bem direto. A descompactação ocupa muitos bytes:

<?=json_decode(gzinflate(substr(file_get_contents('http://api.stackexchange.com/2.2/posts/82619?site=codegolf'),10)),1)[items][0][score];

Ungolfed

print
  json_decode(
    gzinflate(
      substr(
        file_get_contents('http://api.stackexchange.com/2.2/posts/82619?site=codegolf'),
        10
      )
    ),
    1
  )
  [items][0][score];
insertusernamehere
fonte
2

PHP, 121 bytes

Sem API.

<?php preg_match('/t ">(.*)/',file_get_contents('http://codegolf.stackexchange.com/posts/82799/ajax-load'),$v);echo$v[1];

Obtém a postagem inteira e extrai a contagem de votos com regex. (não analise HTML com regex!)

Ungolfed:

<?php
   preg_match('/t ">(.*)/',
              file_get_contents('http://codegolf.stackexchange.com/posts/82799/ajax-load'),
              $v);

   echo $v[1];
nicael
fonte
Você pode remover http:?
NoOneIsHere
@NoOne Não, parece não funcionar então.
Nicael 17/06/16
1

05AB1E , 45 bytes

•2íЕ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’žYì.w'ŒÂ¡θ',¡нþ

Não há TIO para todo o programa, porque o .wacesso interno à Internet não funciona no TIO.

Explicação:

Começamos criando o URL e acessando-o:

2íЕ       # Push compressed integer 190437 (the id of this answer)
  ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’
            # Push dictionary string "api.stackexchange.com/posts/ÿ?site=codegolf",
            # where the `ÿ` is automatically filled with the 190437
    žY      # Push builtin "https://"
      ì     # And prepend it in front of the string
.w          # Go to this website, and get all its contents

Experimente online (sem o .w).

Depois disso, extraímos a pontuação do JSON:

'ŒÂ        '# Push dictionary string "score"
   ¡        # Split the website content on this
    θ       # Only leave the last item (of the two)
     ',¡   '# Split this string on ","
        н   # And this time leave the first item (i.e. `":10`)
         þ  # Only leave the digits of this string
            # (which is output implicitly as result)

Experimente online.

Uma alternativa igual a 10 bytes para esta segunda parte pode ser:

„ŒÂ‚¡       # Push dictionary string "score after"
     #      # Split it on spaces: ["score","after"]
      ¡     # Split the website content on these
       Ås   # Only leave the middle element
         þ  # Only leave the digits of this string
            # (which is output implicitly as result)

Experimente online.

Veja esta minha dica do 05AB1E (seções Como usar o dicionário? E Como compactar números inteiros grandes? ) Para entender por que •2íЕé 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’é "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂé "score"e „ŒÂ‚¡é "score after".

PS / EDIT: Percebo que, usando o þPresumo, nunca receberei uma pontuação negativa. ;)

Kevin Cruijssen
fonte