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>
Respostas:
J, 5 bytes
Experimente online em J.js .
Como funciona
/\
é um advérbio (função que recebe um argumento à esquerda) que reduz cumulativamente por seu argumento.Assim
+/\
é o verbo da soma cumulativa .^:
é a conjunção de poder ;(f ^: n) y
aplicaf
um total den
vezes ay
.O trem verbo-conjunção
+/\^:
forma um advérbio que repete+/\
quantas vezes for especificado em seu argumento (esquerdo).x (+/\^:) y
é analisado como(x (+/\^:)) y
, o que é equivalente à execução(+/\^:x) y
.Obrigado a @ Zgarb por sua ajuda com a explicação.
fonte
Mathematica, 19 bytes
Bem, se os embutidos estiverem bem ...
Define uma função com a mesma assinatura que os exemplos no desafio. Tenho certeza, graças ao nome longo
Accumulate
que isso será facilmente derrotado pelas línguas do golfe e pela família APL. :)Para elaborar o comentário de LegionMammal978 para aqueles que não fazem o Mathematica:
##
representa uma sequência dos parâmetros da função (que é como uma lista que "se espalha automaticamente" onde quer que seja inserida, se você estiver mais familiarizado com esse termo do idioma de sua escolha). O~
são açúcar sintático para chamada de função infix, por isso, se nós chamamos a função com parâmetroslist
en
e expandir tudo, temos:Que passa a ser exatamente a ordem dos argumentos esperada por
Nest
.fonte
SlotSequence
... #Haskell,
2623 bytesIsso define uma função anônima, chamada da seguinte maneira:
Obrigado a @nimi por salvar 3 bytes.
Explicação
fonte
(!!).iterate(scanl1(+))
.APL,
98 bytesIsso define uma função diádica que aceita as iterações e lista como argumentos esquerdo e direito.
Obrigado a @NBZ por jogar fora um byte!
Experimente online no TryAPL .
Como funciona
⍺
e⍵
são os argumentos esquerdo e direito da função.+\
é cumulativo reduzir pela soma.⍣⍺
repete os⍺
tempos anteriores do operador .⊢⍵
aplica a função de identidade a⍵
.Esta é uma maneira mais curta de analisar o código como em
(+\⍣⍺)⍵
vez de+\⍣(⍺⍵)
.Em conjunto, aplicamos
+\
um total de⍺
vezes a⍵
fonte
+\⍣⎕⊢⎕
seria aceitável? (⎕
é como Pythoninput()
).⎕
posteriormente.Matlab, 41 bytes
Bem direto. Eu ainda acho bastante irritante não ter construído uma maneira de criar funções anônimas definidas por partes ou âncoras em recursões.
Ungolfed:
fonte
JavaScript (ES6) 38
Surpreendentemente pequeno usando .map recursivamente
fonte
K,
73 bytesMuito parecido com a solução J.
+\
executa com precisão uma soma parcial e, quando/
é fornecido com um verbo monádico e um argumento inteiro à esquerda, itera um número especificado de vezes, como um loop "for". O resto é apenas resumir tudo de acordo com a ordem dos argumentos.Testado em Kona e OK .
Editar:
Se eu puder reverter os argumentos, como @ kirbyfan64sos determinou, eu posso dispensar completamente a função wrapping:
Chamado como:
Isso funciona corretamente nos k2.8 e k5. Ele não funciona bem, pois esse intérprete ainda não suporta advérbios ao curry (também conhecidos como "projetados") e não parece funcionar corretamente no Kona por razões menos claras.
editar : Há alguns dias, a
+\/
formulação também funciona em OK.fonte
3 +\/ -3 4 7 -1 15
funciona bem no Kona, mas você não pode atribuí-lo a uma função. Estranho ...3+\/-3 4 7 -1 15
o mesmo que+\/[3;-3 4 7 -1 15]
- me faz pensar se eles lidam com o primeiro como um caso sintático especial.Pitão, 9 bytes
Experimente on-line: Demonstration or Test Suite
Explicação
fonte
Julia, 29 bytes
Isso realmente não precisa de muita explicação. É uma função recursiva; se for
y==0
, basta gerar x. Caso contrário, diminua y, execute um cumsum e execute novamente. Provavelmente não é a solução Julia mais golfe possível, ainda estou trabalhando nisso.fonte
Labirinto , 73 bytes
Já faz um tempo desde que eu respondi alguma coisa no Labyrinth, e isso parecia factível. :)
O formato de entrada é uma lista simples com o número de iterações primeiro (e depois a lista à qual aplicar as somas parciais). Os delimitadores não importam tudo, desde que não exista um caractere após o último número inteiro; portanto, você pode usar algo legível como:
A saída é separada por nova linha:
fonte
R, 75 bytes
É longo, mas uma abordagem diferente ... computando a sequência desejada diretamente em vez de somas cumulativas:
Observando que os coeficientes dos termos de xi para cumsum ^ n (x) são diagonais do triângulo de Pascal. ie
edit: para criar uma função
fonte
Python 2, 67
Isso usa o mesmo somatório de Anthony Roitman e a mesma recursão de Morgan Thrapp .
Eu desenvolvi essa solução antes de ver a deles, e então parecia mais fácil publicá-la como uma resposta do que como um comentário para um ou ambos.
fonte
Python,
113938976 bytesFunciona para os dois casos de teste. Agradeço a Status, Morgan Thrapp e Ruth Franklin por me ajudarem a reduzir o programa para 93, 89 e 76 bytes, respectivamente.
fonte
k=[sum(l[:j+1])for j in range(len(l))]
. Em seguida, com o;k=l
tacheado no final, você pode colocar tudo isso em uma linha com ofor i
loop.k=[sum(l[:j+1])for j in range(len(l))];l=k
para a mesma linha do loop for para economizar 2 bytes e remover o espaço entre os argumentos de f para salvar outro byte.i
, você pode substituirfor i in range(n)
porfor i in[0]*n
(porque tudo o que importa é o comprimento e não os elementos da lista). E acho que você pode fazer isso sem usar a lista auxiliark
, apenas modificando o argumentol
.Gol> <> 0.3.10 , 22 bytes
O primeiro número inteiro é considerado o número da iteração e o restante compõe a lista. A lista final é emitida separada por nova linha.
A linguagem ainda é bastante jovem e instável, mas, como estou bastante focada nesses operadores, pensei que tudo ficaria bem.
Explicação
Para ver por que isso funciona, vamos tentar um pequeno exemplo
[5 2 1]
:fonte
Python, 52 bytes
Uma função recursiva que recorrente tanto na lista
l
e no número de iteraçõesn
. Vamos dividir.Primeiro, vamos considerar uma função recursiva
g
que iterou a soma parcial apenas uma vez.Para uma lista vazia
l
, ela retornal
a lista vazia. Caso contrário, a última entrada dos montantes parciais del
é a soma geral del
, que é anexada ao resultado recursivo para todos, exceto o último elemento del
.Agora, vejamos uma função
f
que se aplicag
an
iterações.Quando
n
é0
, isso retorna a listal
inalterada e, caso contrário, aplica-seg
uma vez e chamaf
recursivamente com menos uma iteração restante.Agora, vejamos novamente o código real, que combina as duas recursões em uma única função. A idéia é tratar
g(l)
como o caso especialf(l,1)
.Pegamos
f(g(l),n-1)
a partir da definição anterior, expandidag(l)
emg(l[:-1])+[sum(l)]
, em seguida, substituídog(_)
porf(_,1)
para limitar as chamadas recursivas paraf
.Para o caso base, queremos retornar
l
sempre quen==0
oul==[]
. Combinamos isso observando que qualquer um deles fazn*l
da lista vazia, que é Falsy. Portanto, recursamos sempre quen*l
não estiver vazio e retornamos ol
contrário.Embora existam duas chamadas recursivas para
f
, isso não causa uma explosão exponencial na definição recursiva dos números de Fibonacci, mas permanece quadrático.fonte
C ++ (61 + 17 = 78 bytes)
Caso de teste:
Isso requer uma certa liberdade com a especificação: ele usa uma matriz no estilo C, passando ponteiros para o início e o final da matriz. Internamente, como você pode ver, é apenas um invólucro extremamente fino
std::partial_sum
na biblioteca padrão. Em vez de realmente retornar o valor resultante, apenas modifica a matriz que é passada.Se não nos importamos em levar definições de coisas ao limite (e, sem dúvida, um pouco além), podemos definir uma "função" em uma expressão lambda:
Isso reduz a definição da função (objeto semelhante) a esta peça:
... para 40 bytes (+17 para o
#include
).fonte
CJam, 13 bytes
Teste aqui.
fonte
Haskell,
5247 bytesPrimeira tentativa de código de golfe, e eu sou muito iniciante em Haskell, então os comentários são bem-vindos! Não ficou claro na pergunta sobre qualquer formato necessário da chamada de função ou se foi levado por um argumento para o programa, então usei o ponto de exclamação como identificador da função para economizar alguns espaços.
Uso (GHCi):
fonte
0!a=a
i!a=...
.sum(take j a)
, você pode evitar parêntesessum$take j a
, usando a alta precedência de$
.$
teria precedência sobre a sintaxe (e tentaria avaliar o restante da linha como está). Claro, isso nem faria sentido.R, 41 bytes
fonte
C #, 52 + 85 =
148137 bytese
Ele usa práticas não-ortodoxas (
v=>t+=v
), mas esse é o PPCG. Observe também a restrição de profundidade da pilha.fonte
Python 3, 73
Provavelmente poderia ser jogado um pouco mais longe.
Esta versão usa numpy, que parece um pouco de trapaça, mas aqui está:
Python 3 (com numpy), 72
fonte
C ++ 14,
10210394 + 17 (incluir) = 111 bytesUngolfed, com caso de teste
Depende da ordem da avaliação. Não tenho certeza se é UB ou não, mas funcionaDepende do compilador, então eu mudei.fonte
j
de 0 a n, conten
até 0. Dá 97 bytes pela minha contagem.Oitava, 24 bytes
fonte
Burlesco, 10 bytes
não é muito eficiente em geral, mas funciona.
fonte
C ++ 14, 67 bytes
Como lambda sem nome, modificando sua entrada, exigindo
c
como um contêiner de acesso aleatóriovector<int>
.fonte
05AB1E , 4 bytes (provavelmente não concorrente)
Experimente online!
fonte
Gelatina , 3 bytes
Experimente online!
Este é o meu método (do Sr. Xcoder ).
Gelatina , 3 bytes
Experimente online!
Esta é a solução de caird coinheringaahing .
Método 1
Método # 2
fonte
Axiom
21347 bytesungolf e algum exemplo
fonte