Contatore di voti di scambio di stack


40

Scrivere un programma / funzione che restituisca il conteggio dei voti della propria risposta Stack Stack al momento della sua esecuzione.

  • Il tuo programma / funzione può accedere a questa pagina ( codegolf.stackexchange.com/questions/82609 ) da Internet, tuttavia:
  • Il tuo programma / funzione potrebbe non accettare alcun input dell'utente e
  • L'uso di accorciatori di URL non è consentito
  • Il programma / funzione può utilizzare solo la propria fonte come punto di riferimento per il conteggio dei voti (ad esempio: nessuna stringa di testo di riferimento nella sua risposta contenuta ma non nella propria fonte)
  • Il tuo programma / funzione deve generare il proprio conteggio dei voti e solo il proprio conteggio dei voti (ad esempio: non restituire tutti i conteggi dei voti in questa pagina)

Questo è code-golf, vince il codice più corto.


perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'sembra che dovrebbe funzionare, ma non lo fa. Ma forse qualcuno può usarlo.
msh210,

7
A tutti coloro che stanno provando e non riescono a usare l'API: Serve per la risposta codificata con gzip, anche se il client non la supporta.
Dennis,

13
"Il tuo programma / funzione può utilizzare solo la propria fonte come punto di riferimento per il conteggio dei voti" È un po 'confuso. Questo significa che le risposte dovrebbero cercare di identificarsi solo usando la conoscenza del proprio codice e non attraverso qualcosa come un ID post? Non penso che una regola del genere sarebbe buona, in quanto può essere violata da chiunque invii una nuova risposta.
FryAmTheEggman,

@FryAmTheEggman Ho pensato un po 'a infrangere le risposte degli altri, e ho anche pensato di renderlo un KOTH in cui la tua fonte cerca di minare un'altra risposta, anche se alla fine sembra che stia spingendo il formato più di quanto volessi ... Ho aggiunto il using its own sourcebit per impedire agli utenti di impostare la pagina per rendere più facile trovarsi senza contribuire al conteggio dei byte, nel caso in cui la risposta non utilizzi il metodo post id.
Dendrobium,

2
Va bene, la formulazione è un po 'strana. Vorrei raccomandare invece di consentire determinati comportamenti in questo modo, invece di vietare direttamente l'utilizzo di qualsiasi servizio web oltre a quelli forniti da StackExChange (a meno che non ti abbia frainteso). Come nota a margine, a causa della natura del problema di completezza, non è possibile rendere qualcosa del genere indistruttibile. Il meglio che puoi fare è renderlo non plausibile essere rotto.
FryAmTheEggman,

Risposte:


39

jQuery + JavaScript, 85 byte

$.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>

Storia

  • -6 byte perché stavo usando var datainvece di d.
  • -3 byte grazie a @ msh210
  • -13 byte grazie a @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 byte grazie a @ user6188402
  • -5 byte grazie a @Suever
  • -4 byte grazie a @RobW

Utilizzo raccomandato

  • Esegui snippet.
  • Upvote.
  • Esegui lo snippet e lasciati stupire quando il numero aumenta magicamente.

Bonus !!

A chi non piace un bonus?

$.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>

Inserisci l'ID nel bonus e ti dirà il punteggio.

Ancora più bonus !! Esegui questo frammento per eseguire automaticamente il programma, eseguire l'upgrade ed eseguire di nuovo! (Richiede rep> 15, auth). Se non funziona, per favore dimmelo.


2
postsinvece di answerse httpinvece di httpssalvare tre byte (o forse puoi ometterti del http:tutto?). (Non testato.)
msh210,

2
Puoi usarlo http://e reindirizzerà 301 a https://Better, rimuovi del tutto il http//api.stackexchange.com...
Suever,

8
jQuery non è una lingua, né una libreria integrata in JS. Quindi, se lo stai usando, includi anche il conteggio dei byte di jQuery nel tuo punteggio.
Ottimizzatore,

10
@Optimizer: questo è il modo corretto di farlo: considera JS + jQuery come efficacemente il suo "linguaggio". Vedi questo meta post: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman

3
Usa $.getinvece di $.getJSON. Il tipo di contenuto dell'API è application/jsone jQuery tratterà automaticamente la risposta come JSON.
Rob W,

24

JavaScript ES6, 107 byte

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

I veri programmatori non usano XMLHttpRequest. I veri programmatori usano l' API Fetch .


1
Beh ... mi hai portato lì. Non ho mai saputo di questa API!
Conor O'Brien,

Ricevo un errore fetchnon definito
Anthony Pham,

1
@PythonMaster L'API Fetch non è ancora disponibile in tutti i browser: caniuse.com/#feat=fetch
Jordan

21

Bash, 80 79 75 69 byte

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

