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



@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

Odpowiedzi:



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.


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


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


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]

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.


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.


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.


Czy to faktycznie jest krótsze niż wersja numeryczna?
Esolanging Fruit

@ Challenger5 Nie, ale wersja numeryczna jest nudna:@(n)sum(1:n)
Luis Mendo



8

APL, 3 bajty

+/⍳

Wypróbuj online!

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


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!


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


@miles Thanks! Bardzo dobry pomysł!
Luis Mendo,


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


1
Jeśli chcesz, żeby było jeszcze bardziej szczegółowe, po co używać lambda !? : P
TheLethalCoder


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.



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



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

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,


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.




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;

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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.