Tổng tất cả các số nguyên từ 1 đến n


63

Tôi thực sự ngạc nhiên rằng điều này đã không được thực hiện. Nếu bạn có thể tìm thấy một chủ đề hiện có, bằng mọi cách, hãy đánh dấu đây là một bản sao hoặc cho tôi biết.

Đầu vào

Đầu vào của bạn ở dạng bất kỳ số nguyên dương nào lớn hơn hoặc bằng 1.

Đầu ra

Bạn phải xuất tổng của tất cả các số nguyên giữa và bao gồm 1 và đầu vào số.

Thí dụ

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

OEIS A000217 - Số tam giác: a (n) = nhị thức (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Bảng xếp hạng

Chạy đoạn mã dưới đây để xem bảng xếp hạng cho câu trả lời của câu hỏi này. (Cảm ơn lập trình viên 5000 và steenbergh đã gợi ý điều này và Martin Ender đã tạo ra nó.)



@FryAmTheEggman Xin lỗi - đã có một chút xì hơi ở đó. Tôi hiểu ý bạn là gì.
GarethPW

2
@Aaron bạn đã có ninja'd bởi Husk, vừa được đăng với giải pháp 1 byte
Skidsdev

7
Tôi đề nghị một đoạn trích ngăn xếp.
lập trình

Câu trả lời:



32

Husk , 1 byte

Σ

Hãy thử trực tuyến!

Được xây dựng bên trong! Σtrong Husk thường được sử dụng để lấy tổng của tất cả các phần tử của danh sách, nhưng khi áp dụng cho một số, nó trả về chính xác n*(n+1)/2.


1
Vì tò mò, điều này xảy ra bởi vì số được truyền vào một phạm vi và sau đó được tóm tắt, hay đây thực sự là mã hóa cứng?
FryAmTheEggman

4
@FryAmTheEggman đây thực sự là mã hóa cứng, và tương tự như hành vi của một nội dung khác,, có thể tính toán sản phẩm của tất cả các yếu tố của một danh sách hoặc giai thừa của một số duy nhất
Leo

4
Σlà một ký tự unicode hai byte trên máy của tôi. Tôi đoán bạn sử dụng mã trang 1253? msdn.microsoft.com/en-us/l
Library / cc195055.aspx


21

Piet , 161 byte / 16 codel

Bạn có thể diễn giải nó với trình thông dịch Piet này hoặc tải lên hình ảnh trên trang web này và chạy nó ở đó. Không chắc chắn về số lượng byte, nếu tôi có thể mã hóa nó khác nhau để giảm kích thước.

Phiên bản thu nhỏ của hình ảnh nguồn:

hình ảnh rapapaing

Giải trình

Văn highlightedbản hiển thị ngăn xếp hiện tại (tăng dần từ trái sang phải), giả sử đầu vào của người dùng là 5:

Chuyển tiếp 1 Nhập một số và đẩy nó lên ngăn xếp

5

Chuyển tiếp lần 2 Sao y số này trên ngăn xếp

5 5

Chuyển tiếp thứ 3 Đẩy 1 (kích thước của vùng màu đỏ sẫm) lên ngăn xếp

5 5 1

Chuyển tiếp lần thứ 4 Thêm hai số trên cùng

5 6

Chuyển tiếp thứ 5 Nhân hai số trên cùng

30

Chuyển tiếp thứ 6 Vùng màu đen đảm bảo rằng con trỏ di chuyển xuống bên phải tới bảng màu xanh nhạt. Quá trình chuyển đổi đó đẩy 2 (kích thước của màu xanh đậm) lên ngăn xếp

30 2

Chuyển tiếp thứ 7 Chia số thứ hai trên ngăn xếp cho số thứ nhất

15

Chuyển tiếp thứ 8 Pop và xuất số hàng đầu (được hiểu là số)

[empty]

cái bẫy cuối cùng Bằng cách chèn một vùng màu trắng, quá trình chuyển đổi là a nop, màu đen bẫy con trỏ của chúng ta. Điều này kết thúc thực hiện chương trình.

Tệp gốc (quá nhỏ cho ở đây): Hình ảnh nguồn gốc


Chúng tôi đã chuyển từ một văn bản dễ hiểu (ví dụ C) sang văn bản khó hiểu (ví dụ Jelly) sang hình ảnh ... Tiếp theo là gì? : P
frarugi87

+1 Tôi chưa thực sự thấy câu trả lời của Piet với lời giải thích trước đây
MilkyWay90

21

Brain-Flak , 16 byte

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

Hãy thử trực tuyến!

Đây là một trong số ít những thứ mà bộ não thực sự giỏi.

Vì đây là một trong những điều đơn giản nhất bạn có thể làm trong trò chơi trí não và nó có rất nhiều khả năng hiển thị, đây là một lời giải thích chi tiết :

# 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

Toán học, 9 byte

#(#+1)/2&

Toán học, 10 byte

(#^2+#)/2&

Toán học, 11 byte

Tr@Range@#&

Toán học, 12 byte

i~Sum~{i,#}&

Toán học, 14 byte

(bởi @ user71546)

1/2/Beta[#,2]&

Toán học, 15 byte

Tr[#&~Array~#]&

Toán học, 16 byte

Binomial[#+1,2]&

Toán học, 17 byte

(bởi @ Không phải là một cái cây)

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

Toán học, 18 byte

PolygonalNumber@#&

Toán học, 19 byte

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

Toán học, 20 byte

(bởi @ Không phải là một cái cây)

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

4
Có vẻ xấu hổ khi bỏ qua 13, 14 và 17
Không phải là một cái cây vào

3
Có vẻ như một thử thách tiếp theo .... hoặc ít nhất là giúp tôi hoàn thành danh sách.
J42161217

2
Tôi vẫn không có bất cứ điều gì cho 13 hoặc 14 byte (ngoài việc không bỏ qua các câu trả lời ngắn hơn của bạn), nhưng đây là 26 câu khác với số byte lớn hơn .
Không phải là một cái cây

1
@Điểm. vào ngày 10,4 hoạt động tốt
J42161217

1
@Notatree Đối với danh sách của bạn, đây là một ứng cử viên cho 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


11

ngôn ngữ máy 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 

Để thử trực tuyến! biên dịch và chạy chương trình C sau.

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

Nhờ @CodyGray@ Peter cho -1.


1
Bạn có thể nên sử dụng shrthay vì sar, để coi đầu ra của bạn là không dấu (không thay đổi kích thước mã). (Được phát hiện bởi @CodyGray và chỉ ra trong câu trả lời 7 byte add+ của anh ấyloop ).
Peter Cordes

1
Điều này có vẻ tối ưu cho hiệu suất khi triển khai công thức dạng đóng, nhưng bạn có thể lưu một byte bằng cách sử dụng dạng một toán hạng của mul %edihoặc imul %edi(mỗi 2B) thay vì dạng hai toán hạng 3B. Nó chặn EDX với kết quả cao, nhưng điều đó tốt. Đa toán hạng imulđược giới thiệu muộn hơn so với dạng một toán hạng và có mã opcode 2 byte với 0Fbyte thoát. Bất kỳ tùy chọn nào trong ba tùy chọn sẽ luôn tạo ra cùng một kết quả eax, đó chỉ là một nửa cao phụ thuộc vào ký so với không dấu.
Peter Cordes




10

Octave , 22 19 byte

Bởi vì các phép toán số học là nhàm chán ...

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

Hãy thử trực tuyến!

Giải trình

Cho trước n, điều này tạo ra một ma trận n× nvới tất cả các mục bằng số e ; làm cho các mục dưới đường chéo bằng không; và đưa ra số lượng giá trị khác không.


Đây có thực sự ngắn hơn phiên bản số?
Esolanging Fruit 23/07/17

@ Challenger5 Không, nhưng phiên bản số thật nhàm chán:@(n)sum(1:n)
Luis Mendo



8

APL, 3 byte

+/⍳

Hãy thử trực tuyến!

+/- tổng (giảm +), - phạm vi.


Điều này phụ thuộc vào việc lập chỉ mục. Nếu lập chỉ mục được đặt thành 0, thì bạn cần thêm 2 byte1+
Werner

2
Lập chỉ mục @Werner là mặc định 1vì vậy tôi không chỉ định. Nó chỉ phổ biến ở đây để chỉ định khi sử dụng ⎕IO←0(và nó không bao gồm trong số byte)
Uriel

8

Haskell , 13 byte

Đây là ngắn nhất (tôi nghĩ đã nghĩ):

f n=sum[1..n]

Hãy thử trực tuyến!

Trực tiếp, 17 13 byte

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

Cảm ơn @WheatWizard cho -4byte!

Hãy thử trực tuyến!

Pointfree trực tiếp, 15 byte

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

Cảm ơn @nimi vì ý tưởng!

Hãy thử trực tuyến!

Pointfree qua sum, 16 byte

sum.enumFromTo 1

Hãy thử trực tuyến!

Đệ quy, 22 18 byte

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

Cảm ơn @maple_shaft vì ý tưởng & @Laikoni đã chơi golf!

Hãy thử trực tuyến!

Chuẩn fold, 19 byte

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

Hãy thử trực tuyến!


7

Starry , 27 22 byte

5 byte được lưu nhờ @miles !

, + +  **       +   *.

Hãy thử trực tuyến!

Giải trình

,             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 Cảm ơn! Ý kiến ​​rất hay!
Luis Mendo


7

Java (OpenJDK 8) , 10 byte

a->a++*a/2

Hãy thử trực tuyến!

Mất một lúc để chơi gôn n->n*(n+1)/2vì tôi chậm.

Nhưng đây không phải là một câu trả lời Java thực sự. Nó chắc chắn không đủ dài dòng.

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

Không tệ, nhưng chúng ta có thể làm tốt hơn.

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

Tôi yêu Java.


1
Nếu bạn muốn nó dài hơn nữa, tại sao lại sử dụng lambda!? : P
TheLethalCoder

2
Tôi đang nhắm đến lambdas dài dòng, tôi có thể viết một chương trình đầy đủ nếu tôi muốn đặc biệt hùng hồn: P
Xanderhall 19/07/17

1
Giải pháp chính xác tương tự đã được đăng
Mùa đông

2
Tôi đã phải bỏ lỡ nó, nhưng trong mọi trường hợp, tôi có xu hướng không nhìn vào nội dung của các câu trả lời khác. Tôi thích viết golf của riêng tôi.
Xanderhall

7

Kiểm tra , 5 byte

:)*$p

Kiểm tra thậm chí không phải là một ngôn ngữ chơi gôn, nhưng nó đánh bại CJam!

Hãy thử trực tuyến!

Giải trình:

Số đầu vào được đặt trên ngăn xếp. :Nhân đôi nó để cho n, n. Nó sau đó được tăng lên với ), cho n, n+1. *nhân hai số đó với nhau, sau đó $chia kết quả cho 2. pin kết quả và chương trình kết thúc.



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.

Hãy thử trực tuyến!

Un-golfed với ý kiến:

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

Đó là vòng lặp ít hơn 22,6% so với việc sử dụng x*(x+1)/2



5

Brainfuck, 24 byte.

I / O được xử lý dưới dạng byte.

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

Giải thích

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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
Thật tuyệt khi Brainfuck có thể đánh bại một số ngôn ngữ cấp cao hơn trong thử thách này.
GarethPW

Điều đó có hợp pháp đối với tôi để thêm câu trả lời trong Lenguage (chỉ để giải trí) bằng mã của bạn không? @ATaco
V. Courtois

Tôi không nghĩ vậy, vì nó sẽ là cùng một mã, chỉ được mã hóa khác nhau. @ V.Courtois
ATaco

@ATaco Ahh bạn nói đúng.
V. Courtois

5

,,, 6 byte

:1+×2÷

Giải trình

:1+×2÷

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

Nếu tôi triển khai phạm vi bất cứ lúc nào sớm ...


4

Võng mạc , 13 byte

.+
$*
1
$`1
1

Hãy thử trực tuyến! Giải thích: Các giai đoạn đầu tiên và cuối cùng chỉ là chuyển đổi thập phân đơn nhất. Giai đoạn giữa thay thế từng cái 1với số 1s ở bên trái của nó cộng với một cái khác 1cho 1chính nó, do đó đếm từ 1đến n, tổng hợp các giá trị ngầm.




4

PHP, 19 byte

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

sử dụng nội dung, 29 byte:

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

vòng lặp, 31 byte:

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

Tôi đoán cũng vậy:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Hình khối , 12 10 byte

*,)2I://O@

Phiên bản đầu tiên

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

Hãy thử trực tuyến!

Giải trình

Được mở rộng trên một khối lập phương, mã trông như thế này:

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

Con trỏ lệnh (IP) bắt đầu tại I, di chuyển về phía đông. Nó tiếp tục di chuyển về phía đông cho đến khi nó đi qua /gương, nó phản chiếu nó về phía bắc. Khi IP đạt đến đỉnh của mã, nó sẽ bao quanh đến cuối cùng .trên dòng thứ ba, di chuyển về phía nam. Sau đó, nó kết thúc đến áp chót .trên dòng cuối cùng, di chuyển về phía bắc. Sau đó, nó đến /gương một lần nữa, nó phản chiếu về phía đông, chỉ cho người tiếp theo /phản ánh nó về phía bắc một lần nữa. Lần này, IP kết thúc ở áp chót .trên dòng thứ ba, và sau đó là dòng cuối cùng .trên dòng cuối cùng.

Các hướng dẫn được thực hiện theo thứ tự sau đây.

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

Mã máy x86-64, 7 byte

31 C0
01 C8
E2 FC
C3  

Các byte trên xác định một hàm chấp nhận một tham số duy nhất nvà trả về một giá trị chứa tổng của tất cả các số nguyên từ 1 đến n.

Nó được ghi vào quy ước gọi Microsoft x64 , vượt qua tham số trong thanh ECXghi. Giá trị trả về được để lại EAX, giống như tất cả các quy ước gọi x86 / x86-64.

Ma thuật lắp ráp bất khả xâm phạm:

       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

Hãy thử trực tuyến!
(Cuộc gọi hàm C có chú thích với một thuộc tính khiến GCC gọi nó bằng cách sử dụng quy ước gọi của Microsoft mà mã lắp ráp của tôi sử dụng. Nếu TIO đã cung cấp MSVC, điều này sẽ không cần thiết.)


Theo các tiêu chuẩn khác thường của môn đánh gôn, bạn thấy rằng phương pháp lặp lặp này thích hợp hơn các phương pháp sử dụng công thức toán học lành mạnh hơn ( n(n+1) / 2), mặc dù rõ ràng là nó kém hiệu quả hơn về tốc độ thời gian chạy.

Sử dụng lý thuyết số, việc thực hiện của trần nhà vẫn có thể bị đánh bại bởi một byte. Mỗi hướng dẫn này đều cần thiết, nhưng có một mã hóa ngắn hơn một chút để IMULsử dụng EAX ngầm định như một toán hạng đích (thực ra, nó sử dụng EDX:EAX, nhưng chúng ta chỉ có thể bỏ qua 32 bit trên của kết quả). Đây chỉ là 2 byte để mã hóa, giảm từ 3.

LEAcũng mất ba byte, nhưng thực sự không có cách nào khác vì chúng ta cần tăng trong khi vẫn giữ nguyên giá trị ban đầu. Nếu chúng ta đã MOVtạo một bản sao, thì INCchúng ta sẽ ở mức 4 byte. (Trong x86-32, INCchỉ có 1 byte, chúng tôi sẽ có cùng 3 byte là LEA.)

Sự thay đổi bên phải cuối cùng là cần thiết để chia kết quả thành một nửa, và chắc chắn nhỏ gọn hơn (và hiệu quả hơn) so với phép nhân. Tuy nhiên, mã thực sự nên được sử dụng shrthay vì sar, vì nó giả sử rằng giá trị đầu vào n, là một số nguyên không dấu . (Tất nhiên, giả định đó là hợp lệ theo các quy tắc, nhưng nếu bạn biết rằng đầu vào không được ký, thì bạn không nên thực hiện thay đổi số học đã ký, vì bit trên được đặt trong một giá trị không dấu lớn sẽ gây ra kết quả không chính xác.)

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

Bây giờ chỉ còn 8 byte (nhờ Peter Cordes). Tuy nhiên, 8> 7.


1
Trên thực tế, một toán hạng imul ecxhoặc mul ecxsẽ hoạt động và lưu một byte trong triển khai dạng đóng. Tôi đã không phát hiện ra điều đó ngay lập tức; Tôi đã nhận xét rằng nó là tối ưu cho cả hiệu năng và kích thước mã trước khi nhận ra rằng một eaxtoán hạng ngầm là tốt.
Peter Cordes

Tôi tự hỏi nếu add+ loopsẽ ngắn hơn imultrong khi nhìn vào câu trả lời khác. Tiện dụng rằng có một quy ước gọi tiêu chuẩn vượt qua cuộc tranh luận đầu tiênecx
Peter Cordes

1
Ồ, tôi không thể tin rằng tôi đã bỏ lỡ hình thức một toán hạng! Bây giờ tôi thực sự nên biết rằng đừng nói những điều như "không thể đánh bại". Khi nào tôi sẽ học?! Cảm ơn, @Peter.
Cody Grey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.