1からnまでのすべての整数の合計


63

私は、これがまだ行われていないことに正直驚いています。既存のスレッドを見つけることができる場合は、必ずこれを重複としてマークするか、私に知らせてください。

入力

入力は、1以上の正の整数の形式です。

出力

1と数値入力の間のすべての整数の合計を出力する必要があります。

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

OEIS A000217 —三角形の数:a(n)= binomial(n + 1,2)= n(n + 1)/ 2 = 0 + 1 + 2 + ... + n。

リーダーボード

以下のコードスニペットを実行して、この質問の回答のリーダーボードを表示します。(これを提案してくれたProgrammer5000とsteenbergh、および作成してくれたMartin Enderに感謝します。)



@FryAmTheEggmanごめんなさい-ちょっと頭がおならだった。意味がわかります。
GarethPW

2
@Aaronは、1バイトのソリューションで投稿されたばかりのHuskに忍者を手に入れました
Skidsdev

7
スタックスニペットをお勧めします。
Programmer5000

回答:



32

、1バイト

Σ

オンラインでお試しください!

ビルトイン!ΣHuskでは通常、リストのすべての要素の合計を取得するために使用されますが、数値に適用されると正確にを返しますn*(n+1)/2


1
好奇心から、これは数値が範囲にキャストされてから合計されるために発生しますか、これは実際にハードコードされていますか?
FryAmTheEggman

4
@FryAmTheEggmanこれは実際にハードコードされ、リストのすべての要素の積又は単一の数値の階乗を計算することができる別の組み込み、Πの挙動と類似している
レオ

4
Σ私のマシンでは2バイトのUnicode文字です。コードページ1253を使用すると思いますか?msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht


21

Piet、161バイト/ 16コーデル

あなたがそれを解釈することができ、このピエト・インタープリタまたは上の画像をアップロードし、このウェブサイトおよびそこにそれを実行します。サイズを減らすために別の方法でエンコードできる場合、バイトカウントについてはわかりません。

ソースイメージのスケールアップバージョン:

rapapaing-image

説明

highlightedテキストは、ユーザ入力があると仮定すると、(左から右へ成長する)現在のスタックを示します5

最初の移行 数字を入力して、スタックにプッシュします

5

2番目の移行 スタック上でこの番号を複製します

5 5

3番目の移行 1(暗赤色の領域のサイズ)をスタックにプッシュします

5 5 1

4番目の移行 上位2つの数字を追加します

5 6

5番目の移行 上位2つの数値を乗算します

30

6番目の移行 黒い領域は、カーソルが明るい緑色のコーデルまで右に移動することを確認します。その遷移は2(濃い緑のサイズ)をスタックにプッシュします

30 2

7番目の移行 スタックの2番目の数値を最初の数値で除算します

15

8番目の移行 一番上の数字をポップして出力します(数字として解釈されます)

[empty]

最後のtrap 白い領域を挿入すると、トランジションはnopになり、黒はカーソルをトラップします。これにより、プログラムの実行が終了します。

元のファイル(ここでは小さすぎます): 元のソース画像


わかりやすいテキスト(例:C)から、わかりにくいテキスト(例:Jelly)に画像に移行しました...次は何ですか?:P
frarugi87

+1これまでに説明付きのPietの回答を実際に見たことがありません
MilkyWay90

21

Brain-Flak、16バイト

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

オンラインでお試しください!

これはbrain-flakが本当に得意とする数少ないものの1つです。

これは、brain-flakでできる最も単純なものの1つであり、多くの可視性があるため、詳細な説明を次に示します。

# 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バイト

#(#+1)/2&

Mathematica、10バイト

