Somma di tutti i numeri interi da 1 a n


63

Sono sinceramente sorpreso che questo non sia già stato fatto. Se riesci a trovare un thread esistente, contrassegnalo come duplicato o fammi sapere.

Ingresso

Il tuo input è sotto forma di qualsiasi numero intero positivo maggiore o uguale a 1.

Produzione

È necessario generare la somma di tutti i numeri interi compresi tra 1 incluso e il numero immesso.

Esempio

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

OEIS A000217 - Numeri triangolari: a (n) = binomiale (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Classifica

Esegui lo snippet di codice seguente per visualizzare una classifica per le risposte a questa domanda. (Grazie a programmer5000 e steenbergh per avermi suggerito questo, e Martin Ender per averlo creato.)



@FryAmTheEggman Siamo spiacenti, ho avuto un po 'di scoreggia cerebrale lì. Capisco cosa vuoi dire.
GarethPW,

2
@Aaron hai ottenuto il ninja da Husk, che è stato appena pubblicato con una soluzione da 1 byte
Skidsdev,

7
Suggerisco uno snippet di stack.
programmatore

Risposte:



32

Buccia , 1 byte

Σ

Provalo online!

Builtin! Σin Husk viene solitamente utilizzato per ottenere la somma di tutti gli elementi di un elenco, ma quando applicato a un numero restituisce esattamente n*(n+1)/2.


1
Per curiosità, ciò si verifica perché il numero viene castato in un intervallo e quindi sommato, oppure è effettivamente codificato?
FryAmTheEggman,

4
@FryAmTheEggman questo è in realtà hardcoded, ed è simile al comportamento di un altro builtin, Π, che può calcolare il prodotto di tutti gli elementi di un elenco o il fattoriale di un singolo numero
Leo

4
Σè un carattere unicode a due byte sulla mia macchina. Immagino tu usi la code page 1253? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht

5
di @gmatht Husk pagina di codice
Jonathan Allan

21

Piet , 161 byte / 16 codici

Puoi interpretarlo con questo interprete Piet o caricare l'immagine su questo sito Web ed eseguirlo lì. Non sono sicuro del numero di byte, se potessi codificarlo in modo diverso per ridurre le dimensioni.

Versione ingrandita dell'immagine di origine:

rapapaing-image

Spiegazione

Il highlightedtesto mostra lo stack corrente (crescente da sinistra a destra), supponendo che l'input dell'utente sia 5:

1a transizione Inserisci un numero e spingilo nello stack

5

2a transizione Duplica questo numero nello stack

5 5

3a transizione Spingere 1 (la dimensione dell'area rosso scuro) sulla pila

5 5 1

4a transizione Aggiungi i primi due numeri

5 6

5a transizione Moltiplica i primi due numeri

30

6a transizione L'area nera assicura che il cursore si sposta verso il basso fino al codice verde chiaro. Quella transizione spinge 2 (la dimensione del verde scuro) in pila

30 2

7a transizione Dividi il secondo numero in pila per il primo

15

8a transizione Pop e output il numero superiore (interpretato come numero)

[empty]

trappola finale Inserendo un'area bianca, la transizione è a nop, il nero intrappola il nostro cursore. Questo termina l'esecuzione del programma.

File originale (troppo piccolo per qui): Immagine sorgente originale


Siamo passati da un testo intelligibile (ad es. C) a un testo inintelligibile (ad es. Jelly) ad immagini ... E poi? : P
frarugi87,

+1 Non ho ancora visto una risposta Piet con una spiegazione prima
MilkyWay90

21

Brain-Flak , 16 byte

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

Provalo online!

Questa è una delle poche cose in cui il brain-flak è davvero bravo.

Dal momento che questa è una delle cose più semplici che puoi fare nel brain-flak e ha molta visibilità, ecco una spiegazione dettagliata :

# 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 byte

#(#+1)/2&

Mathematica, 10 byte

(#^2+#)/2&

Mathematica, 11 byte

Tr@Range@#&

Mathematica, 12 byte

i~Sum~{i,#}&

Mathematica, 14 byte

(di @ user71546)

1/2/Beta[#,2]&

Mathematica, 15 byte

Tr[#&~Array~#]&

Mathematica, 16 byte

Binomial[#+1,2]&

Mathematica, 17 byte

(di @Non un albero)

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

Mathematica, 18 byte

PolygonalNumber@#&

Mathematica, 19 byte

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

Mathematica, 20 byte

(di @Non un albero)

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

4
Sembra un peccato saltare 13, 14 e 17 ...
Non un albero il

3
Sembra una prossima sfida ... o almeno mi aiuti a completare l'elenco.
J42161217

2
Non ho ancora nulla per 13 o 14 byte (a parte il semplice annullamento del golf delle risposte più brevi), ma eccone altri 26 con un numero di byte maggiore .
Non un albero il

1
@MarkS. il 10.4 funziona benissimo
J42161217

1
@Notatree Per la tua lista, ecco un candidato per il 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


11

linguaggio macchina x86_64 (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 

Per provarlo online! compilare ed eseguire il seguente programma C.

#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) );
  }
}

Grazie a @CodyGray e @Peter per -1.


1
Probabilmente dovresti usare shrinvece di sar, per considerare l'output come non firmato (nessuna modifica nella dimensione del codice). (Notato da @CodyGray e sottolineato nella sua risposta a 7 byte add+loop ).
Peter Cordes,

1
Sembra ottimale per le prestazioni in un'implementazione della formula a forma chiusa, ma è possibile salvare un byte utilizzando la forma a un operando di mul %edio imul %edi(ogni 2B) invece della forma a due operandi 3B. Blocca EDX con il risultato di metà alta, ma va bene. L'operando multiplo è imulstato introdotto più tardi rispetto al modulo a un operando e ha un codice operativo a 2 byte con un 0Fbyte di escape. Ognuna delle tre opzioni produrrà sempre lo stesso risultato eax, è solo la metà alta che dipende da firmata o non firmata.
Peter Cordes,




10

Ottava , 22 19 byte

Perché le operazioni aritmetiche sono noiose ...

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

Provalo online!

Spiegazione

Dato n, questo crea una matrice n× ncon tutte le voci uguali al numero e ; inserisce voci sotto lo zero diagonale; e genera il numero di valori diversi da zero.


Questo è in realtà più breve della versione numerica?
Esolanging Fruit,

@ Challenger5 No, ma la versione numerica è noiosa:@(n)sum(1:n)
Luis Mendo,


8

Gelatina , 2 byte

RS

Provalo online!

Spiegazione

RS

    implicit input
 S  sum of the...
R   inclusive range [1..input]
    implicit output

Somma di Gauss, 3 byte

‘×H

Spiegazione

‘×H

     implicit input
  H  half of the quantity of...
‘    input + 1...
 ×   times input
     implicit output

Questo funziona anche in Anyfix: P (non su TIO)
HyperNeutrino il

8

APL, 3 byte

+/⍳

Provalo online!

+/- somma (riduzione +), - intervallo.


Questo dipende dall'indicizzazione. Se l'indicizzazione è impostata su 0, avresti bisogno di altri 2 byte1+
Werner,

2
L'indicizzazione @Werner è predefinita, 1quindi non l'ho specificato. è comune qui specificare solo quando si utilizza ⎕IO←0(e non è incluso nel conteggio dei byte)
Uriel

8

Haskell , 13 byte

Questo è il più breve ( penso che abbia pensato):

f n=sum[1..n]

Provalo online!

Diretto, 17 13 byte

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

Grazie @WheatWizard per i -4byte!

Provalo online!

Diretto senza punti, 15 byte

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

Grazie @nimi per l'idea!

Provalo online!

Pointfree via sum, 16 byte

sum.enumFromTo 1

Provalo online!

Ricorsivamente, 22 18 byte

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

Grazie @maple_shaft per l'idea e @Laikoni per averlo giocato a golf!

Provalo online!

Standard fold, 19 byte

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

Provalo online!


7

Stellato , 27 22 byte

5 byte salvati grazie a @miles !

, + +  **       +   *.

Provalo online!

Spiegazione

,             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 Grazie! Ottima idea!
Luis Mendo,


7

Java (OpenJDK 8) , 10 byte

a->a++*a/2

Provalo online!

n->n*(n+1)/2Mi sono preso un momento per giocare a golf perché sono lento.

Ma questa non è una vera risposta Java. Non è assolutamente abbastanza dettagliato.

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

Non male, ma possiamo fare di meglio.

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

Adoro Java.


1
Se vuoi che sia ancora più dettagliato perché usare un lambda !? : P
TheLethalCoder

2
Puntavo a lambda verbose, potrei scrivere un programma completo se volessi essere particolarmente eloquente: P
Xanderhall,

1
La stessa identica soluzione era già stata pubblicata
Winter

2
Devo averlo perso, ma in ogni caso, tendo a non guardare al contenuto di altre risposte. Preferisco scrivere il mio golf.
Xanderhall,

7

Controllare , 5 byte

:)*$p

Controllare non è nemmeno un linguaggio da golf, ma batte CJam!

Provalo online!

Spiegazione:

Il numero di input viene inserito nello stack. :lo duplica per dare n, n. Viene quindi incrementato con ), dando n, n+1. *moltiplica i due insieme, quindi $divide il risultato per 2. pstampa il risultato e il programma termina.



6

Taxi , 687 byte

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.

Provalo online!

Non golfato con commenti:

[ 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.

Il loop è del 22,6% in meno di byte rispetto a quello da utilizzare x*(x+1)/2



5

Brainfuck, 24 byte.

L'I / O è gestito come byte.

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

spiegato

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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
È davvero bello che Brainfuck sia in grado di battere alcune lingue di livello superiore in questa sfida.
GarethPW,

È legittimo per me aggiungere una risposta in Lenguage (solo per divertimento) usando il tuo codice? @ATaco
V. Courtois,

Non credo, dato che sarebbe lo stesso codice, codificato solo in modo diverso. @ V.Courtois
ATaco,

@ATaco Ahh hai ragione.
V. Courtois,

5

,,, 6 byte

:1+×2÷

Spiegazione

:1+×2÷

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

Se implementerò il range in qualsiasi momento presto ...


4

Retina , 13 byte

.+
$*
1
$`1
1

Provalo online! Spiegazione: Il primo e l'ultimo stadio sono solo unari ⇔ conversione decimale. Lo stadio intermedio sostituisce ciascuno 1con il numero di 1s alla sua sinistra più un altro 1per 1se stesso, contando così da 1a n, sommando implicitamente i valori.




4

PHP, 19 byte

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

usando builtins, 29 byte:

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

loop, 31 byte:

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

Immagino anche per:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Cubix , 12 10 byte

*,)2I://O@

Versione iniziale

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

Provalo online!

Spiegazione

Espanso su un cubo, il codice è simile al seguente:

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

Il puntatore dell'istruzione (IP) inizia in Idirezione est. Continua a spostarsi verso est fino a quando non incontra lo /specchio, che lo riflette a nord. Quando l'IP raggiunge la cima del codice, si avvolge fino all'ultimo .sulla terza riga, spostandosi verso sud. Quindi si avvolge al penultimo penultimo ., spostandosi verso nord. Quindi raggiunge di /nuovo lo specchio, che lo riflette a est, solo per il prossimo /a rifletterlo di nuovo a nord. Questa volta, l'IP passa al penultimo .sulla terza riga, e quindi all'ultima .sull'ultima riga.

Le istruzioni vengono eseguite nel seguente ordine.

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 Codice macchina, 7 byte

31 C0
01 C8
E2 FC
C3  

I byte precedenti definiscono una funzione che accetta un singolo parametro, n e restituisce un valore contenente la somma di tutti i numeri interi da 1 a n.

È scritto nella convenzione di chiamata x64 di Microsoft , che passa il parametro inECX registro. Il valore restituito viene lasciato EAX, come tutte le convenzioni di chiamata x86 / x86-64.

Mnemonici di assemblaggio non golfati:

       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

Provalo online!
(La chiamata della funzione C è annotata con un attributo che fa sì che GCC la chiami utilizzando la convenzione di chiamata Microsoft utilizzata dal mio codice assembly. Se TIO avesse fornito MSVC, ciò non sarebbe necessario.)


Secondo gli insoliti standard del code golf, si vede che è preferibile questo approccio di loop iterativo approcci che usano la formula matematica più sana ( n(n+1) / 2), anche se ovviamente è notevolmente meno efficiente in termini di velocità di runtime.

Usando la teoria dei numeri, l'implementazione di ceilingcat può ancora essere battuta di un byte. Ognuna di queste istruzioni è essenziale, ma esiste una codifica leggermente più breve IMULche utilizza EAX implicitamente come operando di destinazione (in realtà, utilizzaEDX:EAX , ma possiamo semplicemente ignorare i 32 bit superiori del risultato). Questo è solo 2 byte da codificare, invece di 3.

LEAprende tre byte pure, ma non c'è davvero nessun modo per aggirare questo, perché abbiamo bisogno di incremento , mentre preservando il valore originale. Se avessimo fatto una MOVcopia per fare una copia, INCsaremmo stati a 4 byte. (In x86-32, doveINC è solo 1 byte, saremmo agli stessi 3 byte di LEA.)

Lo spostamento a destra finale è necessario per dividere il risultato a metà ed è certamente più compatto (e più efficiente) di una moltiplicazione. Tuttavia, il codice dovrebbe davvero essere utilizzato shrinvece di sar, poiché presuppone che il valore di input n, sia un numero intero senza segno . (Tale presupposto è valido secondo le regole, ovviamente, ma se sai che l'input è senza segno, non dovresti fare uno spostamento aritmetico con segno, poiché il bit superiore impostato in un grande valore senza segno causerà il risultato per essere errato.)

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

Ora solo 8 byte (grazie a Peter Cordes). Ancora, 8> 7.


1
In realtà, un operando imul ecxo mul ecxfunzionerebbe e salverebbe un byte nell'implementazione a forma chiusa. Non l'ho notato subito; Stavo per commentare che era ottimale sia per le prestazioni che per le dimensioni del codice prima di rendermi conto che un eaxoperando implicito andava bene.
Peter Cordes,

Mi chiedevo se add+ loopsarebbe stato più breve di imulquando guardavo l'altra risposta. Comodo che ci sia una convenzione di chiamata standard che passa il primo argomento inecx
Peter Cordes il

1
Wow, non posso credere di aver perso il modulo per un operando! Ormai dovrei davvero sapere di non dire cose come "impossibile da battere". Quando imparerò ?! Grazie @Peter.
Cody Gray,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.