ภาษาใดที่สั้นที่สุด


25

สร้างโปรแกรมที่ค้นหาความท้าทายล่าสุด 50 รายการด้วยแท็กที่มีคำตอบอย่างน้อย 20 คำ จากนั้นแยกคะแนนสำหรับแต่ละภาษาในแต่ละความท้าทาย หากมีคำตอบมากกว่าหนึ่งคำตอบที่ใช้ภาษาเดียวกันให้นับคะแนนทั้งหมด หลังจากนั้นให้ใช้ภาษาที่พบมากที่สุด 20 อันดับแรกและส่งออกรายการที่มีชื่อภาษาจำนวนคำตอบจำนวนไบต์เฉลี่ยและจำนวนไบต์เฉลี่ย รายการควรเรียงตามจำนวนคำตอบเรียงจากมากไปน้อย

คุณต้องคำนึงถึงความผันแปรในการใช้อักษรตัวพิมพ์ใหญ่ (เช่น: Matlab = MATLAB)

ในภาษาที่มีหมายเลขรุ่นต่าง ๆ มากมาย (เช่น Python) ให้นับเป็นภาษาที่ไม่ซ้ำดังนั้น: Python != Python 2 != Python 2.7 != Python 3.x

ตัวอย่างเอาต์พุต (รูปแบบเอาต์พุตเป็นทางเลือก):

cJam,       66,  12.4,  8.5
Pyth,       58,   15.2,  19
Ruby,       44,   19.2,  22.5
Python,     34,   29.3,  32
Python 2.7, 22,   31.2,  40
...
...
Java,       11,   115.5, 94.5

รูปแบบส่วนหัวที่ต้องรองรับ:

  • เริ่มต้นด้วย# Language name,หรือ#Language name
  • จบลงด้วยxx bytes, xx Bytesหรือเพียงแค่xx
  • อาจมีขยะจำนวนมากระหว่างเครื่องหมายจุลภาคแรกและหมายเลขสุดท้าย
  • หากชื่อภาษาเป็นลิงค์ ( [Name](link)) ก็สามารถข้ามได้

หากคำตอบมีรูปแบบส่วนหัวอื่นคุณสามารถเลือกข้ามได้ (หรือรวมไว้หากรหัสของคุณสามารถจัดการได้)

ตัวอย่างเช่นส่วนหัวด้านล่างทั้งหมดต้องได้รับการสนับสนุน:

# Language Name, N bytes
# Ruby, <s>104</s> <s>101</s> 96 bytes 
# Perl, 43 + 2 (-p flag) = 45 Bytes
# MATLAB, 5

กฎ:

  • ไม่เป็นไรที่จะใช้ API หรือเพียงแค่ URL เว็บไซต์
    • สามารถดึงข้อมูลต่อไปนี้จากจำนวนไบต์ (ไม่มีอะไรอื่น) ดังนั้นไม่จำเป็นต้องใช้ตัวย่อ URL (สูงสุด 44 ไบต์):
      • https://(หรือhttp://)
      • codegolf
      • .stackexchange.com
      • /questions
  • โปรแกรมสามารถรับอินพุต อินพุตจะรวมอยู่ในจำนวนไบต์

นอกจากนั้นจะใช้กฎมาตรฐาน


11
ฉันบอกได้เลยว่ามันคือ Pyth โดยไม่ต้องทำสิ่งนี้เลย
Alex A.

1
ส่วนต่อท้าย "bytes" เป็นเรื่องทั่วไปหรือไม่และเป็นสากลมากพอที่จะต้องการหรือไม่
Sparr

@StewieGriffin ฉันคิดว่า Sparr กำลังพูดว่าในขณะที่เป็นเรื่องปกติแต่ก็ไม่ได้ใช้เสมอ
Celeo

เท่าที่ฉันเห็นxx bytesเป็นเรื่องธรรมดามากในความท้าทายล่าสุด (อย่างน้อยก็ตั้งแต่สร้างตัวอย่างกระดานแต้มนำ)
Stewie Griffin

2
ฉันมักจะใช้ "ตัวอักษร" หรือ "ตัวอักษร" แทน "bytes"
Doorknob

