Yığın Değişim Oy Sayacı


40

Uygulama sırasında kendi Stack Exchange cevabının oy sayısını veren bir program / işlev yazın.

  • Bununla birlikte, programınız / işleviniz bu sayfaya ( codegolf.stackexchange.com/questions/82609 ) internetten erişebilir , ancak:
  • Programınız / işleviniz kullanıcı girişi kabul etmeyebilir ve
  • URL kısaltıcıların kullanımına izin verilmiyor
  • Programınız / işleviniz yalnızca kendi kaynağını oy sayımına bir referans noktası olarak kullanabilir (örneğin: içerdiği yanıtta metne gönderme yok, ancak kendi kaynağında yok)
  • Programınız / fonksiyonunuz kendi oy sayımını ve sadece kendi oy sayımını yazmalıdır (örneğin: bu sayfada tüm oy sayımlarını geri döndürmemek)

Bu kod golf, en kısa kod kazanır.


perl -e'($_)=`curl -s http://api.stackexchange.com/2.2/posts/123?site=codegolf`;/score":(\d+)/&&print$1'çalışması gerektiği gibi görünüyor, ama çalışmıyor. Ama belki birileri bunu kullanabilir.
msh210

7
API'yi kullanmaya çalışan ve başarısız olan herkes için: Müşteri desteklemese bile, kodlanmış yanıtı gzip olarak sunar.
Dennis,

13
“Programınız / işleviniz yalnızca oy kaynağını bir başvuru noktası olarak kendi kaynağını kullanabilir” biraz kafa karıştırıcıdır. Bu, cevapların kendilerini yalnızca kendi kodlarının bilgisini kullanarak değil, bir posta kimliği gibi bir şey kullanarak tanımlamaya çalışması gerektiği anlamına mı geliyor? Böyle bir kuralın iyi olacağını düşünmüyorum, çünkü yeni bir cevap göndererek başkası tarafından kırılabilir.
FryAmTheEggman

@FryAmTheEggman Diğer insanların cevaplarını kırmak için biraz düşündüm, ve sonunda kaynağını başka bir cevabı baltalamaya çalıştığı bir KOTH yapmayı bile düşündüm. using its own sourceCevabın post id yöntemini kullanmaması durumunda, kullanıcıların bayt sayısına katkıda bulunmadan kendilerini bulmalarını kolaylaştırmak için sayfayı ayarlamalarını engellemek için biti ekledim .
Dendrobium

2
Tamam, ifadeler biraz garip. Bu şekilde belirli bir davranışa izin vermek yerine, stackexchange tarafından sağlananların yanı sıra herhangi bir web servisini doğrudan yasaklamayı önerebilirim (sizi yanlış anlamazsam). Bir yan not olarak, bütünlük sorununun doğası gereği, böyle kırılmaz bir şey yapmak mümkün değildir. Yapabileceğin en iyi şey kırılmayı olanaksız kılmak.
FryAmTheEggman

Yanıtlar:


39

jQuery + JavaScript, 85 bayt

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

Tarih

  • -6 bayt, çünkü dataonun yerine var kullanıyordum d.
  • @ Msh210 sayesinde -3 bayt
  • @ C'O'Bʀɪᴇɴ sayesinde -13 bayt
  • @ User6188402 sayesinde -4 bayt
  • @Suever sayesinde -5 bayt
  • @RobW sayesinde -4 bayt

Önerilen kullanım

  • Pasajı çalıştır.
  • Oyla.
  • Snippet'i çalıştırın ve sayı büyülü bir şekilde arttıkça hayran kalacaksınız.

Bonus!!

Kim bonus istemez?

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

Kimliğe bonusu gir ve sana skoru söyleyeceksin.

Daha da fazla bonus! Programı otomatik olarak çalıştırmak, yükseltmek ve tekrar çalıştırmak için bu pasajı çalıştırın! (Rep> 15, auth gerektirir). İşe yaramazsa, lütfen söyle bana.


