Nci çapraz alternatif toplamı bulun


17

Tek bir pozitif tamsayının bir girdisi verildiğinde, o tam sayıya karşılık gelen "çapraz-alternatif toplam" ın çıktısını alın.

Giriş örneğini ele alalım n=5. Çapraz alternatif toplamı bulmak için, önce nsoldan sağa ve yukarıdan aşağıya doğru okuma, 1her konumdan bir tane başlayan ve artan bir genişlik ve yükseklik kare ızgarası oluşturun :

 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Daha sonra, "çapraz" (yani her iki köşegen birleştirildiğinde) oluşturan ızgaradan toplamları alın:

 1           5
    7     9
      13
   17    19
21          25

1 5 7 9 13 17 19 21 25

Son olarak, bu dizinin alternatif toplamını alın:

1+5-7+9-13+17-19+21-25

-11

Başka bir örnek, n=6(sadece çarpının çift sayılı için neye benzediğini göstermek için n):

 1  2  3  4  5  6
 7  8  9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36

 1              6
    8       11
      15 16
      21 22
   26       29
31             36

1+6-8+11-15+16-21+22-26+29-31+36

20

Bu , bayt cinsinden en kısa kod kazanacaktır.

İşte için doğru çıkışlar vardır n=1için n=100test durumları olarak kullanabilecekleri,:

1
4
-3
10
-11
20
-23
34
-39
52
-59
74
-83
100
-111
130
-143
164
-179
202
-219
244
-263
290
-311
340
-363
394
-419
452
-479
514
-543
580
-611
650
-683
724
-759
802
-839
884
-923
970
-1011
1060
-1103
1154
-1199
1252
-1299
1354
-1403
1460
-1511
1570
-1623
1684
-1739
1802
-1859
1924
-1983
2050
-2111
2180
-2243
2314
-2379
2452
-2519
2594
-2663
2740
-2811
2890
-2963
3044
-3119
3202
-3279
3364
-3443
3530
-3611
3700
-3783
3874
-3959
4052
-4139
4234
-4323
4420
-4511
4610
-4703
4804
-4899
5002

8
Nit pick: Bu alternatif bir meblağ değil. İlk iki terimi ekliyorsunuz.
Dennis

Yanıtlar:


26

Jöle, 21 19 11 10 7 bayt

²~³¡H+2

Çevrimiçi deneyin!

Fikir

Bir saniye için, nihai toplamın ilk döneminin eklenmek yerine çıkarıldığını varsayın.

Let n pozitif bir tamsayı.

Hatta dava

 1              6
    8       11
      15 16
      21 22
   26       29
31             36

Satırların alt yarısındaki diyagonal elemanlar arasındaki farklar, ilk n ÷ 2 tek doğal sayıdır. Yana 1 + 3 + 5 + ... + (1 + 2k) = k 2 , bu toplamı (n ÷ 2) 2 = n 2 ÷ 4 .

Bu örnekte

- 1 + 6 - 8 + 11 - 15 + 16 - 21 + 22 - 26 + 29 - 31 + 36  =
-(1 - 6)-(8 - 11)-(15 - 16)-(21 - 22)-(26 - 29)-(31 - 36) =
(    5   +   3    +    1  )+(   1    +    3    +    5   ) =
             9             +              9               = 18

Böylece, toplam 2 x n 2 ÷ 4 = n 2 ÷ 2'dir .

Garip dava

 1           5
    7     9
      13
   17    19
21          25

Karşılık gelen satırlardaki çapraz elemanlar arasındaki farklar yukarıdan ve aşağıdan ( 1ve 5, ve 21ve 25; 7ve 9ve 17ve 19) aynıdır, bu nedenle alternatif toplamda iptal edilirler.

Bu örnekte

- 1 + 5 - 7 + 9 - 13 + 17 - 19 + 21 - 25  =
-(1 - 5)-(7 - 9)- 13 +(17 - 19)+(21 - 25) =
    4   +   2   - 13 -    2    -    4     = -13

Geriye kalan tek şey, ilk ve son sayının aritmetik ortalaması olan merkezi elemanın negatifidir, bu nedenle - (n 2 + 1) ÷ 2 olarak hesaplanabilir .

Genel dava

Yana ~ X = - (x + 1) ikinin tümleyici tamsayılar için ( ~ O anlamına gelir değil bitsel), tek durum için, formül olarak yeniden olabilir ~ n, 2 ÷ 2 .