(#^2+#)/2&

Mathematica、11バイト

Tr@Range@#&

Mathematica、12バイト

i~Sum~{i,#}&

Mathematica、14バイト

(by @ user71546)

1/2/Beta[#,2]&

Mathematica、15バイト

Tr[#&~Array~#]&

Mathematica、16バイト

Binomial[#+1,2]&

Mathematica、17バイト

(@ツリーではない)

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

Mathematica、18バイト

PolygonalNumber@#&

Mathematica、19バイト

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

Mathematica、20バイト

(@ツリーではない)

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

4
13、14、17をスキップするのは恥ずかしいようです…
ツリーではありません

3
次の挑戦のように思えます。
J42161217

2
私はまだ13または14バイトのために何も持っていません(あなたの短い答えをゴルフから外すことを除いて)が、ここに大きなバイトカウントを持つ別の26があります
ツリーではない

1
@MarkS。10.4で
正常に

1
あなたのリストについては@Notatree、ここでは35の候補である:Array[Boole[#2>=#],{#,#}]~Total~2
マーク・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) );
  }
}

-1の@CodyGray@Peterに感謝します。


1
出力を符号なし(コードサイズの変更なし)として扱うshrにはsar、おそらくの代わりにを使用する必要があります。(@CodyGrayが発見し、彼の7バイトadd+ loop回答で指摘しまし)。
ピーターコーデス

1
これは、閉形式の式の実装におけるパフォーマンスにとって最適に見えますが、3Bの2オペランド形式の代わりに、1オペランド形式のmul %ediorまたはimul %edi(各2B)を使用して、バイトを節約できます。半分の結果でEDXを覆しますが、それで問題ありません。マルチオペランドimulは、1オペランド形式よりも後に導入され、0Fエスケープバイト付きの2バイトのオペコードがあります。3つのオプションのいずれも常にで同じ結果を生成しますがeax、符号付きと符号なしに依存するのは上位半分のみです。
ピーターコーデス




10

オクターブ22 19バイト

算術演算は退屈だから...

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

オンラインでお試しください!

説明

与えられた場合n、これはすべてのエントリが番号eに等しいn× n行列を作成します。対角線のゼロより下にエントリを作成します。そして、非ゼロ値の数を出力します。


これは実際に数値版よりも短いですか?
エソランジングフルーツ

@ 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

-4バイトをありがとう@WheatWizard !

オンラインでお試しください!

ポイントフリーダイレクト、15バイト

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

@nimiのアイデアに感謝します!

オンラインでお試しください!

ポイントフリー経由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バイト

@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


@milesありがとう!非常に良いアイデア!
ルイスメンドー


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
私はそれを見逃したに違いありませんが、いずれにしても、私は他の答えの内容を見ない傾向があります。私は自分のゴルフを書くことを好みます。
ザンダーホール

7

チェック、5バイト

:)*$p

Checkはゴルフの言語でさえありませんが、CJamに勝っています!

オンラインでお試しください!

説明:

入力番号はスタックに配置されます。:それを複製して与えるn, n。これは、その後にインクリメントされ)与えますn, n+1*2つを乗算し$、結果を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.クルトワ

私はそうは思わない、それは同じコードで、単に異なるエンコードであるからだ。@ V.Courtois
ATaco

@ATacoああ、あなたは正しい。
V.クルトワ


4

網膜、13バイト

.+
$*
1
$`1
1

オンラインでお試しください!説明:最初と最後のステージは、単項⇔10進変換です。中段は各の置き換え1の数と1、その左側のプラス別の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

Cubix12 10バイト

*,)2I://O@

初期バージョン

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

オンラインでお試しください!

説明

キューブに展開すると、コードは次のようになります。

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

命令ポインタ(IP)はから始まり、I東に移動します。/北に反射する鏡に出会うまで、東に移動し続けます。IPがコードの最上部に達すると、.南に向かって3行目の最後までラップアラウンドします。次に.、最後の行の最後から2番目に折り返され、北に移動します。その後、/再びミラーに到達し、ミラーが東に反射し、次にミラーが再び/北に反射します。今回は、IP .は3行目で最後から2番目に折り返し.、最後の行で最後に折り返します。

命令は次の順序で実行されます。

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呼び出し規約に書き込まれますECXEAXすべての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関数呼び出しには、アセンブリコードが使用するMicrosoft呼び出し規約を使用してGCCが呼び出す属性が注釈されています。TIOがMSVCを提供した場合、これは必要ありません。)


コードゴルフの異常な基準により、この反復ループアプローチは、実行速度に関して明らかに効率が大幅に劣っていますが、より健全な数式n(n+1) / 2を使用するアプローチよりも望ましいことがわかります。

数論を使用すると、ceilingcatの実装は1バイトも上回る可能性があります。これらの各命令は必須ですが、デスティネーションオペランドとして暗黙的にIMUL使用する少し短いエンコードがあります(実際にはを使用しますが、結果の上位32ビットは無視できます)。エンコードするのは3バイトから2バイトのみです。EAX EDX:EAX

LEA3バイトもかかりますが、元の値保持しながらインクリメントする必要があるため、実際には回避方法がありません。MOVコピーを作成するためにa を実行した場合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オペランドimul ecxまたはmul ecx閉じた形の実装でバイトを仕事と節約になります。私はすぐにそれを見つけませんでした。暗黙のeaxオペランドが適切であることに気付く前に、パフォーマンスとコードサイズの両方に最適であるとコメントしようとしていました。
ピーターコーデス

add+ loopimul他の答えを見ているときよりも短いのではないかと思いました。最初の引数を渡す標準の呼び出し規約があると便利ですecx
Peter Cordes

1
うわー、私は1オペランド形式を見逃したとは信じられません!「打てない」などのことを言わないことを今では本当に知っているべきです。いつ学習しますか?!ありがとう、@ピーター。
コーディグレー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.