Stos wymiany licznika głosów

40

Napisz program / funkcję, która zwraca liczbę głosów swojej odpowiedzi Stack Exchange w momencie jej wykonania.

  • Twój program / funkcja może uzyskać dostęp do tej strony ( codegolf.stackexchange.com/questions/82609 ) z Internetu, jednak:
  • Twój program / funkcja może nie akceptować żadnych danych wejściowych użytkownika i
  • Stosowanie skracaczy URL jest niedozwolone
  • Twój program / funkcja może wykorzystywać tylko własne źródło jako punkt odniesienia do liczenia głosów (na przykład: brak ciągów tekstowych w zawartej odpowiedzi, ale nie we własnym źródle)
  • Twój program / funkcja musi wyświetlać własną liczbę głosów i tylko własną liczbę głosów (na przykład: nie zwraca wszystkich głosów na tej stronie)

To jest golf golfowy, wygrywa najkrótszy kod.

Dendrobium
źródło
perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'wygląda na to, że powinno działać, ale nie działa. Ale może ktoś może tego użyć.
msh210
7
Wszystkim innym, którzy próbują i nie używają interfejsu API: obsługuje odpowiedź zakodowaną w gzip, nawet jeśli klient go nie obsługuje.
Dennis
13
„Twój program / funkcja może wykorzystywać tylko własne źródło jako punkt odniesienia do liczby głosów”. Jest to nieco mylące. Czy to oznacza, że ​​odpowiedzi powinny próbować się identyfikować tylko przy użyciu wiedzy o własnym kodzie, a nie za pomocą identyfikatora postu? Nie sądzę, że taka zasada byłaby dobra, ponieważ może ją złamać każdy, kto opublikuje nową odpowiedź.
FryAmTheEggman
@FryAmTheEggman Zastanawiałem się nad łamaniem odpowiedzi innych ludzi, a nawet rozważałem uczynienie z tego KOTH, w którym twoje źródło próbuje podważyć inną odpowiedź, chociaż ostatecznie wydawało się, że przesuwa format bardziej niż chciałem ... Dodałem using its own sourcebit, aby uniemożliwić użytkownikom konfigurację strony, aby ułatwić znalezienie się bez zwiększania liczby bajtów w przypadku, gdy odpowiedź nie używa metody post id.
Dendrobium
2
W porządku, sformułowanie jest trochę dziwne. Poleciłbym zamiast zezwalać na pewne zachowanie w ten sposób, zamiast tego bezpośrednio banować korzystanie z jakichkolwiek usług internetowych oprócz tych dostarczanych przez stackexchange (chyba że cię źle zrozumiałem). Na marginesie, ze względu na naturę problemu z kompletnością, nie jest możliwe, aby coś takiego nie do złamania. Najlepsze, co możesz zrobić, to uniemożliwić złamanie.
FryAmTheEggman

Odpowiedzi:

39

jQuery + JavaScript, 85 bajtów

$.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 bajtów, ponieważ użyłem var datazamiast d.
  • -3 bajty dzięki @ msh210
  • -13 bajtów dzięki @ CᴏɴᴏʀO'Bʀɪᴇɴ
  • -4 bajty dzięki @ user6188402
  • -5 bajtów dzięki @Suever
  • -4 bajty dzięki @RobW

Zalecane użycie

  • Uruchom fragment kodu.
  • Głosuj.
  • Uruchom snippet i daj się zaskoczyć magicznej liczbie.

Premia!!

Kto nie lubi premii?

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

Wprowadź identyfikator do premii, a powiesz wynik.

Jeszcze więcej bonusu !! Uruchom ten fragment kodu, aby automatycznie uruchomić program, oceń i uruchom ponownie! (Wymaga powtórzenia> 15, autoryzacja). Jeśli to nie działa, proszę powiedz mi.

Nikogo tu nie ma
źródło
2
postszamiast answersi httpzamiast httpsoszczędza trzy bajty (a może można http:całkowicie pominąć ?). (Nietestowane.)
msh210
2
Możesz użyć, http://a 301 jeszcze przekieruje na https://Lepsze, po prostu usuń http całkowicie//api.stackexchange.com...
Suever
8
jQuery nie jest językiem ani wbudowaną biblioteką w JS. Jeśli więc tego używasz, uwzględnij liczbę bajtów jQuery w swoim wyniku.
Optymalizator
10
@Optimizer: To jest właściwy sposób, aby to zrobić: uważaj JS + jQuery za swój własny „język”. Zobacz ten post w meta: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman
3
Użyj $.getzamiast $.getJSON. Typ zawartości interfejsu API to application/json, a jQuery automatycznie potraktuje odpowiedź jako JSON.
Rob W
24

JavaScript ES6, 107 bajtów

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

Prawdziwi programiści nie używają XMLHttpRequest. Prawdziwi programiści używają interfejsu API Fetch .

Michał Perłakowski
źródło
1
Cóż ... masz mnie tam. Nigdy nie wiedziałem o tym API!
Conor O'Brien,
Dostaję błąd, który fetchnie został zdefiniowany
Anthony Pham
1
@PythonMaster Interfejs API Fetch nie jest jeszcze dostępny we wszystkich przeglądarkach: caniuse.com/#feat=fetch
Jordan
21

Bash, 80 79 75 69 bajtów

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

Do celów punktacji \tnależy zastąpić znakiem TAB.

Wymaga to w3m, które powinno być domyślnie dostępne w większości dystrybucji Linuksa.

Dzięki @NoOneIsHere za -2 bajty!

Jak to działa

