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>
Antworten:
J, 5 Bytes
Versuchen Sie es online auf J.js .
Wie es funktioniert
/\
ist ein Adverb (Funktion, die ein linkes Argument annimmt), das sich kumulativ um sein Argument verringert.Also
+/\
ist das kumulative Summenverb .^:
ist die Machtverbindung ;(f ^: n) y
trifftf
insgesamtn
mal zu aufy
.Der Verb-Konjunktionszug
+/\^:
bildet ein Adverb, das+/\
so oft wiederholt wird, wie im (linken) Argument angegeben.x (+/\^:) y
wird analysiert als(x (+/\^:)) y
, was der Ausführung entspricht(+/\^:x) y
.Vielen Dank an @Zgarb für seine Hilfe bei der Erklärung.
quelle
Mathematica, 19 Bytes
Gut wenn Einbauten okay sind ...
Definiert eine Funktion mit derselben Signatur wie die Beispiele in der Challenge. Ich bin mir ziemlich sicher, dank des langen Namens,
Accumulate
dass dies von den Golfsprachen und der APL-Familie leicht zu übertreffen sein wird. :)Um den Kommentar von LegionMammal978 für diejenigen zu erläutern, die Mathematica nicht verwenden:
##
Stellt eine Folge von Funktionsparametern dar (ähnlich einer Liste, die automatisch "splattet", wo immer sie eingefügt wird, wenn Sie mit diesem Begriff aus einer Sprache Ihrer Wahl vertraut sind). Das~
sind syntaktischer Zucker für Infix Funktionsaufruf, so dass , wenn wir die Funktion mit Parametern aufrufenlist
undn
und alles erweitern, erhalten wir:Das ist genau die Argumentreihenfolge, die von erwartet wird
Nest
.quelle
SlotSequence
...Haskell,
2623 BytesDies definiert eine anonyme Funktion, die wie folgt aufgerufen wird:
Vielen Dank an @nimi für das Speichern von 3 Bytes.
Erläuterung
quelle
(!!).iterate(scanl1(+))
.APL,
98 BytesDies definiert eine dyadische Funktion, die die Iterationen und Listen als linkes und rechtes Argument akzeptiert.
Vielen Dank an @NBZ für das Golfen ab 1 Byte!
Probieren Sie es online auf TryAPL aus .
Wie es funktioniert
⍺
und⍵
sind die linken und rechten Argumente für die Funktion.+\
ist kumulativ um die Summe zu reduzieren.⍣⍺
wiederholt die vorhergehenden Operatorzeiten⍺
.⊢⍵
Wendet die Identitätsfunktion auf an⍵
.Dies ist eine kürzere Methode zum Parsen des Codes als
(+\⍣⍺)⍵
anstelle von+\⍣(⍺⍵)
.Zusammen bewerben wir uns
+\
insgesamt⍺
mal um⍵
quelle
+\⍣⎕⊢⎕
akzeptabel? (⎕
Ist wie Pythoninput()
).⎕
.Matlab, 41 Bytes
Recht einfach. Ich finde es immer noch ziemlich ärgerlich, keine eingebaute Methode zur Erstellung stückweise definierter anonymer Funktionen oder Anker in Rekursionen zu haben.
Ungolfed:
quelle
JavaScript (ES6) 38
Überraschend klein, wenn .map rekursiv verwendet wird
quelle
K,
73 BytesSehr ähnlich der J-Lösung.
+\
Führt präzise eine Teilsumme aus und/
iteriert , wenn ein monadisches Verb und ein ganzzahliges linkes Argument angegeben sind, eine festgelegte Anzahl von Malen, wie bei einer "for" -Schleife. Der Rest packt es einfach so zusammen, dass es der Reihenfolge der Argumente entspricht.Getestet in Kona und OK .
Bearbeiten:
Wenn ich die Argumente umkehren darf, wie @ kirbyfan64sos festgestellt hat, kann ich ganz auf die Funktionsumhüllung verzichten:
Aufgerufen wie:
Dies funktioniert sowohl in k2.8 als auch in k5 einwandfrei. In oK funktioniert es nicht, da dieser Interpreter noch keine Curry-Adverbien (auch als "projizierte Adverbien" bezeichnet) unterstützt und aus weniger eindeutigen Gründen in Kona nicht ordnungsgemäß zu funktionieren scheint.
edit : Seit ein paar Tagen
+\/
funktioniert die Formulierung auch in OK.quelle
3 +\/ -3 4 7 -1 15
Funktioniert in Kona einwandfrei, kann aber keiner Funktion zugewiesen werden. Seltsam ...3+\/-3 4 7 -1 15
dasselbe wie+\/[3;-3 4 7 -1 15]
- ich frage mich, ob sie das erstere als speziellen syntaktischen Fall behandeln.Pyth, 9 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung
quelle
Julia, 29 Bytes
Das braucht wirklich nicht viel Erklärung. Es ist eine rekursive Funktion, wenn
y==0
dann nur x ausgegeben wird. Ansonsten dekrementiere y, führe ein Cumsum durch und rekursiere. Wahrscheinlich nicht die bestmögliche Julia-Lösung, ich arbeite noch daran.quelle
Labyrinth , 73 Bytes
Es ist schon eine Weile her, dass ich im Labyrinth etwas beantwortet habe, und das schien machbar. :)
Das Eingabeformat ist eine flache Liste mit der Anzahl der Iterationen zuerst (und dann der Liste, auf die die Teilsummen angewendet werden sollen). Trennzeichen spielen keine Rolle, solange nach der letzten Ganzzahl kein Zeichen steht. Daher können Sie Folgendes verwenden:
Die Ausgabe ist durch Zeilenumbrüche getrennt:
quelle
R, 75 Bytes
Es ist lang, aber eine andere Einstellung ... die Berechnung der gewünschten Sequenz direkt anstelle von kumulierten Summen:
Man beachte, dass die Koeffizienten der Terme von xi für cumsum ^ n (x) Diagonalen des Pascalschen Dreiecks sind. dh
edit: um eine funktion zu machen
quelle
Python 2, 67
Dies verwendet dieselbe Summe wie Anthony Roitman und dieselbe Rekursion wie Morgan Thrapp .
Ich habe diese Lösung entwickelt, bevor ich ihre gesehen habe, und dann schien es einfacher, sie als Antwort zu veröffentlichen, anstatt sie einem oder beiden zu kommentieren.
quelle
Python,
113938976 BytesEs funktioniert für beide Testfälle. Dank an Status, Morgan Thrapp und Ruth Franklin, die mir geholfen haben, das Programm auf 93, 89 bzw. 76 Bytes herunterzuspielen.
quelle
k=[sum(l[:j+1])for j in range(len(l))]
. Dann mit;k=l
angeheftet am Ende, können Sie dies alles auf eine Linie mit derfor i
Schleife schieben .k=[sum(l[:j+1])for j in range(len(l))];l=k
in dieselbe Zeile wie die for-Schleife verschieben, um 2 Byte zu speichern, und das Leerzeichen zwischen den Argumenten von f entfernen, um ein weiteres Byte zu speichern.i
, können Sie ersetzenfor i in range(n)
mitfor i in[0]*n
(weil alle kümmern uns um die Länge nicht die Elemente der Liste). Und ich denke, Sie können es tun, ohne die Hilfsliste zu verwendenk
und nur das Argument zu ändernl
.Gol> <> 0,3,10 , 22 Bytes
Die erste Ganzzahl ist die Iterationsnummer und der Rest bildet die Liste. Die endgültige Liste wird zeilenweise getrennt ausgegeben.
Die Sprache ist noch recht jung und instabil, aber da ich ziemlich auf diese Operatoren eingestellt bin, dachte ich, es wäre okay.
Erläuterung
Um zu sehen, warum dies funktioniert, versuchen wir ein kleines Beispiel
[5 2 1]
:quelle
Python, 52 Bytes
Eine rekursive Funktion, die sowohl in der Liste
l
als auch in der Anzahl der Iterationen rekursiv istn
. Lassen Sie es uns aufschlüsseln.Betrachten wir zunächst eine rekursive Funktion
g
, bei der die Teilsumme nur einmal durchlaufen wurde.Bei einer leeren Liste
l
gibt dies sichl
selbst zurück, die leere Liste. Ansonsten ist der letzte Eintrag der Teilsummen vonl
die Gesamtsumme vonl
, die an das rekursive Ergebnis für alle bis auf das letzte Element von angehängt wirdl
.Betrachten wir nun eine Funktion
f
, dieg
fürn
Iterationen gilt.Wenn dies der Fall
n
ist0
, wird die Listel
unverändert zurückgegeben. Andernfalls wird sieg
einmal angewendet und anschließendf
rekursiv mit einer verbleibenden Iteration weniger aufgerufen.Betrachten wir nun noch einmal den eigentlichen Code, der die beiden Rekursionen zu einer einzigen Funktion kombiniert. Die Idee ist,
g(l)
als Sonderfall zu behandelnf(l,1)
.Wir haben
f(g(l),n-1)
von der vorherigen Definition erweitertg(l)
ing(l[:-1])+[sum(l)]
, und dann ersetztg(_)
mitf(_,1)
auf , um die rekursive Anrufe beschränktf
.Für den Basisfall möchten wir zurückkehren,
l
wann immern==0
oderl==[]
. Wir kombinieren diese, indem wir feststellen, dass eine der beidenn*l
Listen die leere Liste ist, die Falsy ist. Wir greifen also immer dann zu, wennn*l
es nicht leer ist, und kehrenl
ansonsten zurück.Obwohl es zwei rekursive Aufrufe gibt,
f
führt dies nicht zu einer exponentiellen Explosion der rekursiven Definition der Fibonacci-Zahlen, sondern bleibt quadratisch.quelle
C ++ (61 + 17 = 78 Byte)
Testfall:
Dies lässt sich leicht mit der Spezifikation vereinbaren: Es wird ein Array im C-Stil verwendet, das Zeiger an den Anfang und das Ende des Arrays übergibt. Intern ist es, wie Sie sehen, nur eine extrem dünne Hülle
std::partial_sum
in der Standardbibliothek. Anstatt den resultierenden Wert tatsächlich zurückzugeben, wird lediglich das übergebene Array geändert.Wenn es uns nichts ausmacht, Definitionen von Dingen an ihre Grenzen zu treiben (und vielleicht sogar darüber hinaus), können wir eine "Funktion" in einem Lambda-Ausdruck definieren:
Dies reduziert die Definition der Funktion (-ähnliches Objekt) auf dieses Stück:
... für 40 Bytes (+17 für die
#include
).quelle
CJam, 13 Bytes
Teste es hier.
quelle
Haskell,
5247 BytesDer erste Code-Golf-Versuch, und ich bin ein absoluter Haskell-Anfänger. Kommentare sind daher sehr willkommen! Bei der Frage nach dem erforderlichen Format des Funktionsaufrufs oder ob es sich um ein Argument für das Programm handelt, war nicht klar, weshalb ich das Ausrufezeichen als Funktionskennung verwendete, um einige Leerzeichen zu speichern.
Verbrauch (GHCi):
quelle
0!a=a
i!a=...
.sum(take j a)
Sie können Pars , indem Sie vermeidensum$take j a
, mit der hohen Priorität von$
.$
dies Vorrang vor der Syntax haben würde (und ich versuchte, den Rest der Zeile so zu bewerten, wie er ist). Das würde natürlich keinen Sinn ergeben.R, 41 Bytes
quelle
C #, 52 + 85 =
148137 Bytesund
Es werden unorthodoxe Praktiken verwendet (
v=>t+=v
), dies ist jedoch PPCG. Beachten Sie auch die Einschränkung der Stapeltiefe.quelle
Python 3, 73
Könnte wohl etwas weiter unten golfen werden.
Diese Version benutzt Numpy, was sich ein bisschen wie Schummeln anfühlt, aber hier ist es:
Python 3 (mit Zahl), 72
quelle
C ++ 14,
10210394 + 17 (Einschluss) = 111 BytesUngolfed, mit Testfall
Verlässt sich auf die Reihenfolge der Bewertung.Ich binmir nicht sicher, ob es UB ist oder nicht, aber es funktioniert.Es ist vom Compiler abhängig, also habe ich es geändert.quelle
j
von 0 bis n hoch zu zählen, zählenn
Sie bis 0 herunter. Gibt 97 Bytes durch meine Zählung.Oktave, 24 Bytes
quelle
Burlesque, 10 Bytes
Es ist im Allgemeinen nicht sehr effizient, aber es macht den Trick.
quelle
C ++ 14, 67 Bytes
Als unbenanntes Lambda modifiziert es seine Eingabe und benötigt
c
so einen Random-Access-Container wievector<int>
.quelle
05AB1E , 4 Bytes (wahrscheinlich nicht konkurrierend)
Probieren Sie es online!
quelle
Gelee , 3 Bytes
Probieren Sie es online!
Dies ist meine ( Mr Xcoders ) Methode.
Gelee , 3 Bytes
Probieren Sie es online!
Dies ist die Lösung von caird coinheringaahing .
Methode 1
Methode # 2
quelle
Axiom
21347 Bytesungolf und ein beispiel
quelle