Счетчик голосов в стеке


40

Напишите программу / функцию, которая возвращает счетчик голосов своего собственного ответа на Stack Exchange во время его выполнения.

  • Ваша программа / функция может получить доступ к этой странице ( codegolf.stackexchange.com/questions/82609 ) через Интернет, однако:
  • Ваша программа / функция может не принимать любой пользовательский ввод и
  • Использование сокращателей URL запрещено
  • Ваша программа / функция может использовать только свой собственный источник в качестве контрольной точки для своего подсчета голосов (например: нет ссылок на строки текста в своем ответе, но не в своем собственном источнике)
  • Ваша программа / функция должна выводить свой собственный подсчет голосов и только свой собственный подсчет голосов (например: не возвращать все подсчеты голосов на этой странице)

Это код-гольф, самый короткий код выигрывает.


perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'Похоже, это должно работать, но не работает. Но, возможно, кто-то может использовать это.
msh210

7
Всем остальным, кто пытается и не может использовать API: он обслуживает ответ, закодированный gzip, даже если клиент его не поддерживает.
Деннис

13
«Ваша программа / функция может использовать только собственный источник в качестве ориентира для подсчета голосов». Это немного сбивает с толку. Означает ли это, что ответы должны пытаться идентифицировать себя, только используя знания своего собственного кода, а не с помощью чего-то вроде идентификатора записи? Я не думаю, что такое правило было бы хорошо, так как оно может быть нарушено кем-либо, кто публикует новый ответ.
FryAmTheEggman

@FryAmTheEggman Я немного подумал о том, чтобы сломать ответы других людей, и я даже подумывал сделать это КОТОМ, когда ваш источник пытается подорвать другой ответ, хотя в итоге это подтолкнуло формат больше, чем я хотел ... Я добавил using its own sourceбит, чтобы запретить пользователям настраивать страницу, чтобы было легче найти себя, не внося свой вклад в подсчет байтов, в случае, если в ответе не используется метод идентификатора поста.
Дендробиум

2
Хорошо, формулировка немного странная. Я бы порекомендовал вместо того, чтобы разрешить определенное поведение таким образом, вместо этого напрямую запретить использование любых веб-сервисов, кроме тех, которые поставляются с помощью stackexchange (если я вас неправильно не понял). В качестве дополнительного примечания, из-за характера проблемы полноты невозможно сделать что-то подобное неразрушимым. Лучшее, что вы можете сделать, - это сделать неправдоподобным, чтобы вас сломали.
FryAmTheEggman

Ответы:


39

jQuery + JavaScript, 85 байт

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

история

  • -6 байт, потому что я использовал переменную dataвместо d.
  • -3 байта благодаря @ msh210
  • -13 байт благодаря @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 байта благодаря @ user6188402
  • -5 байт благодаря @Suever
  • -4 байта благодаря @RobW

Рекомендуемое использование

  • Запустить фрагмент.
  • Upvote.
  • Запустите фрагмент, и вы будете поражены, когда число магически увеличивается.

Бонус !!

Кому не нравится бонус?

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

Введите идентификатор в бонус, и он скажет вам счет.

Еще больше бонусов! Запустите этот фрагмент, чтобы автоматически запустить программу, выполнить голосование и запустить снова! (Требуется rep> 15, аутентификация). Если это не работает, пожалуйста, скажите мне.


2
postsвместо answersи httpвместо того, чтобы httpsсохранить три байта (или, может быть, вы можете http:вообще пропустить ?). (Не проверено.)
msh210

2
Вы можете использовать, http://и он будет 301 перенаправлять на https://еще лучше, просто полностью удалите http//api.stackexchange.com...
Suever

8
JQuery не является ни языком, ни встроенной библиотекой в ​​JS. Так что, если вы используете это, включите количество байтов jQuery в ваш счет тоже.
Оптимизатор

10
@Optimizer: это правильный способ сделать это: считайте, что JS + jQuery фактически является собственным «языком». Смотрите эту мета-пост: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman

3
Используйте $.getвместо $.getJSON. Тип содержимого API - это application/json, и jQuery автоматически обработает ответ как JSON.
Роб W

24

JavaScript ES6, 107 байт

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

Настоящие программисты не используют XMLHttpRequest. Настоящие программисты используют Fetch API .


1
Ну ... ты меня там получил. Я никогда не знал об этом API!
Конор О'Брайен

Я получаю ошибку, которая fetchне определена
Энтони Фам

1
@PythonMaster Fetch API еще не доступен во всех браузерах: caniuse.com/#feat=fetch
Джордан

21

Баш, 80 79 75 69 байт

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

В целях подсчета \tследует заменить символ табуляции.