w3mto przeglądarka internetowa z wierszem poleceń. Sprawdza adres URL i (zwykle) wyświetla jego treść w czytelnym formacie. Tutaj po prostu (ab) używamy go, aby uniknąć wywołania zcattego curl, ponieważ byłoby to konieczne, ponieważ SE obsługuje odpowiedź API skompresowaną gzip.

tr ,: \^Izastępuje wszystkie przecinki i dwukropki tabulatorami, które są cutdomyślnym separatorem pól.

Na koniec cut -f20usuwa wszystko oprócz dwudziestego pola, które jest liczbą głosów.

Dennis
źródło
Lub --compressed, co jest nawet dłuższe niż zcat.
Neil
9

JavaScript ES6, 175 165 160 145 bajtów

Zaoszczędź dużo bajtów dzięki Optimizer i Dendrobium! Wszystkie są wielokrotnościami pięciu!

Korzystanie ze zwykłego javascript. Kto potrzebuje tych nowomodnych bibliotek? Prawdziwi programiści wykorzystanieXMLHttpRequest()

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

Przetestuj to

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
źródło
@Optimizer Thanks! Ale po co korzystać prompt?
Conor O'Brien,
@Optimizer Z jakiegoś powodu "g"nie działa dla mnie jako opcja.
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"))dla -5 bajtów
Dendrobium
@Dendrobium Oh, miło. Zapomniałem owith
Conor O'Brien,
@Optimizer dostajęTypeError: response.split(...)[12] is undefined",
Conor O'Brien
7

bash + jq , 69 bajtów

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

Użyłem curli zcatwcześniej; w3mjest inspirowany odpowiedzią Dennisa (uderzająco podobną). Okazuje się, jqi tr/ cutmają ten sam koszt bajtów!

Lynn
źródło
6

Wypukłe 0,5, 63 bajty

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>

Spowoduje to pobranie wyniku ze strony wyszukiwania zamiast interfejsu API, w szczególności z zapytania https://codegolf.stackexchange.com/search?q=inquestion:82714 . Na szczęście inquestiondziała również w przypadku odpowiedzi.

Weryfikacja

$ 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

Jak to działa

"..."Ü           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
źródło
To jest niesamowite. Skąd w ogóle wiedziałeś, że ten język może to zrobić?
Adnan
3
To widelec CJam. Pierwotnie napisałem odpowiedź w CJam (67 bajtów), ale potem przypomniałem sobie, że Convex ma wbudowaną kompresję napisów.
Dennis
5

05AB1E , 89 87 81 bajtów

Dzięki Python ...

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

Wykorzystuje kodowanie CP-1252 .

Adnan
źródło
4

MATLAB, 103 bajty

g=@getfield;g(g(webread('http://api.stackexchange.com/2.2/posts/82611?site=codegolf'),'items'),'score')
Suever
źródło
4

JavaScript (Node.js + Unirest ), 123 bajty

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

Podoba mi się ta biblioteka, ponieważ automatycznie analizuje JSON.

Michał Perłakowski
źródło
4

Julia, 128 107 bajtów

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

Jest to funkcja, która nie pobiera danych wejściowych i zwraca wynik tego postu jako ciąg znaków. Wymaga zainstalowania Requestspakietu.

Jak to działa:

  • get wysyła żądanie GET do SE API
  • readall odczytuje surowe bajty w odpowiedzi i zwraca ciąg znaków
  • split dzieli ciąg na dwukropki i przecinki
  • Dwudziestym elementem wynikowej tablicy jest wynik słupka

Zaoszczędzono 21 bajtów dzięki Dennisowi!

Alex A.
źródło
4

JavaScript (Node.js), 166 bajtów

-1 bajt, ponieważ @ CᴏɴᴏʀO'Bʀɪᴇɴ nauczył mnie liczyć;)

-4 bajty dzięki @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)))

To jest trochę zawstydzające. Cholera SE za zgzipowanie API! / s

Wszelkie ulepszenia są bardzo mile widziane.

MayorMonty
źródło
3

PHP, 137 bajtów

Całkiem prosto. Rozpakowywanie zajmuje dużo bajtów:

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

Bez golfa

print
  json_decode(
    gzinflate(
      substr(
        file_get_contents('http://api.stackexchange.com/2.2/posts/82619?site=codegolf'),
        10
      )
    ),
    1
  )
  [items][0][score];
wstawić nazwę tutaj
źródło
2

PHP, 121 bajtów

Bez interfejsu API

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

Pobiera cały post i wyodrębnia liczenie głosów za pomocą wyrażenia regularnego. (nie analizuj HTML za pomocą wyrażenia regularnego!)

Nie golfowany:

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

   echo $v[1];
Nicość
źródło
Czy możesz to usunąć http:?
NoOneIsHere
@NieOne Nie, nie wydaje się wtedy działać.
nicael
1

05AB1E , 45 bajtów

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

Brak TIO dla całego programu, ponieważ .wwbudowany dostęp do Internetu nie działa na TIO.

Wyjaśnienie:

Zaczynamy od utworzenia adresu URL i uzyskania do niego dostępu:

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

Wypróbuj online (bez .w).

Następnie wyodrębniamy partyturę z 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)

Wypróbuj online.

Równa 10 bajtów alternatywa dla tej drugiej części może być:

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

Wypróbuj online.

Zobacz moją wskazówkę 05AB1E (sekcje Jak korzystać ze słownika? I Jak kompresować duże liczby całkowite? ), Aby zrozumieć, dlaczego •2íЕjest 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’jest "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂjest "score"i „ŒÂ‚¡jest "score after".

PS / EDYCJA: Zdaję sobie sprawę, że używając þzakładam, że nigdy nie dostanę negatywnego wyniku. ;)

Kevin Cruijssen
źródło