Jumlah semua bilangan bulat dari 1 hingga n


63

Sejujurnya saya terkejut bahwa ini belum dilakukan. Jika Anda dapat menemukan utas yang ada, silakan tandai ini sebagai duplikat atau beri tahu saya.

Memasukkan

Input Anda adalah dalam bentuk bilangan bulat positif yang lebih besar dari atau sama dengan 1.

Keluaran

Anda harus menampilkan jumlah semua bilangan bulat antara dan termasuk 1 dan input angka.

Contoh

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

OEIS A000217 - Bilangan segitiga: a (n) = binomial (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Papan peringkat

Jalankan cuplikan kode di bawah ini untuk melihat papan peringkat untuk jawaban pertanyaan ini. (Terima kasih kepada programmer5000 dan steenbergh untuk menyarankan ini, dan Martin Ender untuk membuatnya.)



@FryAmTheEggman Maaf - ada sedikit kentut di sana. Saya mengerti apa yang kamu maksud.
GarethPW

2
@ Harun Anda mendapat ninja'd oleh Husk, yang baru saja diposting dengan solusi 1 byte
Skidsdev

7
Saya sarankan cuplikan stack.
programmer5000

Jawaban:



32

Sekam , 1 byte

Σ

Cobalah online!

Dibangun! Σdalam Sekam biasanya digunakan untuk mendapatkan jumlah semua elemen dari daftar, tetapi ketika diterapkan ke nomor itu mengembalikan persis n*(n+1)/2.


1
Karena penasaran, apakah ini terjadi karena nomor tersebut dilemparkan ke kisaran dan kemudian dijumlahkan, atau apakah ini benar-benar hardcode?
FryAmTheEggman

4
@FryAmTheEggman ini sebenarnya hardcoded, dan mirip dengan perilaku builtin lain, Π, yang dapat menghitung produk dari semua elemen daftar atau faktorial dari satu nomor
Leo

4
Σadalah karakter unicode dua byte pada mesin saya. Saya kira Anda menggunakan kode halaman 1253? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht


21

Piet , 161 byte / 16 kode

Anda dapat menafsirkannya dengan penerjemah Piet ini atau mengunggah gambar di situs web ini dan menjalankannya di sana. Tidak yakin tentang jumlah byte, jika saya bisa menyandikannya secara berbeda untuk mengurangi ukuran.

Versi sumber gambar yang ditingkatkan:

rapapaing-image

Penjelasan

The highlightedteks menunjukkan tumpukan saat ini (tumbuh dari kiri ke kanan), dengan asumsi input pengguna adalah 5:

Transisi 1 Masukkan nomor dan dorong ke tumpukan

5

Transisi ke-2 Gandakan nomor ini di tumpukan

5 5

Transisi ke-3 Tekan 1 (ukuran area merah gelap) ke tumpukan

5 5 1

Transisi ke-4 Tambahkan dua angka teratas

5 6

Transisi ke-5 Lipat gandakan dua angka teratas

30

Transisi ke-6 Area hitam memastikan, bahwa kursor bergerak ke kanan ke kode hijau muda. Transisi itu mendorong 2 (ukuran hijau gelap) ke tumpukan

30 2

Transisi ke-7 Bagilah angka kedua pada tumpukan dengan yang pertama

15

Transisi ke-8 Pop dan output nomor atas (diartikan sebagai angka)

[empty]

perangkap terakhir Dengan memasukkan area putih, transisinya adalah nop, hitam menjebak kursor kita. Ini mengakhiri eksekusi program.

File asli (terlalu kecil untuk di sini): Gambar sumber asli


Kami beralih dari teks yang dapat dipahami (mis. C) ke teks yang tidak dapat dipahami (mis. Jelly) menjadi gambar ... Selanjutnya apa? : P
frarugi87

+1 Saya belum benar-benar melihat jawaban Piet dengan penjelasan sebelumnya
MilkyWay90

21

Brain-Flak , 16 byte

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

Cobalah online!

Ini adalah salah satu dari beberapa hal yang benar - benar bagus di otak .

Karena ini adalah salah satu hal paling sederhana yang dapat Anda lakukan di brain-flak dan memiliki banyak visibilitas, inilah penjelasan terperinci :

# 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 byte

#(#+1)/2&

Mathematica, 10 byte

(#^2+#)/2&

Mathematica, 11 byte

Tr@Range@#&

Mathematica, 12 byte

i~Sum~{i,#}&

Mathematica, 14 byte

(oleh @ user71546)

1/2/Beta[#,2]&

Mathematica, 15 byte

Tr[#&~Array~#]&

Mathematica, 16 byte

Binomial[#+1,2]&

Mathematica, 17 byte

(oleh @Tidak pohon)

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

Mathematica, 18 byte

PolygonalNumber@#&

Mathematica, 19 byte

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

Mathematica, 20 byte

(oleh @Tidak pohon)

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

4
Tampaknya memalukan untuk melewatkan 13, 14 dan 17 ...
Bukan pohon

3
Sepertinya tantangan berikutnya .... atau setidaknya membantu saya untuk melengkapi daftar.
J42161217

2
Saya masih belum memiliki apa pun untuk 13 atau 14 byte (selain dari hanya un-golfing jawaban Anda yang lebih pendek), tetapi di sini ada 26 byte dengan jumlah byte yang lebih besar .
Bukan pohon

1
@Tanda. pada 10,4 bekerja dengan baik
J42161217

1
@Natatree Untuk daftar Anda, berikut adalah kandidat untuk 35: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


11

bahasa mesin 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 

Untuk Mencoba secara online! kompilasi dan jalankan program C berikut.

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

Berkat @CodyGray dan @ Peter untuk -1.


1
Anda mungkin harus menggunakan shrsebagai gantinya sar, untuk memperlakukan output Anda sebagai tidak ditandatangani (tidak ada perubahan dalam ukuran kode). (Terlihat oleh @CodyGray dan ditunjukkan dalam 7 byte add+ loopjawabannya ).
Peter Cordes

1
Ini terlihat optimal untuk kinerja dalam implementasi rumus bentuk-tertutup, tetapi Anda dapat menyimpan byte dengan menggunakan bentuk satu-operan mul %ediatau imul %edi(masing-masing 2B) alih-alih bentuk 2-operan 3B. Ini clobbers EDX dengan hasil setengah tinggi, tapi itu bagus. Multi-operan imuldiperkenalkan lebih lambat dari bentuk satu-operan, dan memiliki 2-byte opcode dengan 0Fbyte melarikan diri. Salah satu dari tiga opsi akan selalu menghasilkan hasil yang sama eax, hanya setengah tinggi yang bergantung pada yang ditandatangani vs yang tidak ditandatangani.
Peter Cordes




10

Oktaf , 22 19 byte

Karena operasi aritmatika membosankan ...

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

Cobalah online!

Penjelasan

Diberikan n, ini menciptakan n× nmatriks dengan semua entri sama dengan angka e ; membuat entri di bawah nol diagonal; dan menampilkan jumlah nilai bukan nol.


Apakah ini sebenarnya lebih pendek dari versi numerik?
Buah Esolanging

@ Challenger5 Tidak, Tapi versi numeriknya membosankan:@(n)sum(1:n)
Luis Mendo


8

Jelly , 2 byte

RS

Cobalah online!

Penjelasan

RS

    implicit input
 S  sum of the...
R   inclusive range [1..input]
    implicit output

Jumlah Gauss, 3 byte

‘×H

Penjelasan

‘×H

     implicit input
  H  half of the quantity of...
‘    input + 1...
 ×   times input
     implicit output

Ini juga berfungsi di Anyfix: P (bukan di TIO)
HyperNeutrino

8

APL, 3 byte

+/⍳

Cobalah online!

+/- jumlah (kurangi +), - kisaran.


Ini tergantung pada pengindeksan. Jika pengindeksan diatur ke 0, maka Anda akan membutuhkan 2 byte tambahan1+
Werner

2
@Werner indexing adalah default 1jadi saya tidak menentukan. umum di sini untuk menentukan hanya ketika menggunakan ⎕IO←0(dan itu tidak termasuk dalam hitungan byte)
Uriel

8

Haskell , 13 byte

Ini adalah terpendek (saya pikir pikiran):

f n=sum[1..n]

Cobalah online!

Langsung, 17 13 byte

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

Terima kasih @WheatWizard untuk -4byte!

Cobalah online!

Pointfree direct, 15 byte

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

Terima kasih @nimi untuk idenya!

Cobalah online!

Pointfree via sum, 16 byte

sum.enumFromTo 1

Cobalah online!

Secara rekursif, 22 18 byte

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

Terima kasih @maple_shaft untuk ide & @Laikoni untuk bermain golf!

Cobalah online!

Standar fold, 19 byte

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

Cobalah online!


7

Starry , 27 22 byte

5 byte disimpan berkat @miles !

, + +  **       +   *.

Cobalah online!

Penjelasan

,             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, terima kasih! Ide yang sangat bagus!
Luis Mendo


7

Java (OpenJDK 8) , 10 byte

a->a++*a/2

Cobalah online!

Butuh waktu sejenak untuk turun dari golf n->n*(n+1)/2karena saya lambat.

Tapi ini bukan jawaban Java nyata. Jelas tidak cukup bertele-tele.

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

Tidak buruk, tetapi kita bisa berbuat lebih baik.

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

Saya suka Jawa.


1
Jika Anda ingin itu menjadi lebih jelas mengapa menggunakan lambda !? : P
TheLethalCoder

2
Saya mengincar verbaose lambdas, saya bisa menulis program lengkap jika saya ingin menjadi fasih berbicara: P
Xanderhall

1
Solusi yang persis sama sudah diposting
Musim Dingin

2
Saya pasti melewatkannya, tetapi bagaimanapun juga, saya cenderung tidak melihat isi dari jawaban lain. Saya lebih suka menulis golf sendiri.
Xanderhall

7

Periksa , 5 byte

:)*$p

Periksa bahkan bukan bahasa golf, namun mengalahkan CJam!

Cobalah online!

Penjelasan:

Nomor input ditempatkan pada tumpukan. :duplikat untuk memberi n, n. Kemudian ditambahkan dengan ), memberi n, n+1. *mengalikan keduanya bersama-sama, dan kemudian $membagi hasilnya dengan 2. pmencetak hasil dan program berakhir.


6

MATL , 2 byte

:s

Cobalah online!

Tidak senang tersenyum.


2
Sialan, akhirnya sebuah tantangan yang bisa saya jawab dengan mudah di MATL, tetapi Anda mengalahkan saya untuk itu :(
Lui

6

Taksi , 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.

Cobalah online!

Berhenti bermain golf dengan komentar:

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

Ini 22,6% lebih sedikit byte untuk loop daripada menggunakan x*(x+1)/2



5

Brainfuck, 24 Bytes.

I / O ditangani sebagai byte.

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

Dijelaskan

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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
Cukup keren bahwa Brainfuck mampu mengalahkan beberapa bahasa tingkat tinggi dalam tantangan ini.
GarethPW

Apakah itu sah bagi saya untuk menambahkan jawaban dalam Bahasa (hanya untuk bersenang-senang) menggunakan kode Anda? @ATaco
V. Courtois

Saya tidak berpikir begitu, karena itu akan menjadi kode yang sama, hanya disandikan berbeda. @ V.Courtois
ATaco

@ATaco Ahh kamu benar.
V. Courtois

5

,,,, 6 byte

:1+×2÷

Penjelasan

:1+×2÷

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

Jika saya menerapkan rentang dalam waktu dekat ...


4

Retina , 13 byte

.+
$*
1
$`1
1

Cobalah online! Penjelasan: Tahap pertama dan terakhir hanyalah konversi desimal ⇔ unary. Tahap tengah menggantikan masing 1- masing dengan jumlah 1s ke kiri ditambah yang lain 1untuk 1itu sendiri, sehingga menghitung dari 1ke n, menjumlahkan nilai-nilai secara implisit.




4

PHP, 19 byte

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

menggunakan builtin, 29 byte:

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

loop, 31 byte:

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

Saya kira juga untuk:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Cubix , 12 10 byte

*,)2I://O@

Versi awal

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

Cobalah online!

Penjelasan

Diperluas ke sebuah kubus, kode ini terlihat seperti ini:

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

Instruksi penunjuk (IP) dimulai pada I, bergerak ke timur. Terus bergerak ke timur sampai melintasi /cermin, yang memantulkannya ke utara. Ketika IP mencapai bagian atas kode, ia membungkus ke yang terakhir .pada baris ketiga, bergerak ke selatan. Kemudian ia membungkus ke kedua .dari belakang pada baris terakhir, bergerak ke utara. Kemudian ia mencapai /cermin lagi, yang memantulkannya ke timur, hanya untuk selanjutnya /memantulkannya ke utara lagi. Kali ini, IP membungkus ke kedua .dari belakang pada baris ketiga, dan kemudian yang terakhir .pada baris terakhir.

Instruksi dieksekusi dalam urutan berikut.

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 Kode Mesin, 7 byte

31 C0
01 C8
E2 FC
C3  

Byte di atas menentukan fungsi yang menerima parameter tunggal n,, dan mengembalikan nilai yang berisi jumlah semua bilangan bulat dari 1 hingga n.

Itu ditulis ke konvensi pemanggilan Microsoft x64 , yang melewati parameter dalam ECXregister. Nilai kembali ditinggalkan EAX, seperti semua konvensi pemanggilan x86 / x86-64.

Mnemonik perakitan tidak dikumpulkan:

       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

Cobalah online!
(Fungsi C panggilan ada dijelaskan dengan atribut yang menyebabkan GCC menyebutnya dengan menggunakan konvensi panggilan Microsoft yang menggunakan kode perakitan saya. Jika TIO telah menyediakan MSVC, ini tidak akan diperlukan.)


Dengan standar kode golf yang tidak biasa, Anda melihat bahwa pendekatan perulangan berulang ini lebih disukai daripada pendekatan yang menggunakan rumus matematika yang lebih waras ( n(n+1) / 2), meskipun itu jelas jauh lebih efisien dalam hal kecepatan run-time.

Menggunakan teori angka, implementasi ceilingcat masih dapat dikalahkan satu byte. Masing-masing instruksi ini penting, tetapi ada pengkodean yang sedikit lebih pendek untuk IMULyang menggunakan EAX secara implisit sebagai operan tujuan (sebenarnya, ia menggunakan EDX:EAX, tetapi kita bisa mengabaikan 32 bit atas hasilnya). Ini hanya 2 byte untuk dikodekan, turun dari 3.

LEAmembutuhkan tiga byte juga, tetapi benar-benar tidak ada jalan lain karena kita perlu meningkatkan sekaligus mempertahankan nilai asli. Jika kami melakukan MOVuntuk membuat salinan, maka INC, kami akan berada di 4 byte. (Dalam x86-32, di mana INChanya 1 byte, kita akan berada pada 3 byte yang sama dengan LEA.)

Pergeseran kanan terakhir diperlukan untuk membagi hasil menjadi dua, dan tentu saja lebih kompak (dan lebih efisien) daripada perkalian. Namun, kode tersebut harus benar-benar digunakan shralih-alih sar, karena mengasumsikan bahwa nilai input n,, adalah bilangan bulat yang tidak ditandatangani . (Asumsi itu valid sesuai dengan aturan, tentu saja, tetapi jika Anda tahu bahwa input tidak ditandatangani, maka Anda tidak boleh melakukan pergeseran aritmatika yang ditandatangani, karena bit atas yang diatur dalam nilai unsigned besar akan menyebabkan hasilnya salah.)

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

Sekarang hanya 8 byte (terima kasih kepada Peter Cordes). Masih, 8> 7.


1
Sebenarnya, satu-operan imul ecxatau mul ecxakan bekerja dan menyimpan byte dalam implementasi bentuk-tertutup. Saya tidak langsung melihatnya; Saya akan berkomentar bahwa itu optimal untuk kinerja dan ukuran kode sebelum menyadari bahwa eaxoperan implisit baik-baik saja.
Peter Cordes

Saya bertanya-tanya apakah add+ loopakan lebih pendek daripada imulsambil melihat jawaban yang lain. Berguna bahwa ada konvensi panggilan standar yang melewati argumen pertama diecx
Peter Cordes

1
Wow, aku tidak percaya aku melewatkan formulir satu operan! Saya harus benar-benar tahu sekarang untuk tidak mengatakan hal-hal seperti "tidak dapat dikalahkan". Kapan saya akan belajar? Terima kasih, @Peter.
Cody Grey
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.