Это требует w3m, который должен быть доступен по умолчанию в большинстве дистрибутивов Linux.

Спасибо @NoOneIsHere за -2 байта!

Как это работает

w3mвеб-браузер командной строки Он запрашивает URL-адрес и (обычно) отображает его содержимое в удобочитаемом формате. Здесь мы просто (ab) используем его, чтобы избежать вызова zcat, curlкоторый потребовался бы, поскольку SE обслуживает ответ API gzip-compress.

tr ,: \^Iзаменяет все запятые и двоеточия на вкладки, которые являются cutразделителем полей по умолчанию.

Наконец, cut -f20удаляет все, кроме двадцатого поля, которое является подсчетом голосов.


Или --compressed, что даже дольше, чем zcat.
Нил

9

JavaScript ES6, 175 165 160 145 байтов

Благодаря оптимизатору и дендробиуму сэкономлено байтов лота! Они все кратны пяти!

Используя обычный старый javascript. Кому нужны эти новомодные библиотеки? Настоящие программисты используютXMLHttpRequest()

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

Проверьте это

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 Спасибо! Но зачем использовать prompt?
Конор О'Брайен

@Optimizer По некоторым причинам, "g"не работает как вариант для меня.
Конор О'Брайен

with(new XMLHttpRequest)(open("get","//api.stackexchange.com/2.2/posts/82614?site=codegolf"),onload=_=>alert(response.items[0].score),send(responseType="json"))для -5 байт
Дендробиум

@Dendrobium О, хороший. Я забыл оwith
Конор О'Брайен

@ Оптимизатор я получаюTypeError: response.split(...)[12] is undefined",
Конор О'Брайен

7

bash + jq , 69 байт

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

Я использовал curlи zcatраньше; w3mвдохновлен ответом (поразительно похожим) Денниса. Оказывается jqи tr/ cutимеют одинаковую стоимость в байтах!


6

Выпуклый 0.5, 63 байта

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>

Это извлекает оценку из страницы поиска вместо API, в частности из запроса https://codegolf.stackexchange.com/search?q=inquestion:82714 . К счастью, inquestionтакже работает для ответов.

верификация

$ 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

Как это работает

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

Это потрясающе. Как ты вообще узнал, что этот язык может это сделать?
Аднан

3
Это вилка CJam. Первоначально я написал свой ответ в CJam (67 байт), но потом вспомнил, что в Convex встроено сжатие строк.
Деннис

5

05AB1E , 89 87 81 байт

Спасибо Python ...

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

Использует кодировку CP-1252 .


4

MATLAB, 103 байта

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

4

JavaScript (Node.js + Unirest ), 123 байта

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

Мне нравится эта библиотека, потому что она автоматически анализирует JSON.


4

Юлия, 128 107 байт

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

Эта функция не принимает никаких данных и возвращает оценку этого поста в виде строки. Требует установки Requestsпакета.

Как это работает:

  • get делает запрос GET к SE API
  • readall читает необработанные байты в ответе и возвращает строку
  • split разбивает строку на двоеточия и запятые
  • 20-й элемент результирующего массива - это оценка поста

Благодаря Денису сэкономлено 21 байт!


4

JavaScript (Node.js), 166 байт

-1 байт, потому что @ CᴏɴᴏʀO'Bʀɪᴇɴ научил меня считать;)

-4 байта благодаря @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)))

Это несколько смущает. Черт возьми, SE для gzipping вашего API! / s

Любые улучшения приветствуются.


3

PHP, 137 байт

Довольно прямо вперед. Распаковка занимает много байтов:

<?=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 байт

Без API.

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

Получает весь пост и извлекает подсчет голосов с помощью регулярных выражений. (не разбирайте HTML с регулярным выражением!)

Ungolfed:

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

   echo $v[1];

Вы можете удалить http:?
NoOneIsHere

@ NoOne Нет, похоже, не работает тогда.
Никель

1

05AB1E , 45 байт

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

Нет TIO для всей программы, потому что .wвстроенный доступ к Интернету не работает на TIO.

Объяснение:

Мы начинаем с создания URL и доступа к нему:

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

Попробуйте онлайн (без .w).

После этого мы извлекаем счет из 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)

Попробуйте онлайн.

Равная 10- байтовая альтернатива для этой второй части может быть:

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

Попробуйте онлайн.

Смотрите этот 05AB1E наконечника шахты (разделы Как пользоваться словарем? И Как сжать большие целые числа? ) , Чтобы понять , почему •2íЕэто 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’это "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂэто "score", и„ŒÂ‚¡ это "score after".

PS / РЕДАКТИРОВАТЬ: я понимаю, что с помощью þя предполагаю, что я никогда не получу отрицательный результат. ;)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.