¿Qué idioma es el más corto?

25

Cree un programa que encuentre los últimos 50 desafíos con el tag que tiene al menos 20 respuestas. Luego, extraiga los puntajes para cada idioma en cada uno de los desafíos. Si hay más de una respuesta usando el mismo idioma, cuente todas las puntuaciones. Luego, tome los 20 idiomas más comunes y genere una lista con los nombres de los idiomas, el número de respuestas, el recuento promedio de bytes y el recuento medio de bytes. La lista se debe ordenar por número de respuestas, en orden descendente.

Debe tener en cuenta las variaciones en las mayúsculas (por ejemplo: Matlab = MATLAB).

En idiomas con muchos números de versión diferentes (por ejemplo, Python), cuéntelos como idiomas únicos, de modo que Python != Python 2 != Python 2.7 != Python 3.x

Ejemplo de salida (el formato de salida es opcional):

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

Formatos de encabezado que deben ser compatibles:

  • Comienza con # Language name,o#Language name
  • Termina con xx bytes, xx Byteso simplementexx
  • Puede haber mucha basura entre la primera coma y el último número.
  • Si el nombre del idioma es un enlace ( [Name](link)), se puede omitir

Si la respuesta tiene otro formato de encabezado, puede optar por omitirlo (o incluirlo si su código puede manejarlo).

Como ejemplo, todos los encabezados siguientes deben ser compatibles:

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

Reglas:

  • Está bien usar API o solo la URL del sitio web
    • Lo siguiente se puede extraer del recuento de bytes (nada más), por lo que no es necesario utilizar un acortador de URL (máximo 44 bytes):
      • https://(o http://)
      • codegolf
      • .stackexchange.com
      • /questions
  • El programa puede tomar entrada. La entrada se incluirá en el recuento de bytes.

Aparte de eso, se aplican reglas estándar.

Stewie Griffin
fuente
11
Podría decirte que es Pyth sin tener que hacer este desafío.
Alex A.
1
¿Es común el sufijo "bytes", y mucho menos universal, suficiente para requerirlo?
Sparr
@StewieGriffin Creo que Sparr dice que, si bien es común , no siempre se usa.
Celeo
Por lo que puedo ver, xx byteses muy común en los desafíos recientes (al menos desde que se creó el fragmento de la tabla de clasificación).
Stewie Griffin
2
Usualmente uso "caracteres" o "caracteres" en lugar de "bytes"
Doorknob

Respuestas:

13

R, 821 - 44 = 777 bytes

Resultados actualizados : consulte el historial de edición para tener sentido de todos los comentarios a continuación.

           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

El código, que podría acortar un poco más:

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-golf:

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)
flodel
fuente
66
¿Cómo es la longitud promedio de C # sobre 6000 bytes?
SuperJedi224
@ SuperJedi224: puede haber algunos envíos extremadamente largos que están sesgando el promedio. Es por eso que la mediana es una estadística útil porque es resistente a los valores atípicos.
1
Leí en alguna parte que C # es el lenguaje menos golfable. Ahora sé por qué ...
ev3commander
@ ev3commander - C # palidece en comparación con Unary ...
Comintern
@Comintern: Eek ...
ev3commander
6

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

Usando la 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]

Tenga en cuenta que este código no presta atención a la limitación de API.

Salida:

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
pppery
fuente
1
@StewieGriffin Curiosamente, tuve que agregar una barra adicional a la segunda consulta recursiva para calificar para la /questionsreducción.
pppery 01 de
2
Las diferencias se deben a que @flodel no permite sufijos que no seanbytes , mientras que el mío manejará otros sufijos como chars.
pppery
¿Es posible que su código combine C, C # y posiblemente C ++? Parece poco probable que haya 73 respuestas C.
Stewie Griffin
No, no lo creo. Termino el nombre del idioma en la primera coma.
pppery
1
Parece que l=re.sub("# ?|,","",l)es lo que reemplaza C # con C.
flodel