Stack Exchange Vote Counter


40

เขียนโปรแกรม / ฟังก์ชั่นที่ส่งคืนจำนวนโหวตของคำตอบสแต็ก Exchange 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 แม้ว่าลูกค้าจะไม่สนับสนุน
Dennis

13
"โปรแกรม / ฟังก์ชั่นของคุณอาจใช้เฉพาะแหล่งที่มาของตัวเองเป็นจุดอ้างอิงถึงจำนวนการลงคะแนน" ค่อนข้างสับสน นี่หมายความว่าคำตอบควรพยายามระบุตัวเองโดยใช้ความรู้เกี่ยวกับรหัสของตัวเองเท่านั้นและไม่ผ่านสิ่งใด ๆ เช่นรหัสโพสต์ ฉันไม่คิดว่ากฎดังกล่าวจะดีเพราะใคร ๆ ก็สามารถโพสต์คำตอบใหม่ได้
FryAmTheEggman

@FryAmTheEggman ฉันใช้ความคิดเล็กน้อยในการทำลายคำตอบของคนอื่นและฉันยังคิดว่านี่เป็น KOTH ที่แหล่งข้อมูลของคุณพยายามที่จะบ่อนทำลายคำตอบอื่นแม้ว่าในท้ายที่สุดดูเหมือนว่าจะผลักดันรูปแบบมากกว่าที่ฉันต้องการ ... ฉันเพิ่มusing its own sourceบิตเพื่อป้องกันผู้ใช้จากการตั้งค่าหน้าเพื่อให้ค้นหาตัวเองได้ง่ายขึ้นโดยไม่ต้องนับจำนวนไบต์ในกรณีที่คำตอบไม่ได้ใช้วิธีการโพสต์ id
Dendrobium

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 ไบต์เพราะผมใช้วาแทนdatad
  • -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>

ป้อนรหัสลงในโบนัสและมันจะบอกคะแนน

โบนัสมากยิ่งขึ้น !! เรียกใช้ตัวอย่างนี้เพื่อเรียกใช้โปรแกรม upvote และเรียกใช้อีกครั้งโดยอัตโนมัติ ! (ต้องการตัวแทน> 15, รับรองความถูกต้อง) ถ้ามันไม่ได้ผลโปรดบอกฉันที


2
postsแทนanswersและhttpแทนที่จะhttpsบันทึกสามไบต์ (หรือบางทีคุณสามารถละเว้นได้http:ทั้งหมด?) (ไม่ผ่านการทดสอบ)
msh210

2
คุณสามารถใช้http://และมันจะเปลี่ยนเส้นทาง 301 ไปที่https://ดีขึ้นเพียงแค่ลบ http ทั้งหมด//api.stackexchange.com...
Suever

8
jQuery ไม่ใช่ภาษาไม่ใช่ไลบรารี inbuilt ใน 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โปรแกรมเมอร์จริงไม่ได้ใช้ โปรแกรมเมอร์จริงใช้Fetch API


1
อืม ... คุณพาฉันไปที่นั่น ฉันไม่เคยรู้เกี่ยวกับ API นี้!
Conor O'Brien

ฉันได้รับข้อผิดพลาดที่fetchไม่ได้กำหนดไว้
Anthony Pham

1
@PythonMaster API การดึงข้อมูลยังไม่พร้อมใช้งานในเบราว์เซอร์ทั้งหมด: caniuse.com/#feat=fetch
จอร์แดน

21

Bash, 80 79 75 69 ไบต์

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

เพื่อวัตถุประสงค์ในการให้คะแนน\tควรถูกแทนที่ด้วยอักขระ TAB

สิ่งนี้ต้องการw3mซึ่งควรจะมีให้โดยปริยายบน Linux distros ส่วนใหญ่

ขอบคุณ @NoOneIsHere สำหรับ 2 ไบต์!

มันทำงานอย่างไร

w3mเป็นเว็บเบราว์เซอร์บรรทัดคำสั่ง มันสอบถาม URL และ (ปกติ) แสดงเนื้อหาในรูปแบบที่อ่านได้ ที่นี่เราเพียงแค่ใช้ (ab) เพื่อหลีกเลี่ยงการเรียกไปzcatที่curlต้องการเนื่องจาก SE ทำหน้าที่ตอบสนองต่อ API ที่บีบอัด gzip

tr ,: \^Iแทนที่คอมมาและโคลอนทั้งหมดด้วยแท็บซึ่งเป็นcutตัวคั่นฟิลด์เริ่มต้น

ในที่สุดก็cut -f20ลบทุกอย่างยกเว้นฟิลด์ที่ยี่สิบซึ่งเป็นการนับคะแนน


หรือ--compressedซึ่งนานกว่าzcatนั้น
Neil

9

JavaScript ES6, 175 165 160 145 ไบต์

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณเครื่องมือเพิ่มประสิทธิภาพและสกุลหวาย! พวกเขาทั้งหมดทวีคูณของห้า!

ใช้ javascript ol ธรรมดา ใครต้องการไลบรารี่ที่เปิดใหม่ โปรแกรมเมอร์จริงใช้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"))for -5 bytes
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.

มันอัศจรรย์มาก. คุณรู้ได้อย่างไรว่าภาษานี้สามารถทำได้
Adnan

3
มันเป็นทางแยก CJam ฉันเขียนคำตอบของฉันใน CJam (67 ไบต์) แต่แล้วฉันจำได้ว่า Convex มีการบีบอัดสตริงในตัว
Dennis

5

05AB1E , 89 87 81 ไบต์

ขอบคุณ Python ...

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

ใช้การเข้ารหัสCP-1252



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 แยกสตริงที่ colons และเครื่องหมายจุลภาค
  • องค์ประกอบที่ 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];

รับโพสต์ทั้งหมดและแยกการนับคะแนนด้วย regex (อย่าแยก HTML ด้วย regex!)

Ungolfed:

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

   echo $v[1];

คุณสามารถลบได้http:ไหม
NoOne อยู่ที่นี่

@ 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 / แก้ไข: ฉันรู้ว่าโดยใช้þฉันคิดว่าฉันจะไม่ได้รับคะแนนลบ ;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.