Trova l'ennesima somma alternata


17

Dato un input di un singolo numero intero positivo, emette la "somma alternata" che corrisponde a quel numero intero.

Prendi l'esempio dell'input n=5. Per trovare la somma alternata, crea prima una griglia quadrata di larghezza e altezza nche, leggendo da sinistra a destra e dall'alto verso il basso, inizia 1e aumenta di una ogni posizione:

 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

Quindi, prendi le somme dalla griglia che formano una "croce" (cioè entrambe le diagonali combinate):

 1           5
    7     9
      13
   17    19
21          25

1 5 7 9 13 17 19 21 25

Infine, prendi la somma alternata di questa sequenza:

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

-11

Un altro esempio, per n=6(solo per mostrare come appare la croce per i numeri pari 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

Dato che si tratta di , vincerà il codice più breve in byte.

Ecco gli output corretti per n=1to n=100, che è possibile utilizzare come casi di test:

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: non è una somma alternativa. Stai aggiungendo i primi due termini.
Dennis,

Risposte:


26

Gelatina, 21 19 11 10 7 byte

²~³¡H+2

Provalo online!

Idea

Supponiamo per un secondo che il primo termine della somma finale sia sottratto anziché aggiunto.

Let n un numero intero positivo.

Caso pari

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

Le differenze tra gli elementi diagonali nella metà inferiore delle file sono i primi n ÷ 2 numeri naturali dispari. Poiché 1 + 3 + 5 +… + (2k + 1) = k 2 , si sommano a (n ÷ 2) 2 = n 2 ÷ 4 .

In questo esempio

- 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

Pertanto, la somma è 2 × n 2 ÷ 4 = n 2 ÷ 2 .

Caso strano

 1           5
    7     9
      13
   17    19
21          25

Le differenze tra gli elementi diagonali sulle righe corrispondenti dall'alto e dal basso ( 1e 5, e 21e 25; 7e 9, e 17e 19) sono le stesse, quindi verranno annullate nella somma alternata.

In questo esempio

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

Tutto ciò che rimane è il negativo dell'elemento centrale, che è la media aritmetica del primo e dell'ultimo numero, quindi può essere calcolato come - (n 2 + 1) ÷ 2 .

Caso generale

Poiché ~ x = - (x + 1) per gli interi di complemento di due ( ~ indica NOT bit a bit), la formula per il caso dispari può essere riscritta come ~ n 2 ÷ 2 .

Inoltre, poiché viene aggiunto il primo termine ( 1 ) della somma originale anziché sottratto, le formule precedenti lasciano un errore di 2 , che deve essere corretto.

Pertanto, la nona somma alternata è n 2 ÷ 2 + 2 se n è pari e ~ n 2 ÷ 2 + 2 se è dispari.

Infine, bit a bit NOT è un'involuzione, ovvero ~~ x = x per tutti x . In questo modo ~~~ x = ~ x , ~~~~ x = x e, in generale, ~ n x (nel senso che ~ viene applicato n volte) è x se n è pari e ~ x se è dispari.

Pertanto, possiamo riscrivere la nostra formula generale come ~ n n 2 ÷ 2 + 2 per tutti gli interi positivi n .

Codice

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

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

1
Sapevo che esisteva una sorta di formula semplice, ma la tua spiegazione ed esecuzione sono semplicemente fantastiche. +1
ETHproductions

5

JavaScript, 40 38 22 byte

Usando quella nuova e sofisticata soluzione a forma chiusa che è di gran moda!

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

Grazie a ThomasKwa, posso eliminare la mia costosa funzione ricorsiva.


Hai solo bisogno di NON bit a bit una volta se n% 2. In realtà, penso che in JS potrebbe essere più breve farlo(n%2?3-n*n:4+n*n)/2
lirtosiast



3

Minkolang 0.15 , 26 15 13 byte

Usando il folle algoritmo di Dennis, e grazie a lui ha recuperato altri due byte. Quel ragazzo è responsabile della metà del conteggio dei byte!

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

Provalo qui!

Spiegazione

@VotoToClose n^ 2, applicare nvolte NON bit a bit , aggiungere quattro, dimezzare. - Thomas Kwa 7 minuti fa

Vedi la risposta di Dennis per la spiegazione del perché funzioni. In un commento su questa risposta, ha suggerito un altro miglioramento che funziona perché :è la divisione intera, quindi posso annullare la parte superiore dello stack e non preoccuparmi del +1 dal fare il complemento binario. Inoltre, n e n ^ 2 hanno la stessa parità, il che elimina la necessità di uno scambio.

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 byte

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

Questo utilizza l'algoritmo della mia risposta Jelly . Provalo online!

Come funziona

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

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

Porta semplice della risposta Python 2 di @ Dennis.

Mentre scrivevo questa risposta sono riuscito a golfare la mia porta ES6 anche a 17 byte!

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


2

Pure Bash, 28

Bene, ora che @Dennis ci ha mostrato come fare, è necessario aggiornare:

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

Risposta precedente:

Utilità Bash + GNU, 77

Ecco un inizio:

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

N viene passato come parametro della riga di comando.

pasteè davvero utile qui per produrre la somma alternata. L' -dopzione consente un elenco di caratteri di separazione, che vengono utilizzati ciclicamente.


$[-1**$1*$1*$1+4>>1]è ancora più breve.
Neil

2

Julia, 41 40 25 19 16 byte

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

Questa è una funzione anonima che accetta un numero intero e restituisce un numero intero. Per chiamarlo, assegnarlo a una variabile.

L'approccio qui, ideato da Dennis, è il seguente. Innanzitutto otteniamo la parità di n , ovvero n (mod 2), e la neghiamo. Questo ci dà 0 per input pari e -1 per odd. Quindi XOR bit a bit con n 2 . Quando n è pari, questo è solo n 2 perché XOR con 0 è solo il numero. Quando n è dispari, XOR con -1 è uguale alla negazione bit a bit. Quindi a questo punto abbiamo n 2 o NOT bit a bit di n 2 . Dividiamo questo intero per 2 e aggiungiamo 2 per ottenere il risultato.

Hai salvato un byte grazie a Sp3000 in una versione precedente e salvato 9 grazie a Dennis su questo!


1

Jolf, 13 byte

Provalo qui!

½?mρj-3Qj+4Qj
 ?mρj         if parity of j
     -3Qj     return 3 - j*j
         +4Qj else return 4 + j*j
½             (and halve the result)

1

Python 2, 24 byte

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

Questo utilizza l'algoritmo della mia risposta Jelly , con una piccola modifica:

Invece di applicare ~ n volte, applichiamo - n volte (moltiplicando per (-1) n ). Questo è equivalente perché ~ x = -x - 1 e piani di divisione interi in Python, quindi ~ x / 2 = (-x - 1) / 2 = -x / 2 .


1

Pyth, 11 byte

+2/u_GQ*QQ2

Provalo online nel compilatore Pyth .

Come funziona

Questo utilizza l'algoritmo della mia risposta Jelly , con una piccola modifica:

Invece di applicare ~ n volte, applichiamo - n volte (moltiplicando per (-1) n ). Questo è equivalente perché ~ x = -x - 1 e i piani di divisione interi in Pyth, quindi ~ x / 2 = (-x - 1) / 2 = -x / 2 .

+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

Utilizzando la stessa formula testata di Dennis:

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

Provalo online Oh, perché la sandbox Ideone Bash non include dc?

Test da riga di comando:

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

?2^1+2~2*1-*2+psalva due byte.
Dennis,

1

GS2, 9 byte

V,@!α2+''

Questo utilizza l'algoritmo della mia risposta Jelly . Provalo online!

V,@e 7+''

è ugualmente breve, ma in particolare non contiene caratteri non ASCII.

Come funziona

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 byte

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

Questo utilizza lo stesso algoritmo della mia risposta Jelly. Prova con J.js .


0

Lua, 33 byte ( Provalo online )

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

Come funziona:

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 byte

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

Questo utilizza lo stesso algoritmo della mia risposta Jelly. Provalo su TryAPL .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.