Ayrıca, orijinal toplamın ilk terimi ( 1 ), çıkarılmak yerine eklendiğinden, yukarıdaki formüller , düzeltilmesi gereken 2 hatası bırakır .

Bu nedenle, N inci çapraz alternatif toplamı olduğu , n 2 ÷ 2 + 2 , eğer , n , hatta ve ~ n, 2 ÷ 2 + 2 garip ise.

Son olarak, bitsel NOT bir girişimdir, yani tüm x için ~~ x = x . Bu şekilde ~~~ X = ~ x , ~~~~ x = x ve, genel olarak, ~ n x (yani ~ uygulanır n misli) X ise , n çift ve ~ x garip ise.

Böylece, genel formülümüzü tüm pozitif tamsayılar n için ~ n n 2 ÷ 2 + 2 olarak yeniden yazabiliriz .

kod

²~³¡H+2    Main link. Input: n

²          Yield n².
 ~         Apply bitwise NOT to n²...
  ³¡           n times.
    H      Halve the result.
     +2    Add 2.

1
Bir çeşit basit formül olduğunu biliyordum, ancak açıklamanız ve yürütmeniz şaşırtıcı. +1
ETHproductions

5

JavaScript, 40 38 22 bayt

Bu yeni ve süslü kapalı form çözümünü kullanmak öfke!

n=>(n%2?3-n*n:4+n*n)/2

ThomasKwa sayesinde, pahalı özyinelemeli işlevimi ortadan kaldırabilirim.


Eğer n% 2 ise sadece bir kez DEĞİL bitirmeniz gerekir. Aslında, JS'de sadece yapmak daha kısa olabilir düşünüyorum(n%2?3-n*n:4+n*n)/2
lirtosiast



3

Minkolang 0.15 , 26 15 13 bayt

Dennis'in çılgın algoritmasını kullanarak ve onun sayesinde iki bayt daha golf oynadı. Bu adam bayt sayısının yarıya inmesinden sorumlu!

n2;d[~]4+2:N.

Burada deneyin!

açıklama

@VoteToClose n^ 2, bit nkez DEĞİL kez uygulayın , dört ekleyin, yarıya. - Thomas Kwa 7 dakika önce

Bunun neden işe yaradığının açıklaması için Dennis'in cevabına bakınız . Bu cevap üzerine bir yorumda :, tamsayı bölümü olduğu için çalışan başka bir iyileştirme önerdi , bu yüzden yığının tepesini reddedebilir ve +1'nin ikili tamamlayıcıyı yapmasından endişe etmeyebilirim. Ayrıca, n ve n ^ 2 aynı pariteye sahiptir, bu da bir takas ihtiyacını ortadan kaldırır.

n                Take number from input - n
 2;              n**2
   d             Duplicates top of stack
    [~]          For loop that negates the top of stack n times
       4+        Add 4
         2:      Divide by 2
           N.    Output as number and stop.

2

GolfScript, 12 bayt

~2?.{~}*2/2+

Bu, Jelly cevabımdaki algoritmayı kullanıyor .Çevrimiçi deneyin!

Nasıl çalışır

~            # Evaluate the input.
 2?          # Square it.
   .         # Push a copy of the square.
    {~}      # Push a code block that applies bitwise NOT.
       *     # Execute it n² times. Since n² and n have the same parity,
             # this is equivalent to executing in only n times.
        2/   # Halve the result.
          2+ # Add 2.

2

ES7, 17 bayt

n=>-1**n*n*n+4>>1

@ Dennis'in Python 2 cevabının basit portu.

Bu yanıtı yazarken ES6 limanımı 17 bayt'a da golf ettirmeyi başardım!

n=>(n*n^-n%2)/2+2


2

Saf Bash, 28

Peki şimdi @Dennis bunu nasıl yapacağımızı bize gösterdi, bunun güncellenmesi gerekiyor:

echo $[-1**$1*($1*$1+1)/2+2]

Önceki cevap:

Bash + GNU yardımcı programları, 77

İşte bir başlangıç:

a=$1
(seq 1 $[a+1] $[a*a]
seq $1 $[a>1?a-1:1] $[a*a])|sort -un|paste -sd+-|bc

N, komut satırı parametresi olarak geçirilir.

pasteburada, alternatif meblağ üretmek için gerçekten kullanışlıdır. -dSeçenek döngüsel olarak kullanılan ayırıcı karakterleri içeren bir liste verir.


$[-1**$1*$1*$1+4>>1]daha da kısadır.
Neil

