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>
Odpowiedzi:
J, 5 bajtów
Spróbuj go w Internecie na J.js .
Jak to działa
/\
to przysłówek (funkcja, która przyjmuje lewy argument), który łącznie zmniejsza się o swój argument.Zatem
+/\
jest skumulowana suma czasownik.^:
jest koniunkcją mocy ;(f ^: n) y
stosujef
się ogółemn
doy
.Pociąg koniunkcji czasownika
+/\^:
tworzy przysłówek, który powtarza się+/\
tyle razy, ile podano w (lewym) argumencie.x (+/\^:) y
zostanie sparsowany jako(x (+/\^:)) y
, co jest równoważne z wykonaniem(+/\^:x) y
.Dzięki @Zgarb za pomoc w wyjaśnieniu.
źródło
Mathematica, 19 bajtów
Cóż, jeśli wbudowane są w porządku ...
Definiuje funkcję o takim samym podpisie jak przykłady w wyzwaniu. Jestem całkiem pewny, dzięki długiej nazwie,
Accumulate
że będzie to łatwe do pokonania przez języki gry w golfa i rodzinę APL. :)Aby rozwinąć komentarz LegionMammal978 dla tych, którzy nie Mathematica:
##
reprezentuje sekwencję parametrów funkcji (która jest jak lista, która automatycznie „wstawia” wszędzie tam, gdzie jest wstawiona, jeśli bardziej znasz ten termin z wybranego języka).~
To cukier syntaktyczny dla funkcji infix inwokacji, więc jeśli możemy wywołać funkcję z parametramilist
an
i rozwijać wszystko, otrzymujemy:Który akurat jest dokładnie oczekiwanym porządkiem argumentów
Nest
.źródło
SlotSequence
Haskell,
2623 bajtówDefiniuje funkcję anonimową, wywoływaną w następujący sposób:
Dzięki @nimi za zapisanie 3 bajtów.
Wyjaśnienie
źródło
(!!).iterate(scanl1(+))
.APL,
98 bajtówDefiniuje to funkcję dynamiczną, która przyjmuje iteracje i listę jako argumenty lewy i prawy.
Dzięki @NBZ za grę w golfa na 1 bajcie!
Wypróbuj online na TryAPL .
Jak to działa
⍺
i⍵
są lewym i prawym argumentem funkcji.+\
jest sumą pomniejszoną o sumę.⍣⍺
powtarza poprzednie⍺
czasy operatora .⊢⍵
stosuje funkcję tożsamości do⍵
.Jest to krótszy sposób parsowania kodu
(+\⍣⍺)⍵
zamiast+\⍣(⍺⍵)
.W połączeniu stosujemy
+\
się łącznie⍺
do⍵
źródło
+\⍣⎕⊢⎕
to do przyjęcia? (⎕
jest jak Pythoninput()
).⎕
później wymagali przypisania .Matlab, 41 bajtów
Całkiem proste. Nadal uważam, że to dość denerwujące, że nie ma wbudowanej funkcji tworzenia anonimowych funkcji lub zakotwiczania się w rekurencjach.
Nie golfowany:
źródło
JavaScript (ES6) 38
Zaskakująco mały przy użyciu rekurencyjnie .map
źródło
K,
73 bajtyBardzo podobny do rozwiązania J.
+\
precyzyjnie wykonuje sumę częściową, a gdy/
jest wyposażony w czasownik monadyczny i argument liczby całkowitej w lewo, iteruje określoną liczbę razy, jak pętla „for”. Reszta po prostu starannie ją pakuje, aby dopasować ją do kolejności argumentów.Testowane w Kona i OK .
Edytować:
Jeśli wolno mi odwrócić argumenty, jak ustalono @ kirbyfan64sos, mogę całkowicie zrezygnować z zawijania funkcji:
Wywoływano jak:
Działa to poprawnie zarówno w wersji k2.8, jak i k5. Nie działa w ok, ponieważ ten interpreter nie obsługuje jeszcze przysłówków curry (inaczej „rzutowanych”) i wydaje się, że nie działa poprawnie w Kona z mniej oczywistych powodów.
edytuj : Od kilku dni
+\/
formuła działa również w ok.źródło
3 +\/ -3 4 7 -1 15
działa dobrze w Kona, ale nie można przypisać jej do funkcji. Dziwne ...3+\/-3 4 7 -1 15
tego samego jako+\/[3;-3 4 7 -1 15]
- sprawia, że zastanawiam się, czy potraktują to pierwsze jako specjalny przypadek składniowy.Pyth, 9 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie
źródło
Julia, 29 bajtów
To naprawdę nie wymaga wielu wyjaśnień. Jest to funkcja rekurencyjna, jeśli
y==0
po prostu wypisuje x. W przeciwnym razie zmniejsz y, wykonaj sumę i powtórz. Prawdopodobnie nie jest to najbardziej możliwe rozwiązanie dla Julii, wciąż nad tym pracuję.źródło
Labirynt , 73 bajty
Minęło trochę czasu, odkąd odpowiedziałem na coś w Labiryncie, i wydawało się to wykonalne. :)
Format wejściowy to płaska lista z liczbą iteracji najpierw (a następnie listą do zastosowania sum częściowych). Ograniczniki nie mają znaczenia, o ile po ostatniej liczbie całkowitej nie ma znaku, więc możesz użyć czegoś czytelnego:
Dane wyjściowe są oddzielone znakiem nowej linii:
źródło
R, 75 bajtów
Jest długi, ale wymaga innego obliczenia ... bezpośrednie obliczenie żądanej sekwencji zamiast łącznych sum:
Zwracając uwagę, że współczynniki wyrażeń xi dla sumy ^ n (x) są przekątnymi trójkąta Pascala. to znaczy
edycja: aby utworzyć funkcję
źródło
Python 2, 67
Wykorzystuje to to samo podsumowanie co Anthony Roitman i taką samą rekurencję jak Morgan Thrapp .
Opracowałem to rozwiązanie, zanim zobaczyłem ich, a potem wydawało się, że łatwiej jest opublikować je jako odpowiedź niż komentarz do jednego lub obu z nich.
źródło
Python,
113938976 bajtówDziała w obu przypadkach testowych. Dzięki Status, Morgan Thrapp i Ruth Franklin za pomoc w grze w golfa odpowiednio do 93, 89 i 76 bajtów.
źródło
k=[sum(l[:j+1])for j in range(len(l))]
. Następnie za pomocą;k=l
halsu na końcu możesz przepchnąć to wszystko do jednej linii za pomocąfor i
pętli.k=[sum(l[:j+1])for j in range(len(l))];l=k
wiersz do pętli for, aby zapisać 2 bajty i usunąć odstęp między argumentami f, aby zapisać kolejny bajt.i
, można zastąpićfor i in range(n)
zfor i in[0]*n
(ponieważ wszystko zależy Ci na to nie długość elementy listy). I myślę, że możesz to zrobić bez użycia listy pomocniczejk
, po prostu modyfikując argumentl
.Gol> <> 0.3.10 , 22 bajty
Pierwszą liczbą całkowitą jest numer iteracji, a resztę tworzą listę. Ostateczna lista jest wyprowadzana rozdzielona znakiem nowej linii.
Język jest wciąż dość młody i niestabilny, ale ponieważ jestem dość nastawiony na tych operatorów, pomyślałem, że będzie dobrze.
Wyjaśnienie
Aby zobaczyć, dlaczego to działa, spróbujmy małego przykładu
[5 2 1]
:źródło
Python, 52 bajty
Funkcja rekurencyjna, która powtarza oba na liście
l
i liczbie iteracjin
. Rozbijmy to.Najpierw rozważmy funkcję rekurencyjną,
g
która tylko raz powtórzyła sumę częściową.W przypadku pustej listy
l
zwraca onal
samą pustą listę. W przeciwnym razie ostatni wpis częściowych suml
jest sumą całkowitąl
, która jest dołączana do wyniku rekurencyjnego dla wszystkich elementów oprócz ostatniegol
.Spójrzmy teraz spójrzmy prawdzie w funkcję
f
, która ma zastosowanieg
don
iteracji.Kiedy
n
jest0
, zwraca listęl
niezmienioną, a w przeciwnym razie ma zastosowanieg
raz, a następnie wywołujef
rekurencyjnie, pozostawiając jeszcze jedną iterację.Teraz spójrzmy jeszcze raz na rzeczywisty kod, który łączy dwie rekurencje w jedną funkcję. Chodzi o to, aby traktować
g(l)
jako szczególny przypadekf(l,1)
.Wzięliśmy
f(g(l),n-1)
z poprzedniej definicji, rozszerzyłg(l)
sięg(l[:-1])+[sum(l)]
, a następnie otrzymujeg(_)
zf(_,1)
aby ograniczyć rekurencyjne wywołania dof
.W przypadku podstawowym chcemy powrócić
l
zawszen==0
lubl==[]
. Łączymy je, zauważając, że jedno z nich powoduje, żen*l
jest pustą listą, którą jest Falsy. Tak więc powtarzamy za każdym razem, gdyn*l
nie jest pusty, i wracamy wl
przeciwnym razie.Mimo że istnieją dwa rekurencyjne wezwania do
f
, nie powoduje to wykładniczego powiększenia rekurencyjnej definicji liczb Fibonacciego, ale pozostaje kwadratowe.źródło
C ++ (61 + 17 = 78 bajtów)
Przypadek testowy:
Ta specyfikacja ma niewielką swobodę: wykorzystuje tablicę w stylu C, przekazując wskaźniki na początek i na końcu tablicy. Wewnętrznie, jak widać, jest to tylko wyjątkowo cienkie opakowanie
std::partial_sum
w standardowej bibliotece. Zamiast faktycznie zwracać wynikową wartość, modyfikuje tylko przekazaną tablicę.Jeśli nie przeszkadza nam przesuwanie definicji rzeczy do granic możliwości (i prawdopodobnie nieco dalej), możemy zdefiniować „funkcję” w wyrażeniu lambda:
Zmniejsza to definicję funkcji (obiektu podobnego do obiektu) do tego fragmentu:
... dla 40 bajtów (+17 dla
#include
).źródło
CJam, 13 bajtów
Sprawdź to tutaj.
źródło
Haskell,
5247 bajtówPierwsza w historii „próba” golfa kodowego, a ja jestem początkującym Haskellem, więc komentarze są mile widziane! W pytaniu nie było jasne, jaki jest konieczny format wywołania funkcji ani czy został on pobrany przez program do argumentu, więc użyłem wykrzyknika jako identyfikatora funkcji, aby zaoszczędzić kilka spacji.
Zastosowanie (GHCi):
źródło
0!a=a
i!a=...
.sum(take j a)
możesz uniknąć parens, wykonując tę czynnośćsum$take j a
, stosując wysoki priorytet$
.$
miałoby ono pierwszeństwo przed składnią (i spróbowałem ocenić resztę wiersza w obecnej formie). Oczywiście nie miałoby to nawet sensu.R, 41 bajtów
źródło
C #, 52 + 85 =
148137 bajtówi
Wykorzystuje niekonwencjonalne praktyki (
v=>t+=v
), ale jest to PPCG. Zwróć również uwagę na ograniczenie głębokości stosu.źródło
Python 3, 73
Prawdopodobnie można go nieco pograć w golfa.
Ta wersja używa numpy, co przypomina trochę oszustwo, ale oto:
Python 3 (z numpy), 72
źródło
C ++ 14,
10210394 + 17 (dołącz) = 111 bajtówBez golfa, z walizką testową
Opiera się na kolejności oceny. Nie jestem pewien, czy jest to UB, czy nie, ale działaTo zależy od kompilatora, więc go zmieniłem.źródło
j
zliczać od 0 do n, odliczajn
do 0. Daje 97 bajtów według mojej liczby.Oktawa, 24 bajty
źródło
Burleska, 10 bajtów
ogólnie nie jest bardzo wydajny, ale działa.
źródło
C ++ 14, 67 bajtów
Jako nienazwana lambda modyfikująca dane wejściowe, wymagająca
c
podobnie jak kontener o swobodnym dostępievector<int>
.źródło
05AB1E , 4 bajty (prawdopodobnie niekonkurencyjne)
Wypróbuj online!
źródło
Galaretka , 3 bajty
Wypróbuj online!
To jest moja metoda ( pana Xcodera ).
Galaretka , 3 bajty
Wypróbuj online!
To rozwiązanie Cairna Coheringaahinga .
Metoda nr 1
Metoda nr 2
źródło
Axiom
21347 bajtówUngolf i jakiś przykład
źródło