Summe aller ganzen Zahlen von 1 bis n


63

Ich bin ehrlich überrascht, dass dies noch nicht geschehen ist. Wenn Sie einen vorhandenen Thread finden, markieren Sie diesen auf jeden Fall als Duplikat oder lassen Sie es mich wissen.

Eingang

Ihre Eingabe erfolgt in Form einer positiven Ganzzahl größer oder gleich 1.

Ausgabe

Sie müssen die Summe aller ganzen Zahlen zwischen einschließlich 1 und der eingegebenen Zahl ausgeben.

Beispiel

 In: 5
     1+2+3+4+5 = 15
Out: 15

OEIS A000217 - Dreieckszahlen: a (n) = Binomial (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Bestenliste

Führen Sie den folgenden Codeausschnitt aus, um eine Bestenliste mit den Antworten auf diese Frage anzuzeigen. (Danke an programmer5000 und steenbergh für den Vorschlag und Martin Ender für die Erstellung.)



@FryAmTheEggman Entschuldigung - hatte ein bisschen Hirnfurz da. Ich verstehe was du meinst.
GarethPW

2
@ Aaron Sie haben von Husk Ninja'd, die gerade mit einer 1-Byte-Lösung gepostet wurde
Skidsdev

7
Ich schlage ein Stack-Snippet vor.
Programmer5000

Antworten:



32

Schale , 1 Byte

Σ

Probieren Sie es online!

Eingebaut! Σin Husk wird normalerweise verwendet, um die Summe aller Elemente einer Liste zu erhalten, aber wenn es auf eine Zahl angewendet wird, gibt es genau zurück n*(n+1)/2.


1
Tritt dies aus Neugierde auf, weil die Zahl in einen Bereich umgewandelt und dann summiert wird, oder ist dies tatsächlich hartcodiert?
FryAmTheEggman

4
@FryAmTheEggman Dies ist tatsächlich fest codiert und ähnelt dem Verhalten eines anderen eingebauten Elements, Π, das das Produkt aller Elemente einer Liste oder die Fakultät einer einzelnen Zahl berechnen kann
Leo

4
Σist ein Zwei-Byte-Unicode-Zeichen auf meinem Computer. Ich vermute, Sie verwenden die Codepage 1253? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht

5
@ Gmatht Husk Codepage
Jonathan Allan

21

Piet , 161 Bytes / 16 Codels

Sie können es mit diesem Piet-Interpreter interpretieren oder das Bild auf diese Website hochladen und dort ausführen. Ich bin nicht sicher, ob ich die Anzahl der Bytes ändern könnte, um die Größe zu verringern.

Skalierte Version des Quellbildes:

Rapapaing-Bild

Erläuterung

Der highlightedText zeigt den aktuellen Stapel (von links nach rechts wachsend), vorausgesetzt, die Benutzereingabe lautet 5:

1. Übergang Geben Sie eine Zahl ein und legen Sie sie auf den Stapel

5

2. Übergang Dupliziere diese Zahl auf dem Stapel

5 5

3. Übergang Schieben Sie 1 (die Größe des dunkelroten Bereichs) auf den Stapel

5 5 1

4. Übergang Addiere die beiden oberen Zahlen

5 6

5. Übergang Multiplizieren Sie die beiden oberen Zahlen

30

6. Übergang Der schwarze Bereich stellt sicher, dass sich der Cursor nach rechts unten zum hellgrünen Codel bewegt. Dieser Übergang drückt 2 (die Größe von dunkelgrün) auf den Stapel

30 2

7. Übergang Teilen Sie die zweite Zahl auf dem Stapel durch die erste

15

8. Übergang Pop und Ausgabe der Top-Nummer (interpretiert als Nummer)

[empty]

letzte Falle Wenn Sie einen weißen Bereich einfügen, ist der Übergang ein nop, das Schwarze fängt unseren Cursor ein. Damit ist die Ausführung des Programms beendet.

Originaldatei (viel zu klein für hier): Ursprüngliches Quellbild


Wir sind von einem verständlichen Text (zB C) zu einem unverständlichen Text (zB Jelly) zu Bildern übergegangen ... Wie geht es weiter? : P
frarugi87

+1 Ich habe noch nie eine Piet-Antwort mit einer Erklärung gesehen
MilkyWay90

21

Brain-Flak , 16 Bytes

({({}[()])()}{})

Probieren Sie es online!

Dies ist eines der wenigen Dinge, in denen Brain Flak wirklich gut ist.

Da dies eines der einfachsten Dinge ist, die Sie in Brain-Flak tun können, und es viel Sichtbarkeit bietet, folgt eine ausführliche Erklärung:

# Push the sum of all of this code. In brain-flak, every snippet also returns a
# value, and all values inside the same brackets are summed
(
    # Loop and accumulate. Initially, this snippet return 0, but each time the
    # loop runs, the value of the code inside the loop is added to the result.
    {
        # Push (and also return)...
        (
            # The value on top of the stack
            {}

            # Plus the negative of...
            [
                # 1
                ()
            ]

        # The previous code pushes n-1 on to the stack and returns the value n-1
        )

        # 1
        # This code has no side effect, it just returns the value 1 each loop.
        # This effectively adds 1 to the accumulator
        ()

    # The loop will end once the value on top of the stack is 0
    }

    # Pop the zero off, which will also add 0 to the current value
    {}

# After the sum is pushed, the entire stack (which only contains the sum)
# will be implicitly printed.
)


18

Mathematica, 9 Bytes

#(#+1)/2&

Mathematica, 10 Bytes

(#^2+#)/2&

Mathematica, 11 Bytes

Tr@Range@#&

Mathematica, 12 Bytes

i~Sum~{i,#}&

Mathematica, 14 Bytes

(von @ user71546)

1/2/Beta[#,2]&

Mathematica, 15 Bytes

Tr[#&~Array~#]&

Mathematica, 16 Bytes

Binomial[#+1,2]&

Mathematica, 17 Bytes

(von @Not a tree)

⌊(2#+1)^2/8⌋&

Mathematica, 18 Bytes

PolygonalNumber@#&

Mathematica, 19 Bytes

#+#2&~Fold~Range@#&

Mathematica, 20 Bytes

(von @Not a tree)

f@0=0;f@i_:=i+f[i-1]

4
Es scheint eine Schande, 13, 14 und 17 zu überspringen ...
Kein Baum

3
Es scheint eine nächste Herausforderung zu sein ... oder zumindest mir zu helfen, die Liste zu vervollständigen.
J42161217

2
Ich habe immer noch nichts für 13 oder 14 Bytes (abgesehen davon, dass Sie nur Ihre kürzeren Antworten ablehnen), aber hier sind noch 26 mit größeren Bytes .
Kein Baum

1
@MarkS. am 10.4 funktioniert gut
J42161217

1
@Notatree Für Ihre Liste ist hier ein Kandidat für 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


11

x86_64-Maschinensprache (Linux), 9 8 Byte

0:   8d 47 01                lea    0x1(%rdi),%eax
3:   f7 ef                   imul   %edi
5:   d1 e8                   shr    %eax
7:   c3                      retq 

Um es online auszuprobieren! Kompilieren Sie das folgende C-Programm und führen Sie es aus.

#include<stdio.h>
const char f[]="\x8d\x47\x01\xf7\xef\xd1\xe8\xc3";
int main(){
  for( int i = 1; i<=10; i++ ) {
    printf( "%d %d\n", i, ((int(*)())f)(i) );
  }
}

Vielen Dank an @CodyGray und @Peter für -1.


1
Sie sollten shrstattdessen wahrscheinlich verwenden sar, um Ihre Ausgabe als nicht signiert zu behandeln (keine Änderung der Codegröße). (Von @CodyGray entdeckt und in seiner 7-Byte add+ loopAntwort darauf hingewiesen ).
Peter Cordes

1
Dies sieht für die Leistung bei einer Implementierung der Formel in geschlossener Form optimal aus. Sie können jedoch ein Byte speichern, indem Sie die Ein-Operanden-Form von mul %edioder imul %edi(jeweils 2B) anstelle der 3B-Zwei-Operanden-Form verwenden. Es überfordert EDX mit dem High-Half-Ergebnis, aber das ist in Ordnung. Der Multioperand imulwurde später als die Einoperandenform eingeführt und hat einen 2-Byte-Opcode mit einem 0FEscape-Byte. Jede der drei Optionen führt immer zum gleichen Ergebnis eax. Es ist nur die obere Hälfte, die von signierten und nicht signierten Werten abhängt.
Peter Cordes




10

Oktave , 22 bis 19 Bytes

Weil Rechenoperationen langweilig sind ...

@(n)nnz(triu(e(n)))

Probieren Sie es online!

Erläuterung

Vorausgesetzt n, dies erzeugt eine n× nMatrix mit allen Einträgen gleich der Zahl e ; macht Eingaben unter der Diagonalen Null; und gibt die Anzahl der Werte ungleich Null aus.


Ist das eigentlich kürzer als die numerische Version?
Esolanging Fruit

@ Challenger5 Nein, aber die numerische Version ist langweilig:@(n)sum(1:n)
Luis Mendo



8

APL, 3 Bytes

+/⍳

Probieren Sie es online!

+/- Summe (Verkleinerung +), - Reichweite.


Dies hängt von der Indizierung ab. Wenn die Indizierung auf 0 gesetzt ist, benötigen Sie zusätzliche 2 Bytes1+
Werner

2
Die @ Werner-Indizierung ist die Standardeinstellung, 1daher habe ich sie nicht angegeben. Es ist hier üblich, nur bei der Verwendung anzugeben ⎕IO←0(und es ist nicht in der Byteanzahl enthalten)
Uriel

8

Haskell , 13 Bytes

Dies ist die kürzeste ( denke ich ):

f n=sum[1..n]

Probieren Sie es online!

Direkt, 17 13 Bytes

f n=n*(n+1)/2

Danke @WheatWizard für die -4Bytes!

Probieren Sie es online!

Punktfrei direkt, 15 Bytes

(*)=<<(/2).(+1)

Danke @nimi für die Idee!

Probieren Sie es online!

Punktfrei über sum16 Bytes

sum.enumFromTo 1

Probieren Sie es online!

Rekursiv 22 18 Bytes

f 0=0;f n=n+f(n-1)

Danke @maple_shaft für die Idee & @Laikoni fürs Golfen!

Probieren Sie es online!

Standard fold, 19 Bytes

f n=foldr(+)0[1..n]

Probieren Sie es online!


7

Sternenklar , 27 22 Bytes

5 Bytes gespart dank @miles !

, + +  **       +   *.

Probieren Sie es online!

Erläuterung

,             Read number (n) from STDIN and push it to the stack
 +            Duplicate top of the stack
 +            Duplicate top of the stack
  *           Pop two numbers and push their product (n*n)
*             Pop two numbers and push their sum (n+n*n)
       +      Push 2
   *          Pop two numbers and push their division ((n+n*n)/2)
.             Pop a number and print it to STDOUT


@miles Danke! Sehr gute Idee!
Luis Mendo


7

Java (OpenJDK 8) , 10 Byte

a->a++*a/2

Probieren Sie es online!

n->n*(n+1)/2Ich brauchte einen Moment, um Golf zu spielen, weil ich langsam bin.

Dies ist jedoch keine echte Java-Antwort. Es ist definitiv nicht ausführlich genug.

import java.util.stream.*;
a->IntStream.range(1,a+1).sum()

Nicht schlecht, aber wir können es besser machen.

import java.util.stream.*;
(Integer a)->Stream.iterate(1,(Integer b)->Math.incrementExact(b)).limit(a).reduce(0,Integer::sum)

Ich liebe java


1
Wenn Sie es noch ausführlicher haben möchten, warum sollten Sie ein Lambda verwenden? : P
TheLethalCoder

2
Ich strebte nach ausführlichen Lambdas, ich konnte ein volles Programm schreiben, wenn ich besonders beredt sein wollte: P
Xanderhall

1
Die exakt gleiche Lösung wurde bereits veröffentlicht
Winter

2
Ich muss es verpasst haben, aber auf jeden Fall neige ich dazu, nicht auf den Inhalt anderer Antworten zu schauen. Ich schreibe lieber mein eigenes Golf.
Xanderhall

7

Überprüfen Sie , 5 Bytes

:)*$p

Check ist noch nicht einmal eine Golfsprache, aber sie schlägt CJam!

Probieren Sie es online!

Erläuterung:

Die eingegebene Nummer wird auf den Stapel gelegt. :dupliziert es zu geben n, n. Es wird dann inkrementiert mit ), geben n, n+1. *multipliziert die beiden miteinander und $dividiert das Ergebnis durch 2. pdruckt das Ergebnis aus und das Programm wird beendet.



6

Taxi , 687 Bytes

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l 2 r.[a]Pickup a passenger going to Addition Alley.Pickup a passenger going to The Underground.Go to Zoom Zoom:n.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Go to The Underground:n 1 r 1 r.Switch to plan "z" if no one is waiting.Pickup a passenger going to Cyclone.Go to Cyclone:n 3 l 2 l.Switch to plan "a".[z]Go to Addition Alley:n 3 l 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Probieren Sie es online!

Ungolfen mit Kommentaren:

[ n = STDIN ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left 2nd right.

[ for (i=n;i>1;i--) { T+=i } ]
[a]
Pickup a passenger going to Addition Alley.
Pickup a passenger going to The Underground.
Go to Zoom Zoom: north.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Go to The Underground: north 1st right 1st right.
Switch to plan "z" if no one is waiting.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 3rd left 2nd left.
Switch to plan "a".

[ print(T) ]
[z]
Go to Addition Alley: north 3rd left 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

Es sind 22,6% weniger Bytes für die Schleife als für die Verwendung x*(x+1)/2



5

Brainfuck, 24 Bytes.

E / A wird als Byte behandelt.

,[[->+>+<<]>[-<+>]<-]>>.

Erklärt

,[[->+>+<<]>[-<+>]<-]>>.
,                           # Read a byte from STDIN
 [                  ]       # Main loop, counting down all values from n to 1
  [->+>+<<]                 # Copy the i value to *i+1 and *i+2
           >[-<+>]          # Move *i+1 back to i
                  <-        # Move back to i, lower it by one. Because *i+2 is never reset, each iteration adds the value of i to it.
                     >>.    # Output the value of *i+2

2
Es ist ziemlich cool, dass Brainfuck in dieser Herausforderung einige höhere Sprachen schlagen kann.
GarethPW

Ist es für mich legitim, eine Antwort in Lenguage hinzuzufügen (nur zum Spaß), indem ich Ihren Code verwende? @ATaco
V. Courtois

Ich denke nicht, da es der gleiche Code wäre, der einfach anders codiert ist. @ V.Courtois
ATaco

@ATaco Ahh du hast recht.
V. Courtois

5

,,,, 6 bytes

:1+×2÷

Erläuterung

:1+×2÷

:       ### duplicate
 1+     ### add 1
   ×    ### multiply
    2÷  ### divide by 2

Wenn ich irgendwann in Kürze Reichweite einsetze ...


4

Retina , 13 Bytes

.+
$*
1
$`1
1

Probieren Sie es online! Erläuterung: Die erste und die letzte Stufe sind nur unäre ⇔ Dezimalumwandlungen. Die mittlere Stufe ersetzt jeweils1 durch die Anzahl von 1s links und eine weitere 1für sich 1selbst, zählt also von 1bis nund summiert die Werte implizit.




4

PHP, 19 Bytes

<?=$argn*-~$argn/2;
<?=$argn/2*++$argn;
<?=$argn*++$argn/2; # this one fails

mit Builtins, 29 Bytes:

<?=array_sum(range(1,$argn));

Schleife, 31 Bytes:

while($argn)$s+=$argn--;echo$s;

Ich denke, ein für auch:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Cubix , 12 10 Bytes

*,)2I://O@

Erste Version

....I:)*2,O@

Probieren Sie es online!

Erläuterung

Erweitert auf einen Würfel sieht der Code folgendermaßen aus:

    * ,
    ) 2
I : / / O @ . .
. . . . . . . .
    . .
    . .

Der Anweisungszeiger (IP) beginnt in Iöstlicher Richtung. Es bewegt sich weiter nach Osten, bis es auf den /Spiegel trifft , der es nach Norden reflektiert. Wenn die IP den oberen Rand des Codes erreicht, wird sie .in der dritten Zeile bis zum letzten Punkt umgebrochen und bewegt sich nach Süden. Dann springt es zum vorletzten Punkt in der .letzten Zeile und bewegt sich nach Norden. Dann erreicht es wieder den /Spiegel, der es nach Osten reflektiert, nur für den nächsten /, um es wieder nach Norden zu reflektieren. Diesmal wird die IP in der .dritten Zeile zum vorletzten und .in der letzten Zeile zum letzten Zeilenumbruch.

Die Anweisungen werden in der folgenden Reihenfolge ausgeführt.

I:)*2,O@ # Explanation
I        # Take input as an integer and push it to the stack
 :       # Duplicate the input
  )      # Increment one of the inputs
   *     # Multiply the input by input+1
    2    # Push 2 to the stack
     ,   # Integer devide the multiplication result by 2
      O  # Output the result
       @ # End program

4

x86-64-Maschinencode, 7 Byte

31 C0
01 C8
E2 FC
C3  

Die obigen Bytes definieren eine Funktion, die einen einzelnen Parameter akzeptiert nund einen Wert zurückgibt, der die Summe aller Ganzzahlen von 1 bis enthältn .

Es wird in die Microsoft x64-Aufrufkonvention geschrieben , die den Parameter im ECXRegister übergibt . Der Rückgabewert bleibt EAXwie bei allen x86 / x86-64-Aufrufkonventionen erhalten.

Ungolfed Assembler-Mnemonik:

       xor  eax, eax    ; zero out EAX
Next:  add  eax, ecx    ; add ECX to EAX
       loop Next        ; decrement ECX by 1, and loop as long as ECX != 0
       ret              ; return, with result in EAX

Probieren Sie es online!
(Der dortige C-Funktionsaufruf ist mit einem Attribut versehen, das bewirkt, dass GCC ihn gemäß der von meinem Assemblycode verwendeten Microsoft-Aufrufkonvention aufruft. Wenn TIO MSVC bereitgestellt hätte, wäre dies nicht erforderlich.)


Anhand der ungewöhnlichen Standards des Codegolfs sehen Sie, dass dieser iterative Looping-Ansatz Ansätzen vorzuziehen ist , die die vernünftigere mathematische Formel ( n(n+1) / 2) verwenden, obwohl er offensichtlich in Bezug auf die Laufzeitgeschwindigkeit erheblich weniger effizient ist.

Mit der Zahlentheorie kann die Implementierung von ceilingcat immer noch um ein Byte übertroffen werden. Jede dieser Anweisungen ist wichtig, aber es gibt eine etwas kürzere Codierung IMUL, die EAX implizit als Zieloperand verwendet wird (tatsächlich wird sie verwendet EDX:EAX, aber wir können die oberen 32 Bits des Ergebnisses einfach ignorieren). Dies sind nur 2 von 3 zu codierenden Bytes.

LEAdauert auch drei Bytes, aber es gibt wirklich keinen Weg daran vorbei, weil wir unter Beibehaltung des ursprünglichen Wertes erhöhen müssen. Wenn wir MOVeine Kopie INCanfertigen würden, wären wir bei 4 Bytes. (In x86-32, wo INCes nur 1 Byte gibt, wären wir bei den gleichen 3 Bytes wie LEA.)

Die letzte Rechtsverschiebung ist notwendig, um das Ergebnis in zwei Hälften zu teilen, und ist sicherlich kompakter (und effizienter) als eine Multiplikation. Der Code sollte jedoch shrstattdessen verwendet werden sar, da davon ausgegangen wird, dass der Eingabewert neine ganze Zahl ohne Vorzeichen ist. (Diese Annahme gilt natürlich gemäß den Regeln, aber wenn Sie wissen, dass die Eingabe nicht vorzeichenbehaftet ist, sollten Sie keine vorzeichenbehaftete arithmetische Verschiebung durchführen, da das obere Bit, das auf einen großen vorzeichenlosen Wert gesetzt ist, das Ergebnis verursacht falsch sein.)

8D 41 01                lea    eax, [rcx+1]
F7 E9                   imul   ecx
D1 E8                   shr    eax, 1
C3                      ret

Jetzt nur noch 8 Bytes (danke an Peter Cordes). Immer noch 8> 7.


1
Eigentlich würde ein Operand imul ecxoder mul ecxein Byte in der Closed-Form-Implementierung funktionieren und speichern. Ich habe das nicht sofort bemerkt; Ich wollte gerade kommentieren, dass es sowohl für die Leistung als auch für die Codegröße optimal ist, bevor mir klar wurde, dass ein impliziter eaxOperand in Ordnung ist.
Peter Cordes

Ich fragte mich, ob add+ loopkürzer wäre als imulbei der anderen Antwort. Praktisch, dass es eine Standardkonvention für Anrufe gibt, die das erste Argument enthältecx
Peter Cordes,

1
Wow, ich kann nicht glauben, dass ich die Ein-Operanden-Form verpasst habe! Ich sollte jetzt wirklich wissen, Dinge wie "unschlagbar" nicht zu sagen. Wann werde ich lernen ?! Vielen Dank, @Peter.
Cody Grey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.