2
postsyerine answersve httpyerine httpsüç bayt kaydeder (veya belki http:tamamen ihmal edebilirsiniz ?). (
Denenmemiş

2
Kullanabilirsiniz http://ve 301 https://henüz //api.stackexchange.com...
Better'a

8
jQuery bir dil değil, JS'de yerleşik bir kütüphane değildir. Yani, onu kullanıyorsanız, jQuery'nin byte sayısını puanınıza da ekleyin.
Doktor

10
@Optimizer: Bunu yapmanın doğru yolu: JS + jQuery'yi etkili bir şekilde kendi "dili" olarak düşünün. Bu meta postayı görün: meta.codegolf.stackexchange.com/a/9279/12914
El'endia Starman

3
Yerine $.getkullanın $.getJSON. API'nin içerik türü application/jsonve jQuery yanıtı otomatik olarak JSON olarak değerlendirir.
Rob W

24

JavaScript ES6, 107 bayt

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

Gerçek programcılar kullanmaz XMLHttpRequest. Gerçek programcılar Fetch API'sini kullanır .


1
Şey ... beni oraya götürdün. Bu API'yi hiç bilmiyordum!
Conor O'Brien,

fetchTanımlanmayan bir hata alıyorum
Anthony Pham

1
@PythonMaster Fetch API'sı henüz tüm tarayıcılarda mevcut değildir: caniuse.com/#feat=fetch
Ürdün

21

Bash, 80 79 75 69 bayt

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

Puanlama amacıyla, \tbir TAB karakteri ile değiştirilmelidir.

Bu w3m, çoğu Linux dağıtımında varsayılan olarak kullanılabilmesi gereken gerektirir .

-2 bayt için @ NoOneIsHere'e teşekkürler!

Nasıl çalışır

w3mbir komut satırı web tarayıcısıdır. URL'yi sorgular ve (normalde) içeriğini okunabilir bir biçimde görüntüler. Burada SE sadece gzip-sıkıştırılmış API cevabına hizmet zcatettiğinden, curlistediği çağrıyı önlemek için onu (ab) kullanıyoruz .

tr ,: \^ITüm virgül ve sütunları, cutvarsayılan alan sınırlayıcısı olan sekmelerle değiştirir .

Son olarak, cut -f20oy sayımı olan yirminci alan dışındaki her şeyi kaldırır.


Veya --compressed, bundan daha da uzun zcat.
Neil,

9

JavaScript ES6, 175 165 160 145 bayt

Doktor ve Dendrobium sayesinde kaydedilmiş lotsa bayt! Hepsi beşin katları!

Düz ol 'javascript kullanarak. Kim bu yeni çıkmış kütüphanelere ihtiyaç duyuyor? Gerçek programcılar kullanırXMLHttpRequest()

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

Test et

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 Teşekkürler! Ama neden kullandın prompt?
Conor O'Brien,

@Optimizer Bazı nedenlerden dolayı, "g"benim için bir seçenek olarak çalışmıyor.
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 bayt için
Dendrobium

@Dendrobium Oh, güzel. Ben unuttumwith
Conor O'Brien,

@Optimizer AnladımTypeError: response.split(...)[12] is undefined",
Conor O'Brien

7

bash + jq , 69 bayt

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

Kullandım curlve daha zcatönce; w3mDennis'in (dikkat çekici şekilde benzer) cevabından esinlenmiştir. Çıkıyor jqve tr/ cutaynı byte maliyetine sahip!


6

Dışbükey 0.5, 63 bayt

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>

Bu, API'yi değil, arama sayfasından, özellikle de https://codegolf.stackexchange.com/search?q=inquestion:82714 sorgusundan skoru alır . Neyse ki, inquestioncevaplar için de işe yarıyor.

Doğrulama

$ 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

Nasıl çalışır

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

Bu harika. Bu dilin bunu yapabileceğini nasıl bildin?
Adnan

3
Bu bir CJam çatalı. Cevabımı ilk olarak CJam'da (67 bytes) yazdım, ancak daha sonra Convex'in dahili string sıkıştırması olduğunu hatırladım.
Dennis,

5

05AB1E , 89 87 81 bayt

Teşekkürler Python ...

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

CP-1252 kodlamasını kullanır .


4

MATLAB, 103 bayt

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

4

JavaScript (Node.js + Unirest ), 123 bayt

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

Bu kütüphaneyi seviyorum, çünkü otomatik olarak JSON'u ayrıştırıyor.


4

Julia, 128 107 bayt

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

Bu, girdi almayan ve bu gönderinin puanını dize olarak döndüren bir işlevdir. RequestsPaketin kurulmasını gerektirir .

Nasıl çalışır:

  • get SE API’ye GET isteği gönderir
  • readall yanıtta ham baytları okur ve bir dize döndürür
  • split dizeyi virgüllere ve virgüllere böler
  • Ortaya çıkan dizinin 20. elemanı, gönderinin puanıdır

Dennis sayesinde 21 byte kurtarıldı!


4

JavaScript (Node.js), 166 Bayt

-1 bayt çünkü @ CᴏɴᴏʀO'Bʀɪᴇɴ bana nasıl sayılacağını öğretti;)

@ NoOneIsHere sayesinde -4 bayt

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)))

Bu biraz utanç verici. API'nizi gzipping için SE sallayın! / sn

Herhangi bir iyileştirme çok açığız.


3

PHP, 137 bayt

Oldukça yalındır. Sıkıştırma işlemi çok fazla bayt alır:

<?=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 bayt

Api olmadan.

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

Tüm gönderiyi alır ve oy sayımlarını regex ile alır. (HTML'yi regex ile ayrıştırmayın!)

Ungolfed:

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

   echo $v[1];

Kaldırabilir misin http:?
NoOneIsHere

@Hayır Hayır, o zaman işe görünmüyor.
nicael

1

05AB1E , 45 bayt

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

Tüm program için TIO yok, çünkü .winternete erişmek için yerleşik TIO'da çalışmaz.

Açıklama:

URL'yi oluşturarak ve ona erişerek başlarız:

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

Çevrimiçi deneyin (olmadan .w).

Bundan sonra, skoru JSON'dan alırız:

'ŒÂ        '# 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)

Çevrimiçi deneyin.

Bu ikinci bölüm için eşit 10 baytlık bir alternatif olabilir:

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

Çevrimiçi deneyin.

Benim bu 05AB1E ucu bakın (bölümler nasıl sözlüğü? Kullanmayı ve ne kadar büyük tamsayılar sıkıştırmak için? ) Anlamak için •2íЕise 190437, ’¸¸.‚‹º.ŒŒ/„¤/ÿ?€¼=ƒËŠˆ’olduğu "api.stackexchange.com/posts/ÿ?site=codegolf", 'ŒÂolduğunu "score", ve „ŒÂ‚¡bir "score after".

Not: EDIT'i kullanarak þhiçbir zaman olumsuz puan almayacağımı farz ediyorum. ;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.