Ai fini del punteggio, \tdeve essere sostituito con un carattere TAB.

Ciò richiede w3m, che dovrebbe essere disponibile per impostazione predefinita sulla maggior parte delle distribuzioni Linux.

Grazie a @NoOneIsHere per -2 byte!

Come funziona

w3mè un browser della riga di comando. Interroga l'URL e (normalmente) visualizza il suo contenuto in un formato leggibile. Qui, lo usiamo solo (ab) per evitare la chiamata zcatche curlrichiederebbe, dal momento che SE serve la risposta API compressa da gzip.

tr ,: \^Isostituisce tutte le virgole e i due punti con le schede, che sono cutil delimitatore di campo predefinito.

Infine, cut -f20rimuove tutto tranne il ventesimo campo, ovvero il conteggio dei voti.


O --compressed, che è anche più lungo di zcat.
Neil,

9

JavaScript ES6, 175 165 160 145 byte

Byte salvati in lotti grazie a Optimizer e Dendrobium! Sono tutti multipli di cinque!

Usando javascript semplice. Chi ha bisogno di quelle nuove librerie? I veri programmatori usanoXMLHttpRequest()

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

Provalo

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>


@Optimizer Grazie! Ma perché usare prompt?
Conor O'Brien,

@Optimizer Per qualche motivo, "g"non funziona come opzione per me.
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"))per -5 byte
Dendrobium,

@Dendrobium Oh, bello. Mi sono dimenticato diwith
Conor O'Brien il

@Optimizer ottengoTypeError: response.split(...)[12] is undefined",
Conor O'Brien il

7

bash + jq , 69 byte

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

Ho usato curle zcatprima; w3mè ispirato dalla risposta (sorprendentemente simile) di Dennis. Risulta jqe tr/ cutha lo stesso costo in byte!


6

Convesso 0,5, 63 byte

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>

Ciò recupera il punteggio dalla pagina di ricerca anziché dall'API, in particolare dalla query https://codegolf.stackexchange.com/search?q=inquestion:82714 . Fortunatamente, inquestionfunziona anche per le risposte.

Verifica

$ 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

Come funziona

"..."Ü           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.

Questo è fantastico Come hai saputo che questa lingua può farlo?
Adnan,

3
È una forcella CJam. Inizialmente ho scritto la mia risposta in CJam (67 byte), ma poi ho ricordato che Convex ha una compressione delle stringhe incorporata.
Dennis,

5

05AB1E , 89 87 81 byte

Grazie Python ...

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

Utilizza la codifica CP-1252 .


4

MATLAB, 103 byte

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

4

JavaScript (Node.js + Unirest ), 123 byte

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

Mi piace questa libreria, perché analizza automaticamente JSON.


4

Julia, 128 107 byte

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

Questa è una funzione che non accetta input e restituisce il punteggio di questo post come stringa. Richiede l' Requestsinstallazione del pacchetto.

Come funziona:

  • get invia una richiesta GET all'API SE
  • readall legge i byte grezzi nella risposta e restituisce una stringa
  • split divide la stringa in due punti e virgole
  • Il 20 ° elemento dell'array risultante è il punteggio del post

Risparmiato 21 byte grazie a Dennis!


4

JavaScript (Node.js), 166 byte

-1 byte perché @ CᴏɴᴏʀO'Bʀɪᴇɴ mi ha insegnato a contare;)

-4 byte grazie 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)))

Questo è alquanto imbarazzante. Ti sei imbattuto in SE per aver decompresso la tua API! /S

Eventuali miglioramenti sono i benvenuti.


3

PHP, 137 byte

Abbastanza diretto. La decompressione richiede molti byte:

<?=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];

2

PHP, 121 byte

Senza API.

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

Ottiene l'intero post ed estrae i conteggi dei voti con regex. (non analizzare HTML con regex!)

Ungolfed:

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

   echo $v[1];

Puoi rimuovere http:?
NoOneIsHere il

@NoOne No, non sembra funzionare allora.
nicael,

1

05AB1E , 45 byte

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

Nessun TIO per l'intero programma, perché il .wbuilt-in per accedere a Internet non funziona su TIO.

Spiegazione:

Iniziamo creando l'URL e accedendo a esso:

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

Provalo online (senza il .w ).

Successivamente, estraiamo il punteggio dal 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)

Provalo online.

Un'alternativa uguale a 10 byte per questa seconda parte potrebbe essere:

„ŒÂ‚¡       # 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)

Provalo online.

Vedi questo mio suggerimento 05AB1E (sezioni Come utilizzare il dizionario? E Come comprimere numeri interi grandi? ) Per capire perché •2íЕè 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’è "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂè "score"e „ŒÂ‚¡è "score after".

PS / EDIT: mi rendo conto che usando l' þipotesi non otterrò mai un punteggio negativo. ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.