คำตอบ:


13

R, 821 - 44 = 777 ไบต์

อัปเดตผลลัพธ์ : โปรดดูประวัติการแก้ไขเพื่อให้เข้าใจถึงความคิดเห็นทั้งหมดด้านล่าง

           language num_answers avg_count median_count
1              RUBY          49  49.97959         30.0
2              CJAM          48  32.64583         22.0
3              PYTH          48  21.02083         14.0
4          PYTHON 2          46  86.78261         77.0
5             JULIA          43  58.90698         45.0
6           HASKELL          41  74.65854         56.0
7               PHP          40  73.52500         48.0
8              PERL          36  53.30556         34.0
9          PYTHON 3          34  90.91176         90.5
10       POWERSHELL          33  60.24242         44.0
11                C          32 221.84375         79.5
12                R          32  77.40625         62.5
13             JAVA          29 170.68966        158.0
14 JAVASCRIPT (ES6)          29  90.79310         83.0
15       JAVASCRIPT          28  68.39286         61.0
16               C#          25 193.92000        130.0
17      MATHEMATICA          23  56.04348         47.0
18           MATLAB          22  67.45455         55.0
19         TI-BASIC          19  47.05263         37.0
20              APL          18  16.55556         15.0

รหัสซึ่งฉันสามารถทำให้สั้นลงอีกเล็กน้อย:

W=library;W(XML);W(plyr)
X=xpathSApply;Y=xmlValue;D=data.frame;H=htmlParse;S=sprintf
Z="http://codegolf.stackexchange.com/"
R=function(FUN,...)do.call(rbind,Map(FUN,...))
G=function(url){d=H(url)
a=as.double(sub(".*?(\\d+)a.*","\\1",X(d,"//div[starts-with(@class,'status')]",Y)))
u=paste0(Z,X(d,"//*[contains(@class,'question-hyperlink')]",xmlGetAttr,"href"))
D(u,a)}
u=S("%s/questions/tagged/code-golf?page=%i",Z,1:50)
q=R(G,u)
u=with(q,head(u[a>20],50))
A=function(url){u=S("%s?page=%i",url,1:10)
f=function(u){d=H(u)
h=X(d, "//div[@class='post-text']//h1",Y)
p="^(.*?),.*? (\\d+)( [Bb]ytes)?$"
k=grep(p,h,v=T)
l=toupper(sub(p,"\\1",k))
c=as.double(sub(p,"\\2",k))
D(l,c)}
R(f,u)}
a=R(A,u)
L=names(tail(sort(table(a$l)),20))
x=subset(a,l%in%L)
arrange(ddply(x, "l",summarise,n=length(c),a=mean(c),m=quantile(c,0.5)),-n)

De-แข็งแรงเล่นกอล์ฟ:

library(XML)
library(plyr)
LoopBind <- function(FUN, ...) do.call(rbind, Map(FUN, ...))
GetQuestions <- function(url) {
  d = htmlParse(url)
  a=as.double(sub(".*?(\\d+)a.*","\\1",xpathSApply(d, "//div[starts-with(@class, 'status')]", xmlValue)))
  u=paste0("http://codegolf.stackexchange.com/",xpathSApply(d, "//*[contains(@class, 'question-hyperlink')]", xmlGetAttr, "href"))
  data.frame(u, a)
}
u <- sprintf("http://codegolf.stackexchange.com/questions/tagged/code-golf?page=%i", 1:50)
q <- do.call(rbind, Map(GetQuestions, u))
u <- with(q, head(u[a > 20], 50))

GetAnswers <- function(url) {
  u=sprintf("%s?page=%i",url,1:10)
  f=function(u) {
    d = htmlParse(u)
    h = xpathSApply(d, "//div[@class='post-text']//h1", xmlValue)
    p = "^(.*?),.*? (\\d+)( [Bb]ytes)?$"
    k = grep(p,h,v=T)
    l = toupper(sub(p,"\\1",k))
    c = as.double(sub(p,"\\2",k))
    data.frame(language=l,c)
  }
LoopBind(f,u)
}
a=LoopBind(GetAnswers, u)
L=names(tail(sort(table(a$l)),20))
x=subset(a,language%in%L)
arrange(ddply(x, "language", summarise, num_answers = length(c), avg_count = mean(c), median_count = quantile(c,0.5)),
        -num_answers)