2

Julia, 41 40 25 19 16 bayt

n->-n%2$n^2÷2+2

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Dennis tarafından tasarlanan bu yaklaşım aşağıdaki gibidir. İlk olarak n'nin paritesini , yani n (mod 2) alırız ve reddederiz. Bu, çift girişler için 0 ve tek için -1 verir. Daha sonra n 2 ile bit XOR . Ne zaman n bile olduğunu bu sadece n 2 0 ile XOR sadece sayıdır çünkü. Zaman n, tek bir XOR -1 bit düzeyinde reddi ile aynıdır. Yani bu noktada biz ya sahip n 2 ya DEĞİL ait bit benzeri n 2 . Bunu 2'ye bölüyoruz ve sonucu elde etmek için 2 ekliyoruz.

Önceki bir sürümde Sp3000 sayesinde bir bayt kurtardı ve bu konuda Dennis sayesinde 9 kurtardı!



1

Python 2, 24 bayt

lambda n:(-1)**n*n*n/2+2

Bu, şu algoritmayı kullanır: küçük bir değişiklikle Jelly cevabımdaki :

Bunun yerine uygulanması ~ n sürelerini biz uygulamak - n (tarafından çarpılarak kez (-1) n ). Bu eşdeğerdir, çünkü Python'daki ~ x = -x - 1 ve tamsayı bölme tabanları, bu nedenle ~ x / 2 = (-x - 1) / 2 = -x / 2 .


1

Pyth, 11 bayt

+2/u_GQ*QQ2

Pyth Derleyicisinde çevrimiçi deneyin .

Nasıl çalışır

Bu, küçük bir değişiklikle Jelly cevabımdaki algoritmayı kullanır :

Bunun yerine uygulanması ~ n sürelerini biz uygulamak - n (tarafından çarpılarak kez (-1) n ). Bu eşdeğerdir, çünkü ~ x = -x - 1 ve Pyth içindeki tamsayı bölme tabanları, bu nedenle ~ x / 2 = (-x - 1) / 2 = -x / 2'dir .

+2/u_GQ*QQ2  Evaluated input: Q

       *QQ   Yield Q².
   u  Q      Set G = Q². For each non-negative integer below Q:
    _G         Set G = -G.
             Return G.
  /       2  Halve the result.
+2           Add 2.

1

dc, 17

Dennis'in denenmiş ve test edilmiş aynı formülünü kullanarak:

?dd*1+r_1r^*2/2+p

Çevrimiçi deneyin Oh, neden Ideone bash sandbox içermiyor dc?

Komut Satırı Testi:

for i in {1..100}; do echo $i | dc -e '?dd*1+r_1r^*2/2+p'; done 

?2^1+2~2*1-*2+piki bayt kaydeder.
Dennis

1

GS2, 9 bayt

V,@!α2+''

Bu, Jelly cevabımdaki algoritmayı kullanıyor . Çevrimiçi deneyin!

V,@e 7+''

eşit derecede kısadır, ancak özellikle ASCII olmayan karakterler içermez.

Nasıl çalışır

V          Parse the input as an integer n.
 ,         Compute n².
  @        Push a copy of n².
   !       Bitwise NOT.
    α      Make a block of the previous instruction.
     2     Execute the block n² times. Since n² and n have the same parity,
           this is equivalent to executing in only n times.
      +    Halve the result.
       ''  Increment twice.

1

J, 16 bayt

[:<.2%~4+*:*_1^]

Bu, Jelly cevabımla aynı algoritmayı kullanıyor. J.js ile test edin .


0

Lua, 33 bytes ( Çevrimiçi deneyin )

i=(...)print((-1)^i*i*i/2-.5*i%2)

Nasıl çalışır:

i=(...)print((-1)^i*i*i/2-.5*i%2)
i=(...)                           Take input and store to i
       print(
             (-1)^i               Raise (-1) to the i-th power: -1 if odd, 1 if even
                   *i*i/2         Multiply by i squared and halved.
                         -.5*i%2  i%2 is the remainder when i is divided by 2
                                  if i is odd, then i%2 will be 1, and this expression
                                  will evaluate to -0.5
                                  but if i is even, then i%2 will be 0, which makes
                                  this expression evaluate to 0
                                )

0

Dyalog APL, 13 bayt

⌊2+.5××⍨ׯ1*⊢

Bu, Jelly cevabımla aynı algoritmayı kullanıyor. TryAPL üzerinde test edin .

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.