Contador de votación de intercambio de pila

40

Escriba un programa / función que devuelva el recuento de votos de su propia respuesta de Stack Exchange en el momento de su ejecución.

  • Sin embargo, su programa / función puede acceder a esta página ( codegolf.stackexchange.com/questions/82609 ) fuera de Internet:
  • Su programa / función puede no aceptar ninguna entrada del usuario y
  • El uso de acortadores de URL no está permitido
  • Su programa / función puede usar solo su propia fuente como punto de referencia para su recuento de votos (por ejemplo: no hace referencia a cadenas de texto en su respuesta contenida pero no en su propia fuente)
  • Su programa / función debe generar su propio recuento de votos y solo su propio recuento de votos (por ejemplo: no devolver todos los recuentos de votos en esta página)

Este es el código de golf, el código más corto gana.

Dendrobium
fuente
perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'Parece que debería funcionar, pero no lo hace. Pero tal vez alguien pueda usar eso.
msh210
77
Para todos los demás que intentan y no usan la API: Sirve la respuesta codificada por gzip, incluso si el cliente no la admite.
Dennis
13
"Su programa / función puede usar solo su propia fuente como punto de referencia para su conteo de votos" Es un poco confuso. ¿Significa esto que las respuestas deberían tratar de identificarse solo usando el conocimiento de su propio código, y no a través de algo como una identificación de publicación? No creo que esa regla sea buena, ya que puede ser quebrantada por cualquier otra persona que publique una nueva respuesta.
FryAmTheEggman
@FryAmTheEggman Pensé un poco en romper las respuestas de otras personas, e incluso consideré hacer esto un KOTH donde su fuente intenta socavar otra respuesta, aunque al final parecía estar presionando el formato más de lo que quería ... Agregué el using its own sourcebit para evitar que los usuarios configuren la página para que sea más fácil encontrarse sin contribuir a su recuento de bytes, en el caso de que la respuesta no use el método de identificación de publicación.
Dendrobium
2
Muy bien, la redacción es un poco rara. Recomendaría, en lugar de permitir cierto comportamiento de esta manera, prohibir directamente el uso de cualquier servicio web además de los proporcionados por stackexchange (a menos que lo haya entendido mal). Como nota al margen, debido a la naturaleza del problema de integridad, no es posible hacer que algo como esto sea irrompible. Lo mejor que puede hacer es hacer que sea imposible que se rompa.
FryAmTheEggman

Respuestas:

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>

Historia

  • -6 bytes porque estaba usando la var en datalugar de d.
  • -3 bytes gracias a @ msh210
  • -13 bytes gracias a @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 bytes gracias a @ user6188402
  • -5 bytes gracias a @Suever
  • -4 bytes gracias a @RobW

Uso recomendado

  • Ejecutar fragmento.
  • Voto a favor.
  • Ejecute el fragmento y sorpréndase a medida que el número aumenta mágicamente.

¡¡Prima!!

¿A quién no le gusta un bono?

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

Ingrese la identificación en el bono y le indicará el puntaje.

¡Aún más bonificación! ¡Ejecute este fragmento para ejecutar automáticamente el programa, votar y volver a ejecutar! (Requiere rep> 15, autenticación). Si no funciona, por favor dime.

No hay nadie aquí
fuente
2
postsen lugar de answersy en httplugar de httpsguardar tres bytes (¿o quizás puede omitirlos por http:completo?). (Sin probar)
msh210
2
Puede usar http://y redirigirá 301 a https://Mejor aún, simplemente elimine el http por completo//api.stackexchange.com...
Suever
8
jQuery no es un lenguaje, ni una biblioteca incorporada en JS. Entonces, si está usando eso, incluya también el conteo de bytes de jQuery en su puntaje.
Optimizador
10
@Optimizer: esta es la forma correcta de hacerlo: considere que JS + jQuery es efectivamente su propio "lenguaje". Ver esta meta publicación: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman
3
Usar en $.getlugar de $.getJSON. El tipo de contenido de la API es application/json, y jQuery tratará automáticamente la respuesta 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))

Los programadores reales no usan XMLHttpRequest. Los programadores reales usan la API Fetch .

Michał Perłakowski
fuente
1
Ahí me has pillado. ¡Nunca supe de esta API!
Conor O'Brien
Recibo un error que fetchno está definido
Anthony Pham
1
@PythonMaster La API Fetch aún no está disponible en todos los navegadores: caniuse.com/#feat=fetch
Jordania
21

Bash, 80 79 75 69 bytes

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

Para fines de puntuación, \tdebe reemplazarse con un carácter TAB.

Esto requiere w3m, que debería estar disponible por defecto en la mayoría de las distribuciones de Linux.

¡Gracias a @NoOneIsHere por -2 bytes!

