1 ile n arasındaki tüm tam sayıların toplamı


63

Dürüst olmak gerekirse, bunun henüz yapılmamasına şaşırdım. Varolan bir iş parçacığı bulabilirseniz, mutlaka bunu bir kopya olarak işaretleyin ya da bana bildirin.

Giriş

Girişiniz, 1'den büyük veya 1 olan herhangi bir pozitif tamsayı biçimindedir.

Çıktı

1 ve sayı girişleri arasındaki ve içindeki tüm tam sayıların toplamını yazmalısınız.

Örnek

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

OEIS A000217 - Üçgen sayılar: a (n) = binom (n + 1,2) = n (n + 1) / 2 = 0 + 1 + 2 + ... + n.

Liderler Sıralaması

Bu sorunun yanıtlarını gösteren bir tabloyu görüntülemek için aşağıdaki kod parçasını çalıştırın. (Bunu önermek için programcı5000 ve steenbergh'e ve bunu yarattığı için Martin Ender'e teşekkürler.)



@FryAmTheEggman Üzgünüm - orada bir beyin osuruk vardı. Ne demek istediğini anlıyorum.
GarethPW

2
@Aaron, Husk tarafından ninja'd oldu, ki bu sadece 1 byte'lık bir çözümle gönderildi
Skidsdev

7
Bir yığın pasajı öneriyorum.
programmer5000

Yanıtlar:



32

Kabuğu , 1 bayt

Σ

Çevrimiçi deneyin!

Yerleşik! ΣHusk'ta genellikle bir listedeki tüm öğelerin toplamını almak için kullanılır, ancak bir numaraya uygulandığında tam olarak döndürür n*(n+1)/2.


1
Meraktan dolayı, bu sayı bir aralığa dönüştürüldüğü ve ardından toplandığı için mi yoksa bu gerçekten kodlanmış mı?
FryAmTheEggman

4
@FryAmTheEggman bu aslında kodlanmış ve bir listenin tüm elemanlarının çarpımını veya tek bir sayının faktörünü hesaplayabilen başka bir yapının davranışına benzer
Leo,

4
Σmakinemde iki baytlık bir unicode karakterdir. Kod 1253 kodunu kullanıyorsunuzdur? msdn.microsoft.com/en-us/library/cc195055.aspx
gmatht

5
@gmatht Husk'un kod sayfası
Jonathan Allan,

21

Piet , 161 bayt / 16 kodlayıcı

Bu Piet tercümanı ile yorumlayabilir veya görüntüyü bu web sitesine yükleyebilir ve orada çalıştırabilirsiniz. Bayt sayısı hakkında emin değilim, boyutu küçültmek için farklı şekilde kodlayabilirsem.

Kaynak görüntünün ölçeklendirilmiş versiyonu:

rapapaing görüntü

açıklama

highlightedMetin kullanıcı giriş olduğunu varsayarak, (soldan sağa doğru artan) geçerli yığını gösterir 5:

1. geçiş Bir numara girin ve yığına itin

5

2. geçiş Bu sayıyı yığında çoğalt

5 5

3. geçiş 1'i (koyu kırmızı alanın boyutu) istifin üzerine itin

5 5 1

4. geçiş İlk iki sayıyı ekleyin

5 6

5. geçiş İlk iki sayıyı çarpın

30

6. geçiş Siyah alan, imlecin açık yeşil kola doğru sağa hareket etmesini sağlar. Bu geçiş 2'yi (koyu yeşilin ebadı) ​​istifin üzerine iter

30 2

7. geçiş Yığındaki ikinci sayıyı birinciye böl

15

8. geçiş Üst sayıyı aç ve çıkar (sayı olarak yorumlanır)

[empty]

son tuzak Beyaz bir alan ekleyerek, geçiş a olur nop, siyah imlecimizi yakalar. Bu programın yürütülmesini sonlandırır.

Orijinal dosya (burada çok küçük): Orijinal kaynak resim


Anlaşılır bir metinden (örn. C) anlaşılmaz metne (örneğin Jelly) imgelere geçtik ... Sırada ne var? : P
frarugi87

+1 Aslında daha önce bir açıklama içeren bir Piet cevabı görmedim
MilkyWay90

21

