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>
Ответы:
J, 5 байт
Попробуйте его в Интернете на J.js .
Как это работает
/\
это наречие (функция, которая принимает левый аргумент), которое кумулятивно уменьшается на свой аргумент.Таким образом ,
+/\
это накопленная сумма глагол.^:
является силовым соединением ;(f ^: n) y
применяетсяf
в общей сложностиn
разy
.Поезд-соединение глагола
+/\^:
образует наречие, которое повторяет+/\
столько раз, сколько указано в его (левом) аргументе.x (+/\^:) y
анализируется как(x (+/\^:)) y
, что эквивалентно выполнению(+/\^:x) y
.Спасибо @Zgarb за помощь в объяснении.
источник
Mathematica, 19 байт
Хорошо, если встроенные модули в порядке ...
Определяет функцию с той же сигнатурой, что и в примерах задачи. Я уверен, благодаря длинному имени
Accumulate
что это будет легко побеждено языками гольфа и семьей APL, все же. :)Чтобы развить комментарий LegionMammal978 для тех, кто не Mathematica:
##
представляет последовательность параметров функции (которая похожа на список, который автоматически «всплывает», где бы он ни был вставлен, если вы более знакомы с этим термином из выбранного вами языка).~
Являются синтаксическим сахаром для функции инфикса вызова, так что если мы вызываем функцию с параметрамиlist
иn
и расширить все, мы получим:Что именно соответствует порядку аргументов, ожидаемому
Nest
.источник
SlotSequence
...Haskell,
2623 байтаЭто определяет анонимную функцию, вызываемую следующим образом:
Спасибо @nimi за сохранение 3 байта.
объяснение
источник
(!!).iterate(scanl1(+))
.APL,
98 байтЭто определяет двоичную функцию, которая принимает итерации и список как левый и правый аргументы.
Спасибо @NBZ за вывод 1 байта!
Попробуйте онлайн на TryAPL .
Как это работает
⍺
а также⍵
левый и правый аргументы функции.+\
кумулятивное уменьшение на сумму.⍣⍺
повторяет предыдущий оператор⍺
раз.⊢⍵
применяет функцию идентификации к⍵
.Это более короткий способ анализа кода
(+\⍣⍺)⍵
вместо+\⍣(⍺⍵)
.В совокупности мы применяем
+\
в общей сложности⍺
раз⍵
источник
+\⍣⎕⊢⎕
будет приемлемым? (⎕
это как Pythoninput()
).⎕
позже.Matlab, 41 байт
Довольно просто. Я все еще думаю, что довольно раздражает отсутствие встроенного способа создания кусочно определенных анонимных функций или якорей в рекурсиях.
Ungolfed:
источник
JavaScript (ES6) 38
Удивительно маленькое рекурсивное использование .map
источник
К,
73 байтаОчень похоже на решение J.
+\
точно выполняет частичную сумму, а когда/
ему предоставляется монадический глагол и целочисленный левый аргумент, он выполняет итерацию заданное число раз, как цикл for. Остальное просто аккуратно завернуть в соответствии с порядком аргументов.Проверено в Коне и Ок .
Редактировать:
Если мне разрешено изменять аргументы, как определено @ kirbyfan64sos, я могу полностью отказаться от переноса функции:
Вызывается как:
Это работает правильно как в k2.8, так и в k5. Он не работает в норме, так как этот переводчик еще не поддерживает наречия карри (иначе говоря, «спроецированные»), и он не работает должным образом в Kona по менее понятным причинам.
редактировать : по состоянию на несколько дней назад,
+\/
формулировка также работает в ОК.источник
3 +\/ -3 4 7 -1 15
прекрасно работает в Kona, но вы не можете назначить его функции. Странно ...3+\/-3 4 7 -1 15
к тому же, что и+\/[3;-3 4 7 -1 15]
заставляет меня задуматься, относятся ли они к первому как к особому синтаксическому случаю.Pyth, 9 байт
Попробуйте онлайн: демонстрация или тестовый набор
объяснение
источник
Юлия, 29 байт
Это действительно не нуждается в большом объяснении. Это рекурсивная функция, если
y==0
затем просто вывести x. В противном случае уменьшите y, выполните cumum и рекурсивно. Вероятно, не самое удачное решение Джулии, я все еще работаю над этим.источник
Лабиринт , 73 байта
Прошло много времени с тех пор, как я что-то ответил в Лабиринте, и это казалось выполнимым. :)
Формат ввода представляет собой плоский список с количеством итераций, а затем (и затем со списком, к которому нужно применить частичные суммы). Разделители не имеют значения для всех, если после последнего целого числа нет символа, поэтому вы можете использовать что-то читаемое, например:
Вывод через новую строку:
источник
R 75 байт
Это длинный, но другой вариант ... вычисление нужной последовательности напрямую вместо кумулятивных сумм:
Отмечая, что коэффициенты членов xi для cumsum ^ n (x) являются диагоналями треугольника Паскаля. т.е.
редактировать: сделать функцию
источник
Python 2, 67
Здесь используется та же сумма , что и у Энтони Ройтмана , и та же рекурсия, что и у Моргана Треппа .
Я разработал это решение до того, как увидел их, и тогда мне просто было легче опубликовать его как ответ, а не как комментарий к одному или обоим из них.
источник
Python,
113938976 байтЭто работает для обоих тестовых случаев. Спасибо Status, Morgan Thrapp и Ruth Franklin за то, что они помогли мне сыграть в программе до 93, 89 и 76 байтов соответственно.
источник
k=[sum(l[:j+1])for j in range(len(l))]
. Затем,;k=l
прикрепив конец, вы можете поместить все это в одну строку сfor i
циклом.k=[sum(l[:j+1])for j in range(len(l))];l=k
строку на ту же строку, что и цикл for, чтобы сохранить 2 байта, и убрать пробел между аргументами f, чтобы сохранить еще один байт.i
, вы можете заменитьfor i in range(n)
сfor i in[0]*n
(потому что все , что вы заботитесь о том , длина не элементы списка). И я думаю, что вы можете сделать это, не используя вспомогательный списокk
, просто изменив аргументl
.Gol> <> 0.3.10 , 22 байта
Первое целое число принимается за номер итерации, а остальные составляют список. Окончательный список выводится с новой строкой.
Язык все еще довольно молодой и нестабильный, но так как я довольно настроен на этих операторов, я подумал, что все будет в порядке.
объяснение
Чтобы понять, почему это работает, давайте попробуем небольшой пример
[5 2 1]
:источник
Python, 52 байта
Рекурсивная функция, которая повторяется как по списку, так
l
и по количеству итерацийn
. Давайте разберемся с этим.Во-первых, давайте рассмотрим рекурсивную функцию,
g
которая повторяла частичную сумму только один раз.Для пустого списка
l
это возвращаетl
себя, пустой список. В противном случае последняя запись частичных суммl
является общей суммойl
, которая добавляется к рекурсивному результату для всех, кроме последнего элементаl
.Теперь давайте посмотрим на функцию,
f
которая применяетсяg
дляn
итераций.Когда
n
есть0
, это возвращает списокl
без изменений, и в противном случае, применяетсяg
один раз, затем вызываетf
рекурсивно с оставшимся меньшим количеством итераций.Теперь давайте снова посмотрим на реальный код, который объединяет две рекурсии в одну функцию. Идея состоит в том, чтобы рассматривать
g(l)
как особый случайf(l,1)
.Мы взяли
f(g(l),n-1)
из предыдущего определения, расширяетсяg(l)
вg(l[:-1])+[sum(l)]
, а затем заменитьg(_)
сf(_,1)
на приурочены рекурсивные вызовы вf
.Для базового случая мы хотим вернуться
l
всякий раз, когдаn==0
илиl==[]
. Мы объединяем их, отмечая, что любой из нихn*l
является пустым списком, то есть ложью. Итак, мы возвращаемся, когдаn*l
не пусто, и возвращаемl
противном случае.Даже если есть два рекурсивных вызова
f
, это не вызывает экспоненциального увеличения рекурсивного определения чисел Фибоначчи, но остается квадратичным.источник
C ++ (61 + 17 = 78 байт)
Прецедент:
Это требует некоторой свободы со спецификацией: он использует массив в стиле C, передавая указатели на начало и конец массива. Внутренне, как вы можете видеть, это только очень тонкая оболочка вокруг
std::partial_sum
в стандартной библиотеке. Вместо того, чтобы фактически возвращать полученное значение, он просто изменяет массив, который передается.Если мы не возражаем выдвинуть определения вещей до предела (и, возможно, немного выше), мы можем определить «функцию» в лямбда-выражении:
Это уменьшает определение функции (-подобного объекта) до этой части:
... для 40 байтов (+17 для
#include
).источник
CJam, 13 байтов
Проверьте это здесь.
источник
Haskell,
5247 байтПервый в истории кодекс «попытка», и я очень начинающий на Haskell, поэтому комментарии с радостью приветствуются! В вопросе не было ясно, какой формат необходим для вызова функции или был ли он принят в качестве аргумента для программы, поэтому я использовал восклицательный знак в качестве идентификатора функции, чтобы сохранить пару пробелов.
Использование (GHCi):
источник
0!a=a
i!a=...
.sum(take j a)
вы можете избегать прощенияsum$take j a
, используя высокий приоритет$
.$
будет иметь приоритет над синтаксисом (и попытаться оценить оставшуюся часть строки в ее нынешнем виде). Конечно, это даже не имеет смысла.R, 41 байт
источник
C #, 52 + 85 =
148137 байта также
Он использует неортодоксальные практики (
v=>t+=v
), но это PPCG. Также обратите внимание на ограничение глубины стека.источник
Python 3, 73
Вероятно, может быть в гольф немного дальше.
Эта версия использует NumPy, что немного похоже на читерство, но вот оно:
Python 3 (с numpy), 72
источник
C ++ 14,
10210394 + 17 (включая) = 111 байтUngolfed, с тестовым набором
Полагается на порядок оценки. Не уверен, что это UB или нет, но работает.Это зависит от компилятора, поэтому я изменил его.источник
j
от 0 до n, отсчитайтеn
до 0. По моим подсчетам выдает 97 байт.Октава, 24 байта
источник
Бурлеск, 10 байт
это не очень эффективно в целом, но это помогает.
источник
C ++ 14, 67 байт
Как безымянная лямбда, изменяющая свой вход, требующая
c
в качестве контейнера произвольного доступа, подобногоvector<int>
.источник
05AB1E , 4 байта (возможно, не конкурирующие)
Попробуйте онлайн!
источник
Желе , 3 байта
Попробуйте онлайн!
Это мой ( мистер Xcoder ) метод.
Желе , 3 байта
Попробуйте онлайн!
Это Кейрд .
Способ № 1
Способ № 2
источник
Аксиома
21347 байтungolf и некоторые примеры
источник