Cómo funciona

w3mes un navegador web de línea de comandos. Consulta la URL y (normalmente) muestra su contenido en un formato legible. Aquí, simplemente (ab) lo usamos para evitar la llamada a la zcatque curlse requeriría, ya que SE sirve la respuesta de API gzip-comprimido.

tr ,: \^Ireemplaza todas las comas y los dos puntos con tabulaciones, que son cutel delimitador de campo predeterminado.

Finalmente, cut -f20elimina todo menos el vigésimo campo, que es el recuento de votos.

Dennis
fuente
O --compressed, que es incluso más largo que zcat.
Neil
9

JavaScript ES6, 175 165 160 145 bytes

¡Muchos bytes guardados gracias a Optimizer y Dendrobium! ¡Son todos múltiplos de cinco!

Usando el simple ol 'javascript. ¿Quién necesita esas bibliotecas novedosas? Uso de programadores realesXMLHttpRequest()

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

Pruébalo

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
fuente
@Optimizer ¡Gracias! ¿Pero por qué usarlo prompt?
Conor O'Brien
@Optimizer Por alguna razón, "g"no funciona como una opción para mí.
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
@Dendrobium Oh, buena. Me olvidé dewith
Conor O'Brien
@Optimizer me saleTypeError: response.split(...)[12] is undefined",
Conor O'Brien
7

bash + jq , 69 bytes

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

Yo solía curly zcatantes; w3mestá inspirado en la respuesta de Dennis (sorprendentemente similar). ¡Resulta jqy tr/ cuttiene el mismo costo de bytes!

Lynn
fuente
6

Convexo 0.5, 63 bytes

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>

Esto recupera el puntaje de la página de búsqueda en lugar de la API, específicamente de la consulta https://codegolf.stackexchange.com/search?q=inquestion:82714 . Afortunadamente, inquestiontambién funciona para respuestas.

Verificación

$ 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

Cómo 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
fuente
Esto es increíble. ¿Cómo sabías que este lenguaje puede hacer esto?
Adnan
3
Es un tenedor CJam. Originalmente escribí mi respuesta en CJam (67 bytes), pero luego recordé que Convex tiene compresión de cadena incorporada.
Dennis
5

05AB1E , 89 87 81 bytes

Gracias Python ...

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

Utiliza la codificación CP-1252 .

Adnan
fuente
4

MATLAB, 103 bytes

g=@getfield;g(g(webread('http://api.stackexchange.com/2.2/posts/82611?site=codegolf'),'items'),'score')
Suever
fuente
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))

Me gusta esta biblioteca, porque analiza automáticamente JSON.

Michał Perłakowski
fuente
4

Julia, 128 107 bytes

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

Esta es una función que no toma entrada y devuelve el puntaje de esta publicación como una cadena. Requiere Requestsque se instale el paquete.

Cómo funciona:

  • get realiza una solicitud GET a la API SE
  • readall lee los bytes sin procesar en la respuesta y devuelve una cadena
  • split divide la cadena en dos puntos y comas
  • El vigésimo elemento de la matriz resultante es el puntaje de la publicación

¡Ahorré 21 bytes gracias a Dennis!

Alex A.
fuente
4

JavaScript (Node.js), 166 bytes

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

-4 bytes gracias 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)))

Esto es algo vergonzoso. ¡Cuelgue SE por desgarrar su API! / s

Cualquier mejora es muy bienvenida.

AlcaldeMonty
fuente
3

PHP, 137 bytes

Muy claro. La descompresión toma muchos bytes:

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

Sin golf

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

PHP, 121 bytes

Sin api.

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

Obtiene toda la publicación y extrae el voto cuenta con expresiones regulares. (¡no analices HTML con expresiones regulares!)

Sin golf:

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

   echo $v[1];
nicael
fuente
Se puede eliminar http:?
NoOneIsHere
@NoOne No, no parece funcionar entonces.
nicael
1

05AB1E , 45 bytes

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

No hay TIO para todo el programa, porque la función .wintegrada para acceder a Internet no funciona en TIO.

Explicación:

Comenzamos creando la url y accediendo a ella:

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

Pruébelo en línea (sin el .w).

Después de eso, extraemos el puntaje del 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)

Pruébalo en línea.

Una alternativa igual de 10 bytes para esta segunda parte podría 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)

Pruébalo en línea.

Vea esta sugerencia mía 05AB1E (secciones ¿Cómo usar el diccionario? Y ¿Cómo comprimir enteros grandes? ) Para comprender por qué •2íЕes 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’es "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂes "score"y „ŒÂ‚¡es "score after".

PS / EDIT: me doy cuenta de que al usar el þsupongo que nunca obtendré una puntuación negativa. ;)

Kevin Cruijssen
fuente