var QUESTION_ID=59192,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/61321/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}
<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>Size</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>
Réponses:
J, 5 octets
Essayez en ligne sur J.js .
Comment ça marche
/\
est un adverbe (fonction qui prend un argument de gauche) qui se réduit cumulativement par son argument.Ainsi
+/\
est le verbe de somme cumulative .^:
est la conjonction de pouvoir ;(f ^: n) y
s'appliquef
un total den
fois ày
.Le train de conjonction verbale
+/\^:
forme un adverbe qui se répète+/\
autant de fois que spécifié dans son argument (gauche).x (+/\^:) y
est analysé en tant que(x (+/\^:)) y
, ce qui équivaut à l'exécution(+/\^:x) y
.Merci à @Zgarb pour son aide avec l'explication.
la source
Mathematica, 19 octets
Eh bien, si les fonctions intégrées sont correctes ...
Définit une fonction avec la même signature que les exemples du défi. Je suis à peu près sûr, grâce au nom long,
Accumulate
que cela sera facilement battu par les langues de golf et la famille APL. :)Pour développer le commentaire de LegionMammal978 pour ceux qui ne connaissent pas Mathematica:
##
représente une séquence des paramètres de la fonction (qui est comme une liste qui se "répartit" automatiquement là où elle est insérée, si vous connaissez mieux ce terme dans la langue de votre choix). Il~
s'agit de sucre syntaxique pour l'invocation de la fonction infixe, donc si nous appelons la fonction avec des paramètreslist
etn
que nous développons tout, nous obtenons:Ce qui se trouve être exactement l'ordre des arguments attendu par
Nest
.la source
SlotSequence
...Haskell,
2623 octetsCeci définit une fonction anonyme, appelée comme suit:
Merci à @nimi d'avoir économisé 3 octets.
Explication
la source
(!!).iterate(scanl1(+))
.APL,
98 octetsCeci définit une fonction dyadique qui accepte les itérations et la liste comme arguments gauche et droit.
Merci à @NBZ d'avoir joué sur 1 octet!
Essayez-le en ligne sur TryAPL .
Comment ça marche
⍺
et⍵
sont les arguments gauche et droit de la fonction.+\
est cumulativement réduit de somme.⍣⍺
répète les⍺
temps opérateur précédents .⊢⍵
applique la fonction d'identité à⍵
.Il s'agit d'une façon plus courte d'analyser le code au
(+\⍣⍺)⍵
lieu de+\⍣(⍺⍵)
.En conjonction, nous appliquons
+\
un total de⍺
fois à⍵
la source
+\⍣⎕⊢⎕
acceptable? (⎕
c'est comme Pythoninput()
).⎕
suite.Matlab, 41 octets
Assez simple. Je pense toujours qu'il est assez ennuyeux de ne pas avoir une manière intégrée de créer des fonctions anonymes définies par morceaux ou des ancres dans les récursions.
Non golfé:
la source
JavaScript (ES6) 38
Étonnamment petit en utilisant récursivement .map
la source
K,
73 octetsTrès similaire à la solution J.
+\
effectue avec précision une somme partielle, et lorsqu'il/
est fourni avec un verbe monadique et un argument de gauche entier, il itère un nombre spécifié de fois, comme une boucle "for". Le reste est juste en train de l'envelopper soigneusement pour l'adapter à l'ordre des arguments.Testé à Kona et oK .
Modifier:
Si je suis autorisé à inverser les arguments, comme l'a déterminé @ kirbyfan64sos, je peux me passer entièrement de la fonction wrapping:
Appelé comme:
Cela fonctionne correctement en k2.8 et en k5. Cela ne fonctionne pas en ok car cet interprète ne prend pas encore en charge les adverbes au curry (aka "projetés"), et il ne semble pas fonctionner correctement dans Kona pour des raisons moins claires.
edit : Il y a quelques jours, la
+\/
formulation fonctionne également en oK.la source
3 +\/ -3 4 7 -1 15
fonctionne très bien dans Kona, mais vous ne pouvez pas l'affecter à une fonction. Bizarre ...3+\/-3 4 7 -1 15
la même chose que+\/[3;-3 4 7 -1 15]
- me fait me demander s'ils traitent les premiers comme un cas syntaxique spécial.Pyth, 9 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication
la source
Julia, 29 octets
Cela n'a vraiment pas besoin de beaucoup d'explications. C'est une fonction récursive, si
y==0
alors il suffit de sortir x. Sinon, décrémentez y, effectuez un cumsum et recommencez. Probablement pas la solution Julia la plus golfée possible, je travaille toujours dessus.la source
Labyrinthe , 73 octets
Cela fait un moment que je n'ai pas répondu à quelque chose dans Labyrinth, et cela semblait faisable. :)
Le format d'entrée est une liste plate avec le nombre d'itérations en premier (puis la liste à laquelle appliquer les sommes partielles). Les délimiteurs ne comptent pas tous, tant qu'il n'y a pas de caractère après le dernier entier, vous pouvez donc utiliser quelque chose de lisible comme:
La sortie est séparée par des sauts de ligne:
la source
R, 75 octets
C'est long mais une prise différente ... calculer directement la séquence souhaitée au lieu des sommes cumulées:
Notant que les coefficients des termes de xi pour cumsum ^ n (x) sont des diagonales du triangle de Pascal. c'est à dire
modifier: pour créer une fonction
la source
Python 2, 67
Cela utilise la même somme qu'Anthony Roitman et la même récursivité que Morgan Thrapp .
J'ai développé cette solution avant de voir la leur, puis il m'a semblé plus facile de la poster comme réponse plutôt que comme commentaire à l'un d'eux ou aux deux.
la source
Python,
113938976 octetsCela fonctionne pour les deux cas de test. Merci à Status, Morgan Thrapp et Ruth Franklin de m'avoir aidé à jouer le programme à 93, 89 et 76 octets respectivement.
la source
k=[sum(l[:j+1])for j in range(len(l))]
. Ensuite, avec;k=l
clouée à la fin de cela, vous pouvez pousser tout cela sur une seule ligne avec lafor i
boucle.k=[sum(l[:j+1])for j in range(len(l))];l=k
sur la même ligne que la boucle for pour enregistrer 2 octets et supprimer l'espace entre les arguments de f pour enregistrer un autre octet.i
, vous pouvez remplacerfor i in range(n)
parfor i in[0]*n
(car vous ne vous souciez que de la longueur et non des éléments de la liste). Et je pense que vous pouvez le faire sans utiliser la liste auxiliairek
, en modifiant simplement l'argumentl
.Gol> <> 0.3.10 , 22 octets
Le premier entier est considéré comme le numéro d'itération et les autres constituent la liste. La liste finale est sortie séparée par des sauts de ligne.
La langue est encore assez jeune et instable, mais comme je suis assez attaché à ces opérateurs, j'ai pensé que ça allait.
Explication
Pour voir pourquoi cela fonctionne, essayons un petit exemple
[5 2 1]
:la source
Python, 52 octets
Une fonction récursive qui récursive à la fois sur la liste
l
et le nombre d'itérationsn
. Décomposons-le.Tout d'abord, considérons une fonction récursive
g
qui a répété la somme partielle une seule fois.Pour une liste vide
l
, cela renvoiel
lui-même, la liste vide. Sinon, la dernière entrée des sommes partielles del
est la somme globale del
, qui est ajoutée au résultat récursif pour tous sauf le dernier élément del
.Maintenant, regardons une fonction
f
qui s'appliqueg
auxn
itérations.Quand
n
est0
, cela renvoie la listel
inchangée, et sinon, s'appliqueg
une fois, puis appellef
récursivement avec une itération de moins restante.Maintenant, regardons à nouveau le code réel, qui combine les deux récursions en une seule fonction. L'idée est de traiter
g(l)
comme le cas particulierf(l,1)
.Nous avons repris
f(g(l),n-1)
de la définition précédente, développég(l)
eng(l[:-1])+[sum(l)]
, puis remplacég(_)
parf(_,1)
pour limiter les appels récursifs àf
.Pour le cas de base, nous voulons revenir
l
chaque fois quen==0
oul==[]
. Nous les combinons en notant que l'un ou l'autre faitn*l
être la liste vide, qui est Falsy. Ainsi, nous récursions chaque fois qu'iln*l
n'est pas vide et revenonsl
autrement.Même s'il y a deux appels récursifs à
f
, cela ne provoque pas une explosion exponentielle de la définition récursive des nombres de Fibonacci, mais reste quadratique.la source
C ++ (61 + 17 = 78 octets)
Cas de test:
Cela prend une légère liberté avec la spécification: il utilise un tableau de style C, en passant des pointeurs vers le début et la fin du tableau. En interne, comme vous pouvez le voir, ce n'est qu'un wrapper extrêmement fin autour
std::partial_sum
de la bibliothèque standard. Plutôt que de renvoyer réellement la valeur résultante, il modifie simplement le tableau transmis.Si cela ne nous dérange pas de pousser les définitions des choses à la limite (et, sans doute, un peu au-delà), nous pouvons définir une "fonction" dans une expression lambda:
Cela réduit la définition de la fonction (objet semblable à) à cette pièce:
... pour 40 octets (+17 pour le
#include
).la source
CJam, 13 octets
Testez-le ici.
la source
Haskell,
5247 octetsPremière tentative de golf de code, et je suis vraiment un débutant Haskell, donc les commentaires sont les bienvenus! Il n'était pas clair dans la question quant au format nécessaire de l'appel de fonction, ou s'il était pris par un argument dans le programme, j'ai donc utilisé le point d'exclamation comme identificateur de fonction pour économiser quelques espaces.
Utilisation (GHCi):
la source
0!a=a
i!a=...
.sum(take j a)
, vous pouvez éviter les parens en faisantsum$take j a
, en utilisant la haute priorité de$
.$
cela prendrait le pas sur la syntaxe (et que j'essayais d'évaluer le reste de la ligne en l'état). Bien sûr, cela n'aurait même aucun sens.R, 41 octets
la source
C #, 52 + 85 =
148137 octetset
Il utilise des pratiques peu orthodoxes (
v=>t+=v
), mais c'est PPCG. Notez également la contrainte de profondeur de pile.la source
Python 3, 73
Pourrait probablement être joué un peu plus loin.
Cette version utilise numpy, qui ressemble un peu à de la triche, mais la voici:
Python 3 (avec numpy), 72
la source
C ++ 14
10210394 + 17 (inclus) = 111 octetsNon golfé, avec cas de test
Dépend de l'ordre d'évaluation. Je ne sais pas si c'est UB ou non, maisçamarcheCela dépend du compilateur, donc je l'ai changé.la source
j
de 0 à n, compte àn
rebours jusqu'à 0. Donne 97 octets par mon compte.Octave, 24 octets
la source
Burlesque, 10 octets
ce n'est pas très efficace en général mais ça fait l'affaire.
la source
C ++ 14, 67 octets
Comme lambda sans nom modifiant son entrée, nécessitant
c
comme un conteneur à accès aléatoire commevector<int>
.la source
05AB1E , 4 octets (probablement non concurrents)
Essayez-le en ligne!
la source
Gelée , 3 octets
Essayez-le en ligne!
C'est ma méthode (celle de M. Xcoder ).
Gelée , 3 octets
Essayez-le en ligne!
C'est la solution de caird coinheringaahing .
Méthode n ° 1
Méthode n ° 2
la source
Axiome
21347 octetsungolf et un exemple
la source