Quelle langue est la plus courte?

25

Créez un programme qui trouve les 50 derniers défis avec le -tag qui a au moins 20 réponses. Ensuite, extrayez les scores de chaque langue dans chacun des défis. S'il y a plus d'une réponse dans la même langue, comptez tous les scores. Ensuite, prenez les 20 langues les plus courantes et affichez une liste avec les noms de langues, le nombre de réponses, le nombre moyen d'octets et le nombre médian d'octets. La liste doit être triée par nombre de réponses, par ordre décroissant.

Vous devez tenir compte des variations de capitalisation (par exemple: Matlab = MATLAB).

Dans les langues avec plusieurs numéros de version différents (par exemple Python), comptez-les comme des langues uniques, donc: Python != Python 2 != Python 2.7 != Python 3.x

Exemple de sortie (le format de sortie est facultatif):

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

Formats d'en-tête qui doivent être pris en charge:

  • Commence par # Language name,ou#Language name
  • Se termine par xx bytes, xx Bytesou tout simplementxx
  • Il peut y avoir beaucoup de déchets entre la première virgule et le dernier numéro.
  • Si le nom de la langue est un lien ( [Name](link)), il peut être ignoré

Si la réponse a un autre format d'en-tête, vous pouvez choisir de l'ignorer (ou de l'inclure si votre code peut le gérer).

Par exemple, tous les en-têtes ci-dessous doivent être pris en charge:

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

Règles:

  • Vous pouvez utiliser l'API ou simplement l'URL du site Web
    • Les éléments suivants peuvent être extraits du nombre d'octets (rien d'autre), donc pas besoin d'utiliser un raccourcisseur d'URL (maximum 44 octets):
      • https://(ou http://)
      • codegolf
      • .stackexchange.com
      • /questions
  • Le programme peut prendre une entrée. L'entrée sera incluse dans le nombre d'octets.

En dehors de cela, des règles standard s'appliquent.

Stewie Griffin
la source
11
Je pourrais vous dire que c'est Pyth sans avoir à relever ce défi du tout.
Alex A.
1
le suffixe "octets" est-il commun, encore moins universel, suffisant pour l'exiger?
Sparr
@StewieGriffin Je pense que Sparr dit que, bien que cela soit courant , il n'est pas toujours utilisé.
Celeo du
Pour autant que je puisse voir, xx bytesest très courant sur les défis récents (au moins depuis la création de l'extrait de classement).
Stewie Griffin
2
J'utilise habituellement des "caractères" ou des "caractères" au lieu de "octets"
Poignée de porte

Réponses:

13

R, 821 - 44 = 777 octets

Résultats mis à jour : veuillez consulter l'historique des modifications pour comprendre tous les commentaires ci-dessous.

           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

Le code, que je pourrais raccourcir un peu plus:

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
la source
6
Quelle est la longueur moyenne de C # sur 6000 octets?
SuperJedi224
@ SuperJedi224 - Il pourrait y avoir des soumissions extrêmement longues qui faussent la moyenne. C'est pourquoi la médiane est une statistique utile car elle résiste aux valeurs aberrantes.
1
J'ai lu quelque part que C # est le langage le moins jouable au golf. Maintenant je sais pourquoi ...
ev3commander
@ ev3commander - C # pâle par rapport à Unary ...
Comintern
@Comintern: Eek ...
ev3commander
6

Python 2, 934 - 44 (contenu URL) = 890 octets

Utilisation de l'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]

Notez que ce code ne fait pas attention à la limitation de l'API.

Sortie:

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
la source
1
@StewieGriffin Fait intéressant, j'ai dû ajouter une barre oblique supplémentaire à la deuxième requête récursive pour bénéficier de la /questionsréduction.
pppery du
2
Les différences sont dues au fait que @flodel n'autorise pas les suffixes autres quebytes , tandis que le mien gérera d'autres suffixes comme chars.
pppery
Est-il possible que votre code combine C, C # et éventuellement C ++? Il semble peu probable qu'il y ait 73 réponses C.
Stewie Griffin
Non je ne pense pas. Je termine le nom de la langue sur la première virgule.
pppery
1
On dirait que l=re.sub("# ?|,","",l)c'est ce qui remplace C # par C.
flodel