Сума всіх цілих чисел від 1 до n


63

Я чесно здивований, що цього ще не було зроблено. Якщо ви можете знайти існуючу нитку, обов'язково позначте це як дублікат або дайте мені знати.

Вхідні дані

Ваше введення складається у формі будь-якого додатного цілого числа, що перевищує або дорівнює 1.

Вихід

Ви повинні вивести суму всіх цілих чисел між 1 і включаючи 1 та числом введення.

Приклад

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

OEIS A000217 - Трикутні числа: a (n) = двочлени (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Таблиця лідерів

Запустіть фрагмент коду нижче, щоб переглянути таблицю лідерів відповідей на це питання. (Дякуємо програмісту 5000 та Стінбергу за те, що вони запропонували це, та Мартіну Ендеру за його створення.)



@FryAmTheEggman Вибачте - там було трохи мозку далеко. Я бачу, що ти маєш на увазі.
GarethPW

2
@Aaron ви отримали ninja'd від Husk, який щойно був розміщений з рішенням в 1 байт
Skidsdev

7
Я пропоную фрагмент стека.
програміст5000

Відповіді:



32

Лушпиння , 1 байт

Σ

Спробуйте в Інтернеті!

Вбудований! Σв Husk зазвичай використовується для отримання суми всіх елементів списку, але при застосуванні до числа воно точно повертається n*(n+1)/2.


1
Чи виникає це з цікавості, тому що число присвоюється діапазону, а потім підсумовується, чи це насправді жорстке кодування?
FryAmTheEggman

4
@FryAmTheEggman це насправді жорстко кодоване, і схоже з поведінкою іншого вбудованого Π, який може обчислити добуток усіх елементів списку або фактор одного числа
Лев

4
Σє двобайтовим символом unicode на моїй машині. Я думаю, ви використовуєте кодову сторінку 1253? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht


21

Піт , 161 байт / 16 коделів

Ви можете інтерпретувати його з цим перекладачем Піта або завантажити зображення на цьому сайті і запустити його там. Не впевнений у кількості байтів, якщо я міг би кодувати його по-іншому, щоб зменшити розмір.

Масштабована версія вихідного зображення:

rapapaing-образ

Пояснення

highlightedТекст показує поточний стек (зростає зліва направо), припускаючи , що вхідний користувач 5:

1-й перехід Введіть число і натисніть на стек

5

2-й перехід Скопіюйте це число на стеку

5 5

3-й перехід Натисніть 1 (розміром із темно-червоної області) на стек

5 5 1

4-й перехід Додайте перші два числа

5 6

5-й перехід Помножте два найкращих числа

30

6-й перехід Чорна зона гарантує, що курсор рухається вниз направо до світло-зеленого кодера. Цей перехід штовхає 2 (розміром із темно-зеленого) на стек

30 2

7-й перехід Розділіть друге число на стеку на перше

15

8-й перехід Поп і виведіть верхнє число (інтерпретується як число)

[empty]

заключна пастка Вставивши білу область, перехід є a nop, чорний захоплює наш курсор. На цьому завершується виконання програми.

Оригінальний файл (тут занадто мало): Оригінальне зображення джерела


Ми перейшли від зрозумілого тексту (наприклад, C) до нерозбірливого тексту (наприклад, Jelly) до зображень ... Що далі? : P
frarugi87

+1 Я ще не бачив відповіді Піта з поясненням
MilkyWay90,

21

Мозок-Флак , 16 байт

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

Спробуйте в Інтернеті!

Це одна з небагатьох речей, у яких справді добре працює мозок .

Оскільки це одна з найпростіших речей, яку ви можете зробити в мозку, і вона має багато наочності, ось детальне пояснення:

# 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

Математика, 9 байт

#(#+1)/2&

Математика, 10 байт

(#^2+#)/2&

Математика, 11 байт

Tr@Range@#&

Математика, 12 байт

i~Sum~{i,#}&

Математика, 14 байт

(автор @ user71546)

1/2/Beta[#,2]&

Математика, 15 байт

Tr[#&~Array~#]&

Математика, 16 байт

Binomial[#+1,2]&

Математика, 17 байт

(автор @Not a tree)

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

Математика, 18 байт

PolygonalNumber@#&

Математика, 19 байт

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

Математика, 20 байт

(автор @Not a tree)

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

4
Мабуть, соромно пропустити 13, 14 та 17…
Не дерево

3
Це здається наступним викликом .... або, принаймні, допоможе мені доповнити список.
J42161217

2
У мене ще немає нічого на 13 або 14 байт (крім того, що ви просто не відіграєте ваші короткі відповіді), але ось ще 26 з більшим числом байтів .
Не дерево

1
@MarkS. 10.4 працює чудово
J42161217

1
@Notatree Для вашого списку ось кандидат на 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Марк С.


11

x86_64 машинна мова (Linux), 9 8 байт

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

Для того, щоб спробувати його в Інтернеті! компілювати та запускати наступну програму 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) );
  }
}

Завдяки @CodyGray та @Peter для -1.


1
Ви, ймовірно, повинні використовувати shrзамість sar, щоб трактувати результати як неподписані (без зміни розміру коду). (Плямистий по @CodyGray і вказав в своєму 7-байт add+ loopвідповідь ).
Пітер Кордес

1
Це виглядає оптимальним для продуктивності в реалізації формули закритої форми, але ви можете зберегти байт, використовуючи однооперандну форму mul %ediабо imul %edi(кожен 2B) замість 3B двооперандної форми. Він клобує EDX з високим результатом, але це добре. Мультиоперанд imulбув введений пізніше, ніж однооперандна форма, і має 2-байтовий кодекс з 0Fбайтом втечі. Будь-який з трьох варіантів завжди дасть однаковий результат eax, лише від підписаної та неподписаної залежить лише висока половина.
Пітер Кордес




10

Октава , 22 19 байт

Тому що арифметичні операції нудні ...

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

Спробуйте в Інтернеті!

Пояснення

З огляду на nце, створюється матриця n× nзі всіма записами, рівними кількості e ; робить записи нижче діагонального нуля; і виводить кількість ненульових значень.


Це насправді коротше чисельної версії?
Esolanging Fruit

@ Challenger5 Ні, але числова версія нудна:@(n)sum(1:n)
Луїс Мендо



8

APL, 3 байти

+/⍳

Спробуйте в Інтернеті!

+/- сума (зменшення +), - діапазон.


Це залежить від індексації. Якщо індексація встановлена ​​на 0, вам знадобляться додаткові 2 байти1+
Вернер

2
@Werner індексування за замовчуванням, 1тому я не вказував . тут загально вказувати лише при використанні ⎕IO←0(і він не включається до кількості байтів)
Uriel

8

Haskell , 13 байт

Це найкоротший (я думаю, що думав):

f n=sum[1..n]

Спробуйте в Інтернеті!

Прямий, 17 13 байт

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

Дякуємо @WheatWizard за -4байти!

Спробуйте в Інтернеті!

Безпосередній прямий, 15 байт

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

Дякую @nimi за ідею!

Спробуйте в Інтернеті!

Pointfree via sum, 16 байт

sum.enumFromTo 1

Спробуйте в Інтернеті!

Рекурсивно, 22 18 байт

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

Дякуємо @maple_shaft за ідею та @Laikoni за те, що ми пограли у неї!

Спробуйте в Інтернеті!

Стандарт fold, 19 байт

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

Спробуйте в Інтернеті!


7

Зоряний , 27 22 байт

5 байт збережено завдяки @miles !

, + +  **       +   *.

Спробуйте в Інтернеті!

Пояснення

,             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 Дякую! Дуже гарна ідея!
Луїс Мендо

7

05AB1E , 2 байти

LO

Спробуйте в Інтернеті!

Як це працює

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

Сума Гаусса, 4 байти

>¹*;

Спробуйте в Інтернеті!

Як це працює

>       #input + 1
 ¹*     #get original input & multiply
   ;    #divide by two 

3
ÝOтакож працює і означає hello.
Чарівна восьминога урна

1
L0 і ось ..
dylnan

7

Java (OpenJDK 8) , 10 байт

a->a++*a/2

Спробуйте в Інтернеті!

Взяв хвилинку, щоб покататися на гольфі, n->n*(n+1)/2бо я повільний.

Але це не справжня відповідь Java. Це, безумовно, недостатньо багатослівно.

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

Непогано, але ми можемо зробити і краще.

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

Я люблю Java.


1
Якщо ви хочете, щоб це було ще більш багатослівним, навіщо використовувати лямбда !? : P
TheLethalCoder

2
Я мав на меті багатослівні лямбди, я міг написати повну програму, якби хотів бути особливо красномовними: P
Xanderhall

1
Точно таке рішення вже було розміщено
зима

2
Я, мабуть, пропустив це, але в будь-якому випадку я прагну не дивитися на зміст інших відповідей. Я вважаю за краще писати власний гольф.
Xanderhall

7

Перевірка , 5 байт

:)*$p

Перевірка не є навіть мовою для гри в гольф, але вона б'є CJam!

Спробуйте в Інтернеті!

Пояснення:

Вхідний номер розміщується на стеці. :дублює це, щоб дати n, n. Потім він збільшується ), даючи n, n+1. *помножує два разом, а потім $ділить результат на 2. pдрукується результат і програма припиняється.



6

Таксі , 687 байт

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.

Спробуйте в Інтернеті!

Без гольфу з коментарями:

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

Це на 22,6% менше байтів, ніж для використання x*(x+1)/2



5

Brainfuck, 24 байт.

I / O обробляється як байти.

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

Пояснив

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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
Досить здорово, що Brainfuck в цьому виклику здатний перемогти деякі мови вищого рівня.
GarethPW

Це законно для мене, щоб додати відповідь у Lenguage (просто для розваги), використовуючи ваш код? @ATaco
В. Куртуа

Я не думаю, що це був би той самий код, просто кодований іншим. @ V.Courtois
ATaco

@ATaco Ах, ти правий.
В. Куртуа


4

Сітківка , 13 байт

.+
$*
1
$`1
1

Спробуйте в Інтернеті! Пояснення: Перший і останній етапи є просто унітарним ⇔ десятковим перетворенням. Середній етап замінює кожне 1числом 1s вліво плюс іншим 1для 1себе, таким чином рахуючи від 1до n, підсумовуючи значення неявно.




4

PHP, 19 байт

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

використовуючи вбудовані, 29 байт:

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

цикл, 31 байт:

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

Я думаю, також для:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Cubix , 12 10 байт

*,)2I://O@

Початкова версія

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

Спробуйте в Інтернеті!

Пояснення

Розгорнутий на куб, код виглядає приблизно так:

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

Покажчик інструкцій (IP) починається на I, рухаючись на схід. Він продовжує рухатися на схід, поки не натикається на /дзеркало, яке відбиває його на північ. Коли IP доходить до вершини коду, він завертається до останнього .на третьому рядку, рухаючись на південь. Потім він завертається до передостаннього .на останній лінії, рухаючись на північ. Потім воно /знову доходить до дзеркала, яке відбиває його на схід, лише для наступного, /щоб знову відбити його на північ. Цього разу IP переходить до передостаннього .на третьому рядку, а потім останньому .в останньому рядку.

Інструкції виконуються в наступному порядку.

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 Машинний код, 7 байт

31 C0
01 C8
E2 FC
C3  

Вищеописані байти визначають функцію, яка приймає один параметр, nі повертає значення, що містить суму всіх цілих чисел від 1 до n.

Він записується до конвенції про виклики Microsoft x64 , яка передає параметр у ECXрегістр. Повертається значення залишається EAX, як і всі умови викликів x86 / x86-64.

Невикольована збірна мнемоніка:

       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

Спробуйте в Інтернеті!
(Виклик функції C там позначається атрибутом, який змушує GCC викликати його за допомогою угоди про виклик Microsoft, яку використовує мій код складання. Якби TIO надав MSVC, це не було б необхідним.)


За незвичайними стандартами кодового гольфу ви бачите, що цей ітеративний циклічний підхід є кращим перед підходами, які використовують більш розумну математичну формулу ( n(n+1) / 2), хоча він, очевидно, є менш ефективним з точки зору швидкості руху.

Використовуючи теорію чисел, реалізацію стельової кішки все одно можна обіграти на один байт. Кожна з цих інструкцій є важливою, але існує трохи коротше кодування, IMULяке використовується EAX неявно як операнд призначення (насправді він використовує EDX:EAX, але ми можемо просто ігнорувати верхні 32 біти результату). Це лише 2 байти для кодування, вниз від 3.

LEAтакож займає три байти, але насправді цього немає, тому що нам потрібно наростити , зберігаючи початкове значення. Якби ми зробили MOVкопію, тоді INCми знаходимося в 4 байти. (У x86-32, де INCє лише 1 байт, ми знаходимося на тих же 3 байтах, що і LEA.)

Кінцевий зсув правої частини потрібен для ділення результату навпіл і, безумовно, більш компактний (і більш ефективний), ніж множення. Тим НЕ менше, код повинен бути дійсно використовуючи shrзамість sar, так як це передбачає , що значення вхідного сигналу, n, це беззнаковое ціле число. (Це припущення, звичайно, справедливо згідно з правилами, але якщо ви знаєте, що вхід не підписаний, то вам не слід робити підписаний арифметичний зсув, оскільки верхній біт, встановлений у великому неподписаному значенні, спричинить результат бути невірним.)

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

Зараз лише 8 байт (завдяки Пітеру Кордесу). Все-таки 8> 7.


1
Насправді, один-операнд imul ecxабо mul ecxби працював і зберігав байт у реалізації закритої форми. Я не помітив цього відразу; Я збирався прокоментувати, що це було оптимально як для продуктивності, так і для розміру коду, перш ніж зрозуміти, що неявний eaxоперанд є нормальним.
Пітер Кордес

Мені було цікаво, чи add+ loopбуде коротше, ніж imulпри перегляді іншої відповіді. Зрозуміло, що існує стандартна угода про дзвінки, яка передає перший аргументecx
Пітер Кордес,

1
Нічого собі, я не можу повірити, що я пропустив форму одного операнда! Я дійсно до цього часу повинен знати, щоб не говорити таких речей, як "не можна перемогти". Коли я буду вчитися ?! Дякую, @Peter.
Коді Грей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.