Стек лічильника голосів


40

Напишіть програму / функцію, яка повертає підрахунок голосів власної відповіді на обмін стеками під час її виконання.

  • Ваша програма / функція може отримати доступ до цієї сторінки ( 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біт, щоб перешкодити користувачам налаштувати сторінку, щоб полегшити пошук себе, не впливаючи на її кількість байтів, якщо у відповіді не використовується метод post id.
Дендробіум

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 байт, тому що я використовував var dataзамість d.
  • -3 байти завдяки @ msh210
  • -13 байт завдяки @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 байти завдяки @ user6188402
  • -5 байт завдяки @Suever
  • -4 байти завдяки @RobW

Рекомендоване використання

  • Виконати фрагмент.
  • Оновлення
  • Запустіть фрагмент і дивуйтеся, коли кількість магічно збільшується.

Бонус !!

Кому не подобається бонус?

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

Введіть ідентифікатор в бонус, і він підкаже вам рахунок.

Ще більший бонус !! Запустіть цей фрагмент для автоматичного запуску програми, оновлення та запуску ще раз! (Потрібно повтор.> 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.
Rob 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. Справжні програмісти використовують API Fetch .


1
Ну ... ти мене туди завів. Я ніколи не знав про цей API!
Conor O'Brien

Я отримую помилку, яка fetchне визначена
Ентоні Фам

1
@PythonMaster API Fetch ще не доступний у всіх браузерах: caniuse.com/#feat=fetch
Йорданія,

21

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

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

Для оцінки балів \tслід замінити символом TAB.

Це вимагає w3m, що має бути доступно за замовчуванням у більшості дистрибутивів Linux.

Дякуємо @NoOneIsHere за -2 байти!

Як це працює

w3m- веб-браузер командного рядка. Він запитує URL та (як правило) відображає його вміст у читаному форматі. Тут ми просто (ab) використовуємо його, щоб уникнути дзвінка до zcatцього, curlщо вимагає, оскільки SE обслуговує відповідь API gzip-стиснутого.

tr ,: \^Iзамінює всі коми і двокрапки на вкладки, які є cutроздільником поля за замовчуванням.

Нарешті, cut -f20видаляє все, крім двадцятого поля, що є підрахунком голосів.


Або --compressed, що навіть довше, ніж zcat.
Ніл

9

JavaScript ES6, 175 165 160 145 байт

Збережено байтів лота завдяки оптимізатору та дендробію! Вони всі кратні по п'ять!

Використання простого jal 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?
Conor O'Brien

@Optimizer Чомусь "g"не працює як варіант для мене.
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"))для -5 байт
Dendrobium

@Dendrobium О, приємний. Я забув проwith
Conor O'Brien

@Optimizer Я отримуюTypeError: response.split(...)[12] is undefined",
Conor O'Brien

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! / с

Будь-які вдосконалення дуже вітаються.


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

Безумовно

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

Без апі.

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

Отримує весь пост і витягує підрахунок голосів за допомогою регулярного вираження. (не розбирайте HTML за допомогою regex!)

Безголовки:

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

   echo $v[1];

Ви можете видалити http:?
NoOneIsHere

@NoOne Ні, тоді, здається, не працює.
nicael

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 / EDIT: Я розумію, що, використовуючи þприпущення, я ніколи не отримаю негативну оцінку. ;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.