Brain-Flak , 16 bayt

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

Çevrimiçi deneyin!

Bu, beyin kırığının gerçekten iyi olduğu birkaç şeyden biri .

Bu, beyin kırığında yapabileceğiniz en basit şeylerden biri olduğundan ve çok fazla görünürlüğü olduğundan, işte ayrıntılı bir açıklama:

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

#(#+1)/2&

Mathematica, 10 bayt

(#^2+#)/2&

Mathematica, 11 bayt

Tr@Range@#&

Mathematica, 12 bayt

i~Sum~{i,#}&

Mathematica, 14 bayt

(@ user71546 tarafından)

1/2/Beta[#,2]&

Mathematica, 15 bayt

Tr[#&~Array~#]&

Mathematica, 16 bayt

Binomial[#+1,2]&

Mathematica, 17 bayt

(@Bir ağaç değil)

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

Mathematica, 18 bayt

PolygonalNumber@#&

Mathematica, 19 bayt

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

Mathematica, 20 bayt

(@Bir ağaç değil)

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

4
13, 14 ve 17'yi atlamak utanç verici görünüyor…
Bir ağaç değil

3
Bir sonraki zorluk gibi görünüyor .... ya da en azından listeyi tamamlamama yardım et.
J42161217

2
Hala 13 ya da 14 bayt için bir şeyim yok (sadece kısa cevaplarınızı çözmeden), ama işte daha büyük bayt sayıları olan 26 tane daha var .
Bir ağaç değil

1
@MarkS. 10.4 iyi çalışıyor
J42161217

1
@Notatree Listeniz için, burada 35 için bir aday: Array[Boole[#2>=#]& ,{#,#}]~Total~2&
Mark S.


11

x86_64 makine dili (Linux), 9 8 bayt

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

İçin çevrimiçi deneyin! aşağıdaki C programını derleyin ve çalıştırın.

#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 ve @Peter -1 için teşekkürler .


1
Muhtemelen kullanmalıdır shryerine sarimzasız olarak çıktı (kod boyutunda değişiklik yok) tedavi etmek. (@CodyGray tarafından tespit edildi ve 7 bayt add+ loopcevabını işaret etti ).
Peter Cordes

1
Bu, kapalı formülü formülün bir uygulamasında performans için en uygun görünmektedir, ancak 3B iki işlemlik formu yerine tek işlemli formunu mul %ediveya imul %edi(her 2B) bir bayt'ı kaydedebilirsiniz . EDX'i yüksek yarı sonucu ile kapatıyor, ancak sorun değil. Multi-operand imul, one-operand formundan daha sonra tanıtıldı ve 2 baytlık bir opcode'a sahip 0F. Üç seçenekten herhangi biri her zaman aynı sonucu verecektir eax, bu yalnızca imzalı ve imzasız olanların yarısıdır.
Peter Cordes




10

Octave , 22 19 bayt

Çünkü aritmetik işlemler sıkıcı ...

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

Çevrimiçi deneyin!

açıklama

Verilen n, bu, tüm girişleri e sayısına eşit olan bir n× nmatris oluşturur ; köşegen sıfırın altındaki girişleri yapar; ve sıfır olmayan değerlerin sayısını verir.


Bu aslında sayısal versiyondan daha mı kısa?
Esolanging Fruit

@ Challenger5 Hayır, Ama sayısal versiyon sıkıcı:@(n)sum(1:n)
Luis Mendo


8

Jöle , 2 bayt

RS

Çevrimiçi deneyin!

açıklama

RS

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

Gauss toplamı, 3 bayt

‘×H

açıklama

‘×H

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

Bu, Anyfix'de de çalışır: P (TIO'da değil)
HyperNeutrino

8

APL, 3 bayt

+/⍳

Çevrimiçi deneyin!

+/- toplam (azaltma +), - aralık.


Bu endekslemeye bağlıdır. İndeksleme 0 olarak ayarlanmışsa, ek 2 bayta ihtiyacınız olacaktır1+
Werner

2
@Werner indekslemesi varsayılandır, 1bu yüzden belirtmedim. burada yalnızca belirtilirken sıkça kullanılır ⎕IO←0(ve bayt sayısına dahil edilmez)
Uriel

8

Haskell , 13 bayt

Bu en kısa ( sanırım ):

f n=sum[1..n]

Çevrimiçi deneyin!

Doğrudan, 17 13 bayt

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

Baytlar için teşekkürler @WheatWizard -4!

Çevrimiçi deneyin!

Noktasız direkt, 15 bayt

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

Fikir için @ nimi teşekkürler!

Çevrimiçi deneyin!

Noktasız üzerinden sum, 16 bayt

sum.enumFromTo 1

Çevrimiçi deneyin!

Tekrarlayan, 22 18 bayt

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

Fikir için @maple_shaft & golf için @Likonik!

Çevrimiçi deneyin!

Standart fold, 19 bayt

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

Çevrimiçi deneyin!


7

Yıldızlı , 27 22 bayt

@Miles sayesinde 5 bayt kurtarıldı !

, + +  **       +   *.

Çevrimiçi deneyin!

açıklama

,             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 Teşekkürler! Çok iyi fikir!
Luis Mendo


7

Java (OpenJDK 8) , 10 bayt

a->a++*a/2

Çevrimiçi deneyin!

n->n*(n+1)/2Yavaş olduğum için golf oynamak biraz zaman aldı .

Ancak bu gerçek bir Java cevabı değil. Kesinlikle yeterince ayrıntılı değil.

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

Fena değil, ama daha iyisini yapabiliriz.

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

Java'yı seviyorum.


1
Daha ayrıntılı olmasını istiyorsanız, neden bir lambda kullanın? : P
TheLethalCoder

2
Ayrıntılı lambdaları hedef almıştım, özellikle belirgin olmak istersem tam bir program yazabilirdim: P
Xanderhall 19:17

1
Aynı çözüm zaten gönderildi
Kış

2
Kaçırmış olmalıyım, ama her durumda diğer cevapların içeriğine bakma eğiliminde değilim. Kendi golfümü yazmayı tercih ederim.
Xanderhall

7

Kontrol , 5 bayt

:)*$p

Kontrol bile bir golf dili değil, ancak CJam'ı yeniyor!

Çevrimiçi deneyin!

Açıklama:

Giriş numarası yığına yerleştirilir. :vermek için çoğaltır n, n. Daha sonra )verme ile artırılır n, n+1. *ikisini bir araya getirir ve $sonucu böler 2. psonucu yazdırır ve program sonlandırılır.



6

Taksi , 687 bayt

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.

Çevrimiçi deneyin!

Yorumsuz golf oyunu:

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

Döngü kullanmak, kullanmaktan daha% 22.6 daha az bayt x*(x+1)/2



5

Brainfuck, 24 Bayt.

G / Ç, bayt olarak işlenir.

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

Açıklaması

,[[->+>+<<]>[-<+>]<-]>>.
,                           # 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'ın bu zorlukla üst seviyedeki bazı dilleri geçebilmesi oldukça havalı.
GarethPW

Kodumu kullanarak Lenguage'da (sadece eğlence amaçlı) bir cevap eklemem yasal mı? @ATaco
V. Courtois

Aynı kod olacağını sanmıyorum, sadece farklı kodlanmış. @ V.Courtois
ATaco

@ATaco Ahh haklısın.
V. Courtois

5

,,,, 6 bayt

:1+×2÷

açıklama

:1+×2÷

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

Eğer yakında herhangi bir zamanda menzili uygularsam ...


4

Retina , 13 bayt

.+
$*
1
$`1
1

Çevrimiçi deneyin! Açıklama: İlk ve son aşamalar sadece unary ondalık dönüşümdür. Orta aşama her yerine 1sayısı ile 1sol artı başka s 1için 1ve böylece sayarak, kendisi 1için n, dolaylı değerleri toplar.




4

PHP, 19 bayt

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

builtins kullanarak, 29 bayt:

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

döngü, 31 bayt:

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

Ben de bir için sanırım:for(;$argn;$s+=$argn--);echo$s;
Progrock

4

Cubix , 12 10 bayt

*,)2I://O@

İlk versiyon

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

Çevrimiçi deneyin!

açıklama

Bir küpün üzerine genişletilen kod şöyle görünür:

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

Yönlendirme göstergesi (IP) Idoğuda hareket ederek başlar . /Kuzeye yansıtan aynanın karşısına gelene kadar doğuya doğru ilerlemeye devam eder . IP kodun en üstüne ulaştığında ., üçüncü satırda sonuna doğru kayıyor ve güneye doğru ilerliyor. Ardından ., kuzeye hareket ederek son satırdaki sondan başlayarak sararır . Sonra /tekrar doğuya yansıtan aynaya ulaşır , sadece bir sonraki /için tekrar kuzeye yansıtır. Bu kez IP ., üçüncü satırdaki sondan sonra sonuncu olan sonda sarar ..

Talimatlar aşağıdaki sırayla yerine getirilir.

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 Makine Kodu, 7 bayt

31 C0
01 C8
E2 FC
C3  

Yukarıdaki baytlar, tek bir parametreyi kabul eden bir fonksiyon tanımlar nve 1 ile 1 arasındaki tüm tamsayıların toplamını içeren bir değer döndürür n.

Bu, kayıt defterindeki parametreyi geçen Microsoft x64 arama kuralına yazılmıştır ECX. EAXTüm x86 / x86-64 arama kuralları gibi, dönüş değeri bırakılır .

Ungolfed montaj anımsatıcıları:

       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

Çevrimiçi deneyin!
(Oradaki C işlevi çağrısı, GCC'nin derleme kodumun kullandığı Microsoft çağrı kuralını kullanarak aramasına neden olan bir niteliğe açıklamalıdır. TIO MSVC sağlamışsa, bu gerekli olmaz.)


Alışılmadık kod golf standartlarına göre, bu yinelemeli döngü yaklaşımının, çalışma zamanı hızı bakımından açıkça daha az verimli olmasına rağmen , daha akıllıca bir matematiksel formül ( n(n+1) / 2) kullanan yaklaşımlara tercih edildiğini görüyorsunuz .

Sayı teorisini kullanarak ceilingcat'in uygulaması hala bir byte ile atılabilir. Bu talimatların her biri esastır, ancak bir hedef işlenen olarak dolaylı olarak IMULkullananlar için biraz daha kısa bir kodlama vardır (aslında kullanır , ancak sonucun üst 32 bitini görmezden gelebiliriz). Bu sadece 3'ten aşağıya kodlamak için 2 bayttır.EAX EDX:EAX

LEAhem üç bayt alır, ama biz artırmak gerekir çünkü hiçbir yolu orada gerçekten ederken orijinal değerini korumak. Biz yaptıysak MOVbir kopyasını yapmak için, daha sonra INC, biz 4 bayt olurdum. (X86-32'de, INCyalnızca 1 bayt olan, aynı 3 bayttaydık LEA.)

Son sağa kayma, sonucu ikiye bölmek için gereklidir ve kesinlikle çarpmadan çok daha kompakt (ve daha verimli). Ancak, kod gerekir gerçekten kullanıyor shryerine saro girdi değeri, varsayarak beri, nbir olan işaretsiz tamsayı. (Bu varsayım elbette kurallara göre geçerlidir, ancak girişin imzasız olduğunu biliyorsanız, o zaman işaretli bir aritmetik kaydırma yapmamalısınız, çünkü üst bit büyük bir işaretsiz değerde ayarlanmışsa sonuç ortaya çıkacaktır. hatalı olmak.)

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

Şimdi sadece 8 bayt (Peter Cordes sayesinde). Yine de 8> 7.


1
Aslında, tek işlenen imul ecxveya mul ecxkapalı formdaki uygulamada bir bayt çalışır ve saklanır. Bunu hemen fark etmedim; Örtülü bir eaxişlenenin iyi olduğunu fark etmeden önce hem performans hem de kod boyutu için optimal olduğunu söyleyecektim .
Peter Cordes

Diğer cevaba bakarken add+ loopdan daha kısa mı olacağını merak ettim imul. Handy standart bir görüşme kuralı var ve ilk tartışmayı geçenecx
Peter Cordes

1
Vay canına, tek operand formunu kaçırdığıma inanamıyorum! Şimdiye kadar "yenilemez" gibi şeyler söylememeyi gerçekten bilmeliyim. Ne zaman öğreneceğim? Teşekkürler, @Peter.
Cody Gray,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.