6
ความยาวเฉลี่ยสำหรับ C # มากกว่า 6000 ไบต์เป็นเท่าใด
SuperJedi224

@ SuperJedi224 - อาจมีการส่งที่ยาวมาก ๆ ซึ่งบิดเบือนค่าเฉลี่ย นั่นเป็นเหตุผลที่ค่ามัธยฐานเป็นสถิติที่มีประโยชน์เพราะมันทนทานต่อค่าผิดปกติ

1
ฉันอ่านบางที่ C # เป็นภาษาที่เล่นได้น้อยที่สุด ตอนนี้ฉันรู้แล้วว่าทำไม ...
ev3commander

@ ev3commander - C # pales เปรียบเทียบกับUnary ...
Comintern

@Comintern: Eek ...
ev3commander

6

Python 2, 934 - 44 (url stuff) = 890 bytes

ใช้ API:

from urllib2 import urlopen as u
from gzip import GzipFile as f
from StringIO import StringIO as s;x="https://api.stackexchange.com/2.2%s&site=codegolf"
import re;j=u(x%'/search/advanced?pagesize=50&order=desc&sort=creation&answers=20&tagged=code-golf');q=s(j.read());g=f(fileobj=q);true=1;false=0;l=';'.join(str(a['question_id'])for a in eval(g.read())['items']);w=[]
def r(p):
 j=u(x%('/questions/%s/answers?page=%s&filter=!9YdnSMlgz&pagesize=100'%(l,p)));g.seek(0);q.truncate();q.write(j.read());q.seek(0);k=eval(g.read());w.extend(a['body_markdown']for a in k['items'])
 if k['has_more']:r(p+1)
r(1);x={};s=sorted
for m in w:
 try:
  l,n=re.match("(.*?),.*?([0-9]+)[^0-9]*$",m.splitlines()[0]).groups();l=re.subn("# ?","",l,1)[0].upper()
  if l not in x:x[l]=[]
  x[l]+=[(l,int(n))]
 except:pass
for l in s(x,cmp,lambda a:len(x[a]),1)[:20]:
 v=s(x[l])
 print l,len(v),sum(map(lambda a:a[1],v))/len(v),v[len(v)/2][1]

โปรดทราบว่ารหัสนี้ไม่ได้สนใจ API การควบคุมปริมาณ

เอาท์พุท:

RUBY 60 430 32
PYTH 57 426 16
CJAM 56 35 23
C 52 170 76
PYTHON 2 51 88 79
JULIA 42 63 48
HASKELL 42 81 63
JAVASCRIPT (ES6) 41 96 83
PERL 40 44 27
PYTHON 3 37 91 89
PHP 36 98 59
JAVASCRIPT 36 743 65
POWERSHELL 35 86 44
JAVA 32 188 171
R 30 73 48
MATLAB 25 73 51
MATHEMATICA 24 57 47
APL 22 14 13
SCALA 21 204 59
TI-BASIC 21 42 24

1
@StewieGriffin ที่น่าสนใจฉันต้องเพิ่มเครื่องหมายทับหนึ่งในแบบสอบถามแบบเรียกซ้ำครั้งที่สองเพื่อให้มีคุณสมบัติ/questionsลดลง
pppery

2
ความแตกต่างเพราะ @flodel ไม่อนุญาตให้ต่อท้ายอื่น ๆ กว่าbytesในขณะที่เหมืองจะจัดการต่อท้ายอื่น ๆ charsเช่น
pppery

เป็นไปได้ไหมว่ารหัสของคุณรวม C, C # และ C ++ เข้าด้วยกัน? ดูเหมือนว่าไม่น่าจะมี 73 คำตอบ
Stewie Griffin

ไม่ฉันไม่คิดอย่างนั้น ฉันสิ้นสุดชื่อภาษาในเครื่องหมายจุลภาคแรก
pppery

1
ดูเหมือนl=re.sub("# ?|,","",l)ว่าจะเป็นอะไรแทนที่ C # กับซี
flodel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.