Suma wszystkich liczb całkowitych od 1 do n

63

Jestem szczerze zaskoczony, że jeszcze tego nie zrobiono. Jeśli możesz znaleźć istniejący wątek, oznacz go jako duplikat lub daj mi znać.

Wejście

Twój wkład ma postać dodatniej liczby całkowitej większej lub równej 1.

Wynik

Musisz wyprowadzić sumę wszystkich liczb całkowitych od 1 włącznie i liczby wejściowej.

Przykład

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

OEIS A000217 - Liczby trójkątne: a (n) = dwumianowy (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Tabela liderów

Uruchom poniższy fragment kodu, aby wyświetlić tabelę wyników dla odpowiedzi na to pytanie. (Podziękowania dla programmer5000 i steenbergh za zasugerowanie tego, a Martin Ender za jego utworzenie).

GarethPW
źródło
5
Ściśle związany
FryAmTheEggman
@FryAmTheEggman Przepraszamy - miał tam pierdnięcie mózgu. Rozumiem, co masz na myśli.
GarethPW
2
@Aaron, otrzymałeś ninja od Husk, który właśnie opublikował rozwiązanie 1-bajtowe
Skidsdev
7
Sugeruję fragment kodu stosu.
programista
1
Powiązane: minecraftforum.net/forums/off-topic/…
Jerry Jeremiah

Odpowiedzi:

46

Pyth , 2 bajty

sS

Wypróbuj online! Domniemane dane wejściowe. Sjest 1-indeksowanym zakresem i sjest sumą.

Jim
źródło
102
Wreszcie kod Pyth (on) brzmi jak wąż.
całkowicie ludzki,
2
To idealne wyzwanie dla Pytha ...
Pan Xcoder,
Chciałem na to odpowiedzieć, ale chyba nie
Stan Strum,
32

Łuska , 1 bajt

Σ

Wypróbuj online!

Wbudowany! Σw Husk jest zwykle używany do uzyskania sumy wszystkich elementów listy, ale po zastosowaniu do liczby zwraca dokładnie n*(n+1)/2.

Lew
źródło
1
Z ciekawości, czy to się dzieje, ponieważ liczba jest rzutowana na zakres, a następnie sumowana, czy to rzeczywiście jest zakodowane?
FryAmTheEggman
4
@FryAmTheEggman jest to tak naprawdę zakodowane i jest podobne do zachowania innego wbudowanego, Π, który może obliczyć iloczyn wszystkich elementów listy lub silni pojedynczej liczby
Leo
4
Σto dwubajtowy znak Unicode na moim komputerze. Chyba używasz strony kodowej 1253? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht
5
@gmatht Husk strona kodowa
Jonathan Allan
21

Piet , 161 bajtów / 16 kodów

Możesz zinterpretować go za pomocą tego tłumacza Piet lub załadować obraz na tej stronie i tam go uruchomić. Nie jestem pewien liczby bajtów, gdybym mógł ją zakodować inaczej, aby zmniejszyć rozmiar.

Skalowana wersja obrazu źródłowego:

obraz rapapaing

Wyjaśnienie

highlightedTekst pokazuje aktualny stos (rosnącą od lewej do prawej), przy założeniu, że dane wejściowe użytkownika 5:

1. przejście Wpisz liczbę i wepchnij ją na stos

5

2. przejście Zduplikuj ten numer na stosie

5 5

3. przejście Wciśnij 1 (rozmiar ciemnoczerwonego obszaru) na stos

5 5 1

4. przejście Dodaj dwie najlepsze liczby

5 6

5. przejście Pomnóż dwie pierwsze cyfry

30

6. przejście Czarny obszar gwarantuje, że kursor przesunie się w prawo do jasnozielonego kodu. To przejście popycha 2 (rozmiar ciemnozielony) na stos

30 2

7. przejście Podziel drugą liczbę na stosie przez pierwszą

15

8. przejście Pop i wyślij najwyższy numer (interpretowany jako liczba)

[empty]

ostatnia pułapka Po wstawieniu białego obszaru przejście jest nopczarne, pułapka na nasz kursor. To kończy wykonywanie programu.

Plik oryginalny (zdecydowanie za mały, aby go tutaj): Oryginalny obraz źródłowy

ბიმო
źródło
Przeszliśmy z tekstu zrozumiałego (np. C) do tekstu niezrozumiałego (np. Galaretki) na obrazy ... Co dalej? : P
frarugi87,
+1 Nie widziałem wcześniej odpowiedzi Piet z wyjaśnieniem
MilkyWay90
21

Brain-Flak , 16 bajtów

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

Wypróbuj online!

Jest to jedna z niewielu rzeczy, w których atak mózgu jest naprawdę dobry.

Ponieważ jest to jedna z najprostszych rzeczy, które można wykonać w przypadku uderzenia mózgu i ma ona dużą widoczność, oto szczegółowe wyjaśnienie:

# 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.
)
DJMcMayhem
źródło
20

Oaza , 3 bajty

n+0

Wypróbuj online!

Jak to działa

n+0
  0    a(0)=0
n+     a(n)=n+a(n-1)
Leaky Nun
źródło
29
I oto byłem, przez całe życie myśląc, że n + 0 to n ...
Wojowu
18

Mathematica, 9 bajtów

#(#+1)/2&

Mathematica, 10 bajtów

(#^2+#)/2&

Mathematica, 11 bajtów

Tr@Range@#&

Mathematica, 12 bajtów

i~Sum~{i,#}&

Mathematica, 14 bajtów

(autor @ user71546)

1/2/Beta[#,2]&

Mathematica, 15 bajtów

Tr[#&~Array~#]&

Mathematica, 16 bajtów

Binomial[#+1,2]&

Mathematica, 17 bajtów

(autor @Not a tree)

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

Mathematica, 18 bajtów

PolygonalNumber@#&

Mathematica, 19 bajtów

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

Mathematica, 20 bajtów

(autor @Not a tree)

f@0=0;f@i_:=i+f[i-1]
J42161217
źródło
4
Szkoda pominąć 13, 14 i 17…
To nie jest drzewo
3
Wydaje się, że to kolejne wyzwanie ... albo przynajmniej pomóż mi uzupełnić listę.
J42161217,
2
Nadal nie mam nic dla 13 lub 14 bajtów (oprócz odhaczania krótszych odpowiedzi), ale oto kolejne 26 z większą liczbą bajtów .
Nie drzewo,
1
@Znaki. na 10.4 działa dobrze
J42161217,
1
@Notatree Do twojej listy, tutaj jest kandydat do 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.
17

JavaScript (ES6), 10 bajtów

n=>n*++n/2

Przykład

Arnauld
źródło
2
n*-~n/2działa również, ale tylko dlan < 2**31
Patrick Roberts
11

język maszynowy x86_64 (Linux), 9 8 bajtów

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

Aby Spróbuj online! skompiluj i uruchom następujący program 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) );
  }
}

Dzięki @CodyGray i @Peter za -1.

sufitowy
źródło
1
Prawdopodobnie powinieneś użyć shrzamiast sar, aby traktować swój wynik jako niepodpisany (bez zmiany rozmiaru kodu). (Wykryty przez @CodyGray i wskazany w swojej 7-bajtowej odpowiedzi add+loop ).
Peter Cordes
1
Wygląda to optymalnie pod względem wydajności w implementacji formuły zamkniętej, ale można zapisać bajt, używając postaci jednopłatowej mul %edilub imul %edi(każda 2B) zamiast postaci dwupłatowej 3B. Blokuje EDX z wynikiem wysokiej połowy, ale to dobrze. Multi-operand imulzostał wprowadzony później niż forma jednop operandowa i ma 2-bajtowy kod operacji z 0Fbajtem zmiany znaczenia. Każda z trzech opcji zawsze da ten sam wynik eax, tylko wysoka połowa zależy od podpisanego vs. niepodpisanego.
Peter Cordes
10

Oktawa , 22 19 bajtów

Ponieważ operacje arytmetyczne są nudne ...

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

Wypróbuj online!

Wyjaśnienie

Biorąc pod uwagę n, tworzy to macierz nx nze wszystkimi wpisami równymi liczbie e ; dokonuje wpisów poniżej zera po przekątnej; i wyświetla liczbę niezerowych wartości.

Luis Mendo
źródło
Czy to faktycznie jest krótsze niż wersja numeryczna?
Esolanging Fruit
@ Challenger5 Nie, ale wersja numeryczna jest nudna:@(n)sum(1:n)
Luis Mendo
2
Lub 16 bajtów z operacjami arytmetycznymi, ale niesum .
Stewie Griffin,
8

Galaretka , 2 bajty

RS

Wypróbuj online!

Wyjaśnienie

RS

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

Suma Gaussa, 3 bajty

‘×H

Wyjaśnienie

‘×H

     implicit input
  H  half of the quantity of...
‘    input + 1...
 ×   times input
     implicit output
całkowicie ludzki
źródło
Działa to również w Anyfix: P (nie w TIO)
HyperNeutrino
8

APL, 3 bajty

+/⍳

Wypróbuj online!

+/- suma (zmniejszenie +), - zakres.

Uriel
źródło
To zależy od indeksowania. Jeśli indeksowanie jest ustawione na 0, potrzebne byłyby dodatkowe 2 bajty1+
Werner
2
Indeksowanie @Werner jest domyślne, 1więc nie określiłem. tutaj często określa się tylko przy użyciu ⎕IO←0(i nie jest uwzględniane w liczbie bajtów)
Uriel
8

Haskell , 13 bajtów

To jest najkrótsze (tak mi się wydaje ):

f n=sum[1..n]

Wypróbuj online!

Bezpośrednio, 17 13 bajtów

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

Dzięki @WheatWizard za -4bajty!

Wypróbuj online!

Pointfree direct, 15 bajtów

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

Dzięki @nimi za pomysł!

Wypróbuj online!

Pointfree via sum, 16 bajtów

sum.enumFromTo 1

Wypróbuj online!

Rekurencyjnie, 22 18 bajtów

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

Dzięki @maple_shaft za pomysł i @Laikoni za grę w golfa!

Wypróbuj online!

Standardowy fold, 19 bajtów

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

Wypróbuj online!

ბიმო
źródło
7

Gwiaździsta , 27 22 bajtów

5 bajtów zapisanych dzięki @miles !

, + +  **       +   *.

Wypróbuj online!

Wyjaśnienie

,             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
Luis Mendo
źródło
22 bajty .
mile
@miles Thanks! Bardzo dobry pomysł!
Luis Mendo,
7

05AB1E , 2 bajty

LO

Wypróbuj online!

Jak to działa

     #input enters stack implicitly
L    #pop a, push list [1 .. a]
 O   #sum of the list
     #implicit output 

Suma Gaussa, 4 bajty

>¹*;

Wypróbuj online!

Jak to działa

>       #input + 1
 ¹*     #get original input & multiply
   ;    #divide by two 
kosmiczne śmieci
źródło
3
ÝOdziała również i oznacza hello.
Magic Octopus Urn
1
L0 i oto ..
dylnan
7

Java (OpenJDK 8) , 10 bajtów

a->a++*a/2

Wypróbuj online!

Minęło trochę czasu na golfa, n->n*(n+1)/2bo jestem wolny.

Ale to nie jest prawdziwa odpowiedź w języku Java. To zdecydowanie za mało gadatliwe.

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

Nieźle, ale możemy zrobić lepiej.

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

Kocham Javę.

Xanderhall
źródło
1
Jeśli chcesz, żeby było jeszcze bardziej szczegółowe, po co używać lambda !? : P
TheLethalCoder
2
Dążyłem do pełnych lambd
1
Dokładne to samo rozwiązanie zostało już opublikowane
Winter
2
Musiałem to przegapić, ale w każdym razie staram się nie patrzeć na treść innych odpowiedzi. Wolę pisać własne golfa.
Xanderhall
7

Sprawdź , 5 bajtów

:)*$p

Check nie jest nawet językiem golfowym, ale pokonuje CJam!

Wypróbuj online!

Wyjaśnienie:

Numer wejściowy jest umieszczany na stosie. :powiela to, aby dać n, n. Następnie zwiększa się ), dając n, n+1. *mnoży je razem, a następnie $dzieli wynik przez 2. pdrukuje wynik i program się kończy.

Esolanging Fruit
źródło
6

MATL , 2 bajty

:s

Wypróbuj online!

Nie szczęśliwa buźka.

AlexRacer
źródło
2
Cholera, w końcu wyzwanie, na które z łatwością mogłem odpowiedzieć w MATL, ale pobiłeś mnie do tego :(
Lui
6

Taxi , 687 bajtów

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.

Wypróbuj online!

Nie grał w golfa z komentarzami:

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

Jest o 22,6% mniej bajtów do zapętlenia niż do użycia x*(x+1)/2

Inżynier Toast
źródło
5

Brainfuck, 24 bajtów.

We / wy jest traktowane jako bajty.

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

Wyjaśniono

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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
ATaco
źródło
2
To całkiem fajne, że Brainfuck jest w stanie pokonać niektóre języki wyższego poziomu w tym wyzwaniu.
GarethPW
Czy to legalne, żebym dodała odpowiedź w Lenguage (dla zabawy) za pomocą twojego kodu? @ATaco
V. Courtois
Nie sądzę, ponieważ byłby to ten sam kod, po prostu zakodowany inaczej. @ V.Courtois
ATaco
@ATaco Ahh masz rację.
V. Courtois,
5

,,,, 6 bajtów

:1+×2÷

Wyjaśnienie

:1+×2÷

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

Jeśli wkrótce wprowadzę zakres ...

całkowicie ludzki
źródło
4

Siatkówka , 13 bajtów

.+
$*
1
$`1
1

Wypróbuj online! Objaśnienie: Pierwszy i ostatni etap są po prostu jednostronnym przeliczeniem dziesiętnym. Środkowy etap zastępuje każdy 1liczbą 1s po lewej stronie plus drugą 1dla 1siebie, licząc w ten sposób od 1do n, sumując wartości pośrednio.

Neil
źródło
4

> <> , 7 + 3 = 10 bajtów

Oblicza n (n + 1) / 2 .
Dodano 3 bajty dla flagi -v

:1+2,*n

Wypróbuj online!

Lub jeśli dane wejściowe można traktować jako kod znakowy:

> <> , 9 bajtów

i:1+2,*n;

Wypróbuj online!

Emigna
źródło
2
Inne podejście matematyczne ( (n^2+n)/2) ma również 7 bajtów:::*+2,n
steenbergh,
4

PHP, 19 bajtów

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

przy użyciu wbudowanych 29 bajtów:

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

pętla, 31 bajtów:

while($argn)$s+=$argn--;echo$s;
Tytus
źródło
Myślę też, że za:for(;$argn;$s+=$argn--);echo$s;
Progrock
4

Cubix , 12 10 bajtów

*,)2I://O@

Początkowa wersja

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

Wypróbuj online!

Wyjaśnienie

Kod rozwinięty do kostki wygląda następująco:

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

Wskaźnik instrukcji (IP) zaczyna się od I, poruszając się na wschód. Kontynuuje ruch na wschód, aż natrafi na /lustro, które odbija je na północ. Gdy adres IP osiąga szczyt kodu, zawija się do ostatniego .w trzeciej linii, przesuwając się na południe. Następnie zawija się do przedostatniego .na ostatniej linii, przesuwając się na północ. Następnie ponownie dociera do /lustra, które odbija je na wschód, tylko dla następnego /odbicia go ponownie na północ. Tym razem IP zawija się w przedostatni .w trzeciej linii, a następnie .w ostatniej linii.

Instrukcje są wykonywane w następującej kolejności.

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
Łukasz
źródło
4

Kod maszynowy x86-64, 7 bajtów

31 C0
01 C8
E2 FC
C3  

Powyższe bajty definiują funkcję, która akceptuje pojedynczy parametr ni zwraca wartość zawierającą sumę wszystkich liczb całkowitych od 1 do n.

Jest zapisywany do konwencji wywoływania Microsoft x64 , która przekazuje parametr do ECXrejestru. Zwracana jest wartość EAX, podobnie jak wszystkie konwencje wywoływania x86 / x86-64.

Mnemoniki do montażu bez golfa:

       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

Wypróbuj online!
(Wywołanie funkcji C tam jest opatrzone adnotacją, która powoduje, że GCC wywołuje ją przy użyciu konwencji wywoływania Microsoft, której używa mój kod zestawu. Gdyby TIO dostarczyło MSVC, nie byłoby to konieczne).


Zgodnie z nietypowymi standardami golfa kodowego widać, że to iteracyjne podejście do zapętlania jest lepsze niż podejście, które wykorzystuje bardziej rozsądną formułę matematyczną ( n(n+1) / 2), nawet jeśli jest oczywiście znacznie mniej wydajne pod względem prędkości działania.

Stosując teorię liczb, implementacja pułapu nadal może zostać pobita o jeden bajt. Każda z tych instrukcji jest niezbędna, ale istnieje nieco krótsze kodowanie, IMULktóre używa EAX domyślnie jako operandu docelowego (faktycznie używa EDX:EAX, ale możemy po prostu zignorować górne 32 bity wyniku). To tylko 2 bajty do zakodowania, w porównaniu z 3.

LEAzajmuje również trzy bajty, ale tak naprawdę nie można tego obejść, ponieważ musimy zwiększyć wartość , zachowując pierwotną wartość. Gdybyśmy zrobili a, MOVaby zrobić kopię INC, mielibyśmy 4 bajty. (W x86-32, gdzie INCjest tylko 1 bajt, mielibyśmy te same 3 bajty, co LEA.)

Ostateczne przesunięcie w prawo jest konieczne, aby podzielić wynik na pół i jest z pewnością bardziej zwarte (i bardziej wydajne) niż mnożenie. Jednak kod powinien naprawdę używać shrzamiast sar, ponieważ przy założeniu, że wartość wejściowa n, jest liczbą całkowitą bez znaku . (To założenie jest oczywiście zgodne z regułami, ale jeśli wiesz, że dane wejściowe są niepodpisane, to nie powinieneś robić podpisanej zmiany arytmetycznej, ponieważ górny bit ustawiony w dużej wartości bez znaku spowoduje wynik być niepoprawnym).

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

Teraz tylko 8 bajtów (dzięki Peter Cordes). Mimo to 8> 7.

Cody Gray
źródło
1
W rzeczywistości jeden operand imul ecxlub mul ecxdziałałby i zapisywałby bajt w implementacji w formie zamkniętej. Nie zauważyłem tego od razu; Już miałem skomentować, że jest optymalny zarówno pod względem wydajności, jak i rozmiaru kodu, zanim zdałem sobie sprawę, że domyślny eaxoperand jest w porządku.
Peter Cordes
Zastanawiałem się, czy add+ loopbędzie krótszy niż imulpatrząc na drugą odpowiedź. Przydatne, że istnieje standardowa konwencja telefoniczna, która przechodzi pierwszy argumentecx
Peter Cordes
1
Wow, nie mogę uwierzyć, że przegapiłem formę z jednym operandem! Powinienem już naprawdę wiedzieć, żeby nie mówić rzeczy takich jak „nie da się pokonać”. Kiedy się nauczę ?! Dzięki, @Peter.
Cody Gray