var QUESTION_ID=127261,OVERRIDE_USER=56433;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px} /* font fix */ body {font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;} /* #language-list x-pos fix */ #answer-list {margin-right: 200px;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
-n
Perl comptent-ils dans le score? Il compte généralement pour 1 octet car la distance d'édition entre le standardperl -e
etperl -ne
1 est égale à 1, mais pour ce défi, len
décompte sera-t-il pris en compte pour le comptage des doublons?n
option la plus équitable.how often this character has already occurred in the string
: je changerais probablement pourhow many times the character has occurred up to this point
préciser que la première utilisation coûte 1, et non 0Réponses:
MATL , score 4
Essayez-le en ligne!
Explication
Considérez l'entrée
'ABBA'
comme un exemple.la source
Python , score 49
Essayez-le en ligne!
Il y a un onglet après
in
.Score score:
()Camnou
S
la source
T-SQL, score
775 579!580EDIT : laissé tomber quelques variables, compacté un peu. Avec 16
@
symboles au lieu de 22, cela réduit mon score de 117 points!Joli concours, j'aime l'exigence d'optimiser autre chose que le nombre total de caractères.
La saisie s'effectue via le champ varchar q de la table z préexistante , conformément à nos règles IO . La base de données contenant cette table d'entrée doit être définie sur un classement sensible à la casse .
Formaté:
Les mots-clés SQL ne sont pas sensibles à la casse. J'ai donc utilisé une casse mixte pour minimiser le nombre de lettres en double ( aaAA génère un score meilleur / inférieur à aaaa ).
La boucle principale compare la longueur avant et après suppression de toutes les occurrences du premier caractère. Cette différence n * (n + 1) / 2 est ajoutée à un total cumulé.
La
LEN()
fonction SQL ignore ennuyeusement les espaces de fin. Je devais donc ajouter un caractère de contrôle et soustraire 1 à la fin.EDIT : Correction d'un calcul erroné de mon propre score de 2 points (problème de guillemets), réduit de 1 en changeant la casse d'un
R
. Travaillant également sur une stratégie complètement différente, je la publierai comme sa propre réponse.la source
579! ≈ 8.22 x 10^1349
C (gcc) , note:
1131031009691Merci à @ugoren, @CalculatorFeline, @gastropner, @ l4m2 et @ JS1 pour leurs conseils.
Initialise un tableau de zéros, puis utilise les valeurs ASCII des caractères de la chaîne en tant qu'indices de ce tableau pour suivre le nombre d'instances de chaque caractère de la chaîne.
Essayez-le en ligne!
la source
z
,x
,c
.char
inclutc
...\x7f
non imprimable) et ajoutez une explication.z;g(char*s){int y[238]={z=0};while(*s)z+=--y[*s++];z/=~0;}
g(char*s){int y[238]={};while(*s)*y+=--y[*s++];*y/=~0;}
JavaScript (ES6), score
8178A gagné 3 points grâce à @Arnauld
Ma solution récursive originale score-81:
la source
Haskell , score de 42
Essayez-le en ligne!
Anonymiser
\l->
donne le même score.la source
Gelée , score 6
Essayez-le en ligne!
la source
Rétine , score 34
Essayez-le en ligne!
Explication
Nous commençons par trier tous les caractères de l’entrée afin que les caractères identiques soient regroupés en un seul passage. Le
s(
active le mode ligne unique pour toutes les étapes (c.-à-d.
. Fait correspondre les sauts de ligne).L'objectif est de transformer une série de n caractères en T n caractères (la n ième nombre triangulaire) parce que c'est le score des occurrences de ce caractère. Pour ce faire, nous trouvons des correspondances qui se chevauchent. En particulier, pour chaque i dans [1, n] , nous allons inclure les caractères i-1 dans la correspondance. Nous obtenons tous ces matches en raison du drapeau qui se chevauchent
&
. Cela nous donne n * (n-1) / 2 = T n-1 = T n - n caractères seulement des correspondances. Mais l’étape du match les rejoindra avec des sauts de ligne, qui sont n flux de ligne pour nallumettes. Il n'y a qu'un seul problème. Il n'y aura pas de saut de ligne après la dernière correspondance. Le nombre total de caractères dans la sortie est donc inférieur à celui dont nous avons besoin. Nous corrigeons cela en faisant également correspondre le début de l'entrée, ce qui nous donne un seul saut de ligne s'il y a au moins une autre correspondance.Enfin, nous comptons simplement le nombre de caractères dans la chaîne.
la source
Haskell, score
52 5251Il y a un onglet entre
f
et_
.Essayez-le en ligne!
La valeur de la chaîne vide est 0. La valeur de la chaîne s, où
a
est le premier caractère etb
le reste de la chaîne est 1 plus les occurrences dea
inb
plus un appel récursif avec b.la source
J , note 16
Essayez-le en ligne!
Explication
Utiliser
1#.
au lieu de+/@
pour la somme économise quelques points et&
pourrait être utilisé au lieu de@
dans un contexte monadique pour enregistrer un autre. La répétition1
me coûte un point de plus, mais je n'ai pas réussi à m'en débarrasser.la source
R , score: 67
8395128-61 grâce aux meilleurs conseils de Giuseppe
Essayez-le en ligne!
La chaîne est divisée en utilisant
utf8ToInt
et chaque valeur ASCII est comptéetable
. Le résultat est calculé en utilisant une multiplication matricielle%*%
sur celle + 1 et finalement divisée par deux.la source
table
au lieu derle
; vous pouvez également vous en débarrassersort
(et vous n'avez pas à indexer[[1]]
le résultatstrsplit
)n
(puisqu'il est entréfunction
deux fois) et en changeant également(n+1)
pour{n+1}
05AB1E , score 6
Essayez-le en ligne!
la source
Pyth , score 6
1 octet grâce à isaacg.
Suite de tests.
Comment ça fonctionne
la source
s+0
est le même que+F
.usaShHGrScQ1 8Z
de 16. Pouvez-vous ajouter une explication?s/LQ
est le score 4, cela utilise-t-il des fonctionnalités postérieures au défi?J , score:
14 1211Essayez-le en ligne!
la source
$
.1#.2!1+1#.=
Gelée , score de 7
Explication:
Essayez-le en ligne!
la source
C, 60 octets, score
10895Essayez-le en ligne!
Généralement, les opérateurs avant et après l’incrément sont parfaits pour le golf de code, mais ils font vraiment mal à ce défi!
EDIT: En soustrayant les comptes négatifs au lieu d’en ajouter des positifs, j’ai sauvé tout un tas de points. Remplacer
for()
parwhile()
un point-virgule éliminé également.la source
Perl 6 , score
61 56 53 4644L'essayer
L'essayer
L'essayer
L'essayer
L'essayer
la source
C # (.NET Core) , score (je veux dire, 209)
Essayez-le en ligne!
Le score comprend les éléments suivants:
la source
return w*(w+1)/2
enreturn-~w*w/2
(score 196). EDIT: Vous pouvez créer un portage de ma réponse Java 8 pour un score de 149 :using System.Linq;b=>{int[]x=new int[256];return\nb.Select(z=>++x[z]).Sum();}
essayez-le en ligne.b=>{var x=new int[256];return\nb.Sum(z=>++x[z]);}
Gelée , score 5
Essayez-le en ligne!
Merci à Leaky Nun pour -2 (précédemment sur sa réponse )
la source
ĠJ€ẎS
PowerShell, score 64
(Le score est basé sur un saut de ligne simple, ce qui n’est pas une norme Windows, mais fonctionne en mode PS).
@{}
$args
est un tableau de paramètres - dans ce cas, la chaîne d'entrée en fait un tableau à un seul élément;|%
effectue une boucle foreach sur les éléments et utilise legetE*
raccourci pour faire correspondre laGetEnumerator()
méthode string et l'appeler pour transformer la chaîne en flux de caractères.|%
boucle sur les caractères et incrémenter leur entrée hashtable, l'ajouter à un total en cours d'exécution. Le($x+=1)
formulaire avec parent modifie à la fois la variable et génère la nouvelle valeur à utiliser.(Quand je l'ai écrit pour la première fois, c'était
$c=@{};$t=0;[char[]]"$args"|%{$c[$_]++;$t+=$c[$_]};$t
avec un score de 128, et je pensais que ça ne baisserait pas beaucoup. Réduire de moitié le score à 64, c'est très agréable).la source
Julia 0.6 , 45 bytes, Score: 77
Inspiré par la solution MATL:
Essayez-le en ligne!
Une solution moins jolie, en utilisant des comptes:
Julia 0.6 , score de 82
Essayez-le en ligne!
Merci à Guiseppe pour avoir souligné le pointage et les conseils. Ces commentaires m'ont aidé énormément.
la source
(x+1)
par[x+1]
pour réduire davantage le score.[x+1]
au lieu de l'(x+1)
abaisser à un score de 98 .Java 10, score:
149138137134133 133130103102101100( Octets:
72737475646261 ) Lesoctets montent, mais le score baisse. :RÉ-28 score (et -11 octets) grâce à @Nevay .
-1 score (et -2 octets) grâce à @ OlivierGrégoire .
-1 score (et -1 octet) en convertissant Java 8 en Java 10.
Explication:
Essayez ici.
la source
~
si vous utilisezj=0
etreturn-j;
(133).x->{int[]q=new int[256];return\nx.chars().map(v->++q[v]).sum();}
j
au lieu deu
(return
contientu
) et une nouvelle ligne et un onglet au lieu des espaces. EDIT: Hehe, vous avez édité juste quand j'ai fait ce commentaire. :)F #, score
120118-2 grâce à Kevin Cruijssen !
Essayez-le en ligne!
Prend un
string
comme une entrée.Seq.countBy
associe chaque caractère distinct avec son compte (id
est la fonction identité) pour vous retrouver avec une collection comme'a' = 4, 'b' = 2
etc.Le
Seq.sumBy
prend le compte pour chaque lettre et additionne tous les nombres du0
compte pour cette lettre. Donc, si'a' = 4
la collection serait ce0, 1, 2, 3, 4
qui est résumé est10
. PuisSeq.sumBy
additionne tous ces totaux.la source
let q
surlet j
, car leq
est déjà utilisé dans les deux casSeq
.APL (Dyalog) , note 15
Essayez-le en ligne!
⍞
obtenir la saisie de texte∘.=⍨
table d'égalité avec soi+\
somme cumulée sur1 1⍉
diagonale (lit. réduit les deux dimensions en une dimension)+/
sommela source
Retina , score
684543Essayez-le en ligne! Le lien montre le score. Edit: Merci à @MartinEnder qui a enregistré 20 octets en utilisant des correspondances superposées au lieu d’indicatifs et trois octets supplémentaires en regroupant les étapes de sorte que le
s
drapeau ne doit être appliqué qu’une seule fois. A enregistré deux autres octets en calculant le nombre triangulaire différemment, en évitant le besoin d'un tri.la source
PHP , 45 octets, Score 78
Essayez-le en ligne!
PHP , 46 octets, Score 79 octets
Essayez-le en ligne!
PHP , 56 octets, score 92
Essayez-le en ligne!
la source
Score Perl 5
9183Utilise le
-p
drapeau qui ajoute 2 à cause du p en split.la source
$` is automatically
printed after each call so we can use that to store the score and
/./ g` renvoie une liste de tous les caractères$_
, ce qui est moins cher quesplit//
.Octave , 39 bytes, Score 69
Essayez-le en ligne!
Bien qu'il y ait une autre réponse Octave, celle-ci est entièrement la mienne et constitue une approche différente. En plus, elle marque moins :).
L’approche se résume à la première recherche du nombre (b) de chaque caractère unique, obtenu à l’aide de la fonction histogramme. Ensuite, pour chaque élément, nous calculons la somme de 1 à b qui est effectuée à l'aide de la formule
(b*(b+1))/2
. Ensuite, les sommes individuelles sont toutes additionnées dans le score final.Lors des tests, il semble que les consoles coûtent très cher car beaucoup d’entre elles sont nécessaires. J'ai optimisé le score initial d'environ 88 en réorganisant les questions afin de minimiser le nombre de crochets ouverts / fermés - nous passons donc maintenant à la valeur / 2 sur le total final plutôt qu'individuellement, et j'ai également modifié la formule pour
(b^2+b)/2
car cela nécessite moins de crochets.la source
error: hist: subscript indices must be either positive integers less than 2^31 or logicals
Common Lisp, score
286232222Score élevé en raison de la syntaxe verbeuse des opérateurs intégrés de Common Lisp.
Essayez-le en ligne!
Le code non-golfé:
la source
Mathematica, score 54
contribution
grâce à hftf
la source
Total[#(#+1)/2&@Counts@Characters@#]&
scores 54.