1에서 n까지의 모든 정수의 합


63

나는 이것이 아직 끝나지 않았다는 것에 정직하게 놀랐다. 기존 스레드를 찾을 수 있으면 반드시 이것을 중복으로 표시하거나 알려주십시오.

입력

입력은 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과 steenbergh에게 이것을 제안 해 주셔서 감사합니다. Martin Ender는 이것을 제안 해 주셔서 감사합니다.)



@FryAmTheEggman 죄송합니다-약간의 방귀가있었습니다. 무슨 말인지 알 겠어
GarethPW

2
@Aaron 당신은 Husk에 의해 ninja'd를 얻었습니다. 이것은 1 바이트 솔루션으로 게시되었습니다
Skidsdev

7
스택 스 니펫을 제안합니다.
programmer5000

답변:



32

껍질 , 1 바이트

Σ

온라인으로 사용해보십시오!

내장! ΣHusk에서는 일반적으로 목록의 모든 요소의 합계를 가져 오는 데 사용되지만 숫자에 적용하면 정확히 반환됩니다 n*(n+1)/2.


1
호기심에서, 숫자가 범위로 ​​캐스팅 된 다음 합산되기 때문에 발생합니까, 아니면 실제로 하드 코딩되어 있습니까?
FryAmTheEggman

4
@FryAmTheEggman 이것은 실제로 하드 코딩되어 있으며,리스트의 모든 요소 또는 단일 숫자의 계승을 계산할 수있는 다른 내장 Π의 동작과 유사합니다.
Leo

4
Σ내 컴퓨터의 2 바이트 유니 코드 문자입니다. 코드 페이지 1253을 사용한다고 생각하십니까? msdn.microsoft.com/ko-kr/library/cc195055.aspx
gmatht

5
@gmatht Husk의 코드 페이지
Jonathan Allan

21

Piet , 161 바이트 / 16 코덱

당신은 그것을 해석 할 수있는 피에트 인터프리터 나에 이미지를 업로드 웹 사이트가 실행합니다. 크기를 줄이기 위해 다르게 인코딩 할 수 있다면 바이트 수에 대해 확실하지 않습니다.

소스 이미지의 확장 버전 :

라 파잉 이미지

설명

highlighted텍스트는 사용자 입력이 가정 (왼쪽에서 오른쪽으로 증가하는) 현재의 스택을 도시한다 5:

1 차 전환 숫자를 입력하고 스택에 넣습니다

5

두 번째 전환 이 숫자를 스택에 복제

5 5

세 번째 전환 스택에 1 (진한 빨간색 영역의 크기)을 누릅니다.

5 5 1

네 번째 전환 상위 두 숫자 추가

5 6

5 번째 전환 상단 두 숫자를 곱하십시오

30

6 번째 전환 검은 색 영역은 커서가 연한 녹색 코덱으로 오른쪽으로 이동하는지 확인합니다. 이 전환은 스택에 2 (진한 녹색 크기)를 푸시합니다

30 2

일곱 번째 전환 스택의 두 번째 숫자를 첫 번째 숫자로 나눕니다.

15

8 번째 전환 상단 숫자를 팝하고 출력합니다 (숫자로 해석 됨)

[empty]

마지막 함정 흰색 영역을 삽입하면 전환이 nop이고 검은 색이 커서를 잡습니다. 프로그램 실행이 종료됩니다.

원본 파일 (여기에는 너무 작음) : 원본 소스 이미지


이해할 수없는 텍스트 (예 : C)에서 이해할 수없는 텍스트 (예 : 젤리)로 이미지로 전환했습니다. 다음은 무엇입니까? : P
frarugi87

+1 나는 전에 설명과 함께 Piet 답변을 실제로 보지 못했습니다
MilkyWay90

21

Brain-Flak , 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&

Mathematica, 10 바이트

(#^2+#)/2&

수학, 11 바이트

Tr@Range@#&

수학, 12 바이트

i~Sum~{i,#}&

수학, 14 바이트

(@ user71546 제작)

1/2/Beta[#,2]&

Mathematica, 15 바이트

Tr[#&~Array~#]&

수학, 16 바이트

Binomial[#+1,2]&

수학, 17 바이트

(@Not a tree)

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

매스 매 티카, 18 바이트

PolygonalNumber@#&

매스 매 티카, 19 바이트

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

Mathematica, 20 바이트

(@Not a tree)

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

4
13, 14, 17을 건너 뛰는 것은 수치스러운 것 같습니다…
나무가 아닙니다

3
다음 도전처럼 보입니다. ... 또는 적어도 목록을 작성하도록 도와주세요.
J42161217

2
나는 여전히 13 또는 14 바이트에 대한 아무것도 가지고 있지 않지만 (단순한 대답을 골라내는 것 외에도) 더 큰 바이트 수를 가진 또 다른 26 개가 있습니다.
나무가 아님

1
@점수. 10.4에서 잘 작동
J42161217

1
@Notatree 다음은 35 명 후보입니다. Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


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@ 피터 -1합니다.


1
당신은 아마 사용해야하는 shr대신 sar부호와 같은 출력 (코드 크기에 변화를) 치료. (@CodyGray가 발견했으며 그의 7 바이트 add+ loop답변 에서 지적했습니다 ).
Peter Cordes

1
이것은 닫힌 형식 수식을 구현할 때 최적의 성능을 발휘하지만 3B 2 연산자 형식 대신 1 연산자 형식 mul %edi또는 imul %edi(각 2B)를 사용하여 바이트를 절약 할 수 있습니다 . 절반의 결과로 EDX를 방해하지만 괜찮습니다. 다중 피연산자 imul는 1 피연산자 형식보다 늦게 소개되었으며 0F이스케이프 바이트 가있는 2 바이트 opcode를 갖습니다 . 세 가지 옵션 중 하나는 항상 같은 결과를 생성합니다 eax. 부호있는 것과 부호없는 것에 따라 달라지는 것은 절반 밖에되지 않습니다.
Peter Cordes




10

옥타브 , 22 19 바이트

산술 연산이 지루하기 때문에 ...

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

온라인으로 사용해보십시오!

설명

주어진 경우 n, 이것은 모든 항목이 숫자 e 와 동일한 n× n행렬을 생성합니다 . 대각선 아래에 항목을 0으로 만듭니다. 0이 아닌 값의 수를 출력합니다.


이것은 실제로 수치 버전보다 짧습니까?
Esolanging 과일

@ Challenger5 아니오, 그러나 수치 버전은 지루합니다.@(n)sum(1:n)
Luis Mendo



8

APL, 3 바이트

+/⍳

온라인으로 사용해보십시오!

+/-합 (감소 +), 범위


이는 인덱싱에 따라 다릅니다. 인덱싱이 0으로 설정되면 추가 2 바이트가 필요합니다1+
Werner

2
@Werner 인덱싱이 기본값 1이므로 지정하지 않았습니다. 여기서 사용할 때만 지정하는 일반적인 경우 ⎕IO←0(및 바이트 수에 포함되지 않음)
Uriel

8

하스켈 , 13 바이트

이것은 (내가 가장 짧은 생각 생각)

f n=sum[1..n]

온라인으로 사용해보십시오!

직접, 17 13 바이트

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

-4바이트에 @WheatWizard 감사 합니다!

온라인으로 사용해보십시오!

포인트 프리 다이렉트, 15 바이트

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

아이디어에 감사드립니다.

온라인으로 사용해보십시오!

sum16 바이트 를 통한 포인트 프리

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 바이트

@miles 덕분에 5 바이트가 절약 되었습니다 !

, + +  **       +   *.

온라인으로 사용해보십시오!

설명

,             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


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)

나는 자바를 좋아한다.


1
더 장황하게하려면 람다를 사용하는 이유는 무엇입니까? : P
TheLethalCoder

2
나는 장황한 람다를 목표로하고 있었는데, 특히 웅변을 원한다면 전체 프로그램을 작성할 수 있습니다. : P
Xanderhall

1
동일한 솔루션이 이미 게시되었습니다
Winter

2
나는 그것을 놓친 것이어야하지만, 어쨌든 다른 답변의 내용을 보지 않는 경향이 있습니다. 나는 내 자신의 골프를 쓰는 것을 선호합니다.
Xanderhall

7

5 바이트 확인

:)*$p

Check는 골프 언어는 아니지만 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

나는 그것이 다른 코드로 인코딩 된 동일한 코드이기 때문에 그렇게 생각하지 않습니다. @ V.Courtois
ATaco

@ATaco Ahh 당신이 맞아요.
V. Courtois


4

레티 나 , 13 바이트

.+
$*
1
$`1
1

온라인으로 사용해보십시오! 설명 : 첫 단계와 마지막 단계는 단항 ⇔ 소수 변환입니다. 중간 단계는 각각 대체 1의 수와 1그 좌측 플러스 다른 S 1위한 1따라서부터 계산 자체 1n내재적 값을 합산.




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  

위의 바이트는 단일 매개 변수를 허용하는 함수를 정의하고 n1에서 모든 정수의 합을 포함하는 값을 반환합니다 n.

레지스터 의 매개 변수를 전달하는 Microsoft x64 호출 규칙에 작성됩니다 ECX. EAX모든 x86 / x86-64 호출 규칙과 같이 반환 값은로 유지 됩니다.

ungolfed 어셈블리 니모닉 :

       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) 을 사용하는 접근법보다 선호 된다는 것을 알 수 있습니다 .

숫자 이론을 사용하면 ceilingcat의 구현을 여전히 1 바이트로 이길 수 있습니다. 이러한 각 명령어는 필수적이지만 대상 피연산자로 암시 적 으로 IMUL사용 하는 인코딩이 약간 짧습니다 (실제로는 사용 하지만 결과의 상위 32 비트는 무시할 수 있음). 이것은 3 바이트에서 2 바이트로 인코딩됩니다.EAX EDX:EAX

LEA3 바이트도 필요 하지만 원래 값 유지하면서 증분해야하기 때문에 실제로는 그 방법이 없습니다 . 우리가 MOV사본을 만들면 INC우리는 4 바이트에있을 것입니다. (x86-32에서 INC1 바이트 만 있는 곳 은 3 바이트와 같습니다 LEA.)

최종 오른쪽 시프트는 결과를 절반으로 나누는 데 필요하며 곱셈보다 더 작고 효율적입니다. 그러나 입력 값 이 부호없는 정수 라고 가정하기 때문에 코드 실제로 shr대신 사용해야 합니다. (이 가정은 물론 규칙에 따라 유효하지만 입력이 서명되지 않았다는 것을 알고 있다면 부호없는 산술 시프트를 수행해서는 안됩니다. 큰 부호없는 값으로 설정되는 상위 비트는 결과를 초래합니다. 잘못되었습니다.)sarn

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

이제 8 바이트 만 있습니다 (Peter Cordes 덕분에). 여전히 8> 7입니다.


1
실제로, 1-operand imul ecx또는 mul ecx닫힌 양식 구현에서 바이트를 저장하고 작동합니다. 나는 그것을 바로 발견하지 못했습니다. 암시 적 eax피연산자가 훌륭 하다는 것을 깨닫기 전에 성능과 코드 크기 모두에 최적이라고 언급하려고했습니다 .
Peter Cordes

다른 답변을 보면서 add+ loop가 더 짧은 지 궁금했습니다 imul. ecx
Peter Cordes

1
와우, 내가 한 연산자 형식을 놓쳤다는 것을 믿을 수 없습니다! 나는 "이길 수 없다"는 말을하지 않기 위해 정말로 알아야한다. 언제 배울 수 있습니까?! 감사합니다, @Peter.
코디 그레이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.