Étant donné l'entrée d'un seul entier positif, sortez la "somme croisée" qui correspond à cet entier.
Prenons l'exemple de l'entrée n=5
. Pour trouver la somme croisée, créez d'abord une grille carrée de largeur et de hauteur n
qui, en lisant de gauche à droite et de haut en bas, commence à 1
et augmente d'une position à chaque:
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
Ensuite, prenez les sommes de la grille qui forment une "croix" (c'est-à-dire les deux diagonales combinées):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Enfin, prenez la somme alternée de cette séquence:
1+5-7+9-13+17-19+21-25
-11
Un autre exemple, pour n=6
(juste pour montrer à quoi ressemble la croix pour les nombres pairs 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
Puisqu'il s'agit de code-golf , le code le plus court en octets gagnera.
Voici les sorties correctes pour n=1
to n=100
, que vous pouvez utiliser comme cas de 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
Réponses:
Gelée,
211911107 octetsEssayez-le en ligne!
Idée
Supposons une seconde que le premier terme de la somme finale est soustrait plutôt que ajouté.
Soit n un entier positif.
Même cas
Les différences entre les éléments diagonaux dans la moitié inférieure des rangées correspondent aux n ÷ 2 premiers nombres naturels impairs. Puisque 1 + 3 + 5 +… + (2k + 1) = k 2 , ils totalisent (n ÷ 2) 2 = n 2 ÷ 4 .
Dans cet exemple
Ainsi, la somme est 2 × n 2 ÷ 4 = n 2 ÷ 2 .
Cas étrange
Les différences entre les éléments diagonaux sur les lignes correspondantes d'en haut et en bas (
1
et5
, et21
et25
;7
et9
, et17
et19
) sont les mêmes, ils s'annuleront donc dans la somme alternée.Dans cet exemple
Il ne reste que le négatif de l'élément central, qui est la moyenne arithmétique du premier et du dernier nombre, de sorte qu'il peut être calculé comme - (n 2 + 1) ÷ 2 .
Cas général
Étant donné que ~ x = - (x + 1) pour les entiers de complément à deux ( ~ indique NON au niveau du bit), la formule pour le cas impair peut être réécrite comme ~ n 2 ÷ 2 .
De plus, comme le premier terme ( 1 ) de la somme d'origine est ajouté au lieu d'être soustrait, les formules ci-dessus laissent une erreur de 2 , qui doit être corrigée.
Par conséquent, la n e somme croisée est n 2 ÷ 2 + 2 si n est pair, et ~ n 2 ÷ 2 + 2 s'il est impair.
Enfin, NOT au niveau du bit est une involution, c'est-à-dire ~~ x = x pour tout x . De cette façon ~~~ x = ~ x , ~~~~ x = x , et, en général, ~ n x (ce qui signifie que ~ est appliqué n fois) est x si n est pair et ~ x s'il est impair.
Ainsi, nous pouvons réécrire notre formule générale comme ~ n n 2 ÷ 2 + 2 pour tous les entiers positifs n .
Code
la source
JavaScript,
403822 octetsEn utilisant cette nouvelle solution de forme fermée fantaisie qui fait fureur!
Grâce à ThomasKwa, je peux éliminer ma fonction récursive coûteuse.
la source
(n%2?3-n*n:4+n*n)/2
Gelée, 12 octets
Essayez-le ici .
la source
CJam, 13
15octetsDeux octets de moins grâce à Dennis.
Essayez-le en ligne!
la source
2%{~}&
par{~}*
enregistre deux octets.Minkolang 0,15 ,
261513 octetsEn utilisant l'algorithme insensé de Dennis, et grâce à lui, il a joué encore deux octets. Ce mec est responsable de réduire de moitié le nombre d'octets!
Essayez-le ici!
Explication
Voir la réponse de Dennis pour l'explication de pourquoi cela fonctionne. Dans un commentaire sur cette réponse, il a suggéré une autre amélioration qui fonctionne parce que
:
c'est la division entière, donc je peux annuler le haut de la pile et ne pas me soucier du +1 de faire le complément binaire. De plus, n et n ^ 2 ont la même parité, ce qui supprime la nécessité d'un swap.la source
GolfScript, 12 octets
Cela utilise l'algorithme de ma réponse Jelly . Essayez-le en ligne!
Comment ça fonctionne
la source
ES7, 17 octets
Port simple de @ Dennis's Python 2 answer.
En écrivant cette réponse, j'ai réussi à jouer mon port ES6 à 17 octets aussi!
la source
MATL , 13
27octetsEn utilisant les formules étonnantes de Dennis:
Essayez-le en ligne!
Approche directe ( 27 octets ):
la source
Pure Bash, 28
Eh bien maintenant que @Dennis nous a montré comment faire cela, cela doit être mis à jour:
Réponse précédente:
Utilitaires Bash + GNU, 77
Voici un début:
N est passé en tant que paramètre de ligne de commande.
paste
est vraiment pratique ici pour produire la somme alternée. L'-d
option permet une liste de caractères de séparation, qui sont utilisés de manière cyclique.la source
$[-1**$1*$1*$1+4>>1]
est encore plus court.Julia,
4140251916 octetsIl s'agit d'une fonction anonyme qui accepte un entier et renvoie un entier. Pour l'appeler, affectez-le à une variable.
L'approche ici, conçue par Dennis, est la suivante. D'abord, nous obtenons la parité de n , c'est-à-dire n (mod 2), et la nions. Cela nous donne 0 pour les entrées paires et -1 pour les impaires. Nous avons ensuite XOR au niveau du bit avec n 2 . Lorsque n est pair, ce n'est que n 2 car XOR avec 0 n'est que le nombre. Lorsque n est impair, XOR avec -1 est identique à la négation au niveau du bit. Donc, à ce stade, nous avons soit n 2, soit le NOT binaire de n 2 . Nous divisons cet entier par 2 et ajoutons 2 pour obtenir le résultat.
Enregistré un octet grâce à Sp3000 sur une version précédente, et enregistré 9 grâce à Dennis sur celle-ci!
la source
Jolf, 13 octets
Essayez-le ici!
la source
Python 2, 24 octets
Il utilise l'algorithme de ma réponse Jelly , avec une modification mineure:
Au lieu d'appliquer
~
n fois, nous appliquons-
n fois (en multipliant par (-1) n ). C'est équivalent car ~ x = -x - 1 et les étages de division entiers en Python, donc ~ x / 2 = (-x - 1) / 2 = -x / 2 .la source
Pyth, 11 octets
Essayez-le en ligne dans le compilateur Pyth .
Comment ça fonctionne
Cela utilise l'algorithme de ma réponse Jelly , avec une modification mineure:
Au lieu d'appliquer
~
n fois, nous appliquons-
n fois (en multipliant par (-1) n ). C'est équivalent car ~ x = -x - 1 et les étages de division entiers en Pyth, donc ~ x / 2 = (-x - 1) / 2 = -x / 2 .la source
dc, 17
En utilisant la même formule éprouvée de Dennis:
Essayez-le en ligneOh, pourquoi le bac à sable Ideone bash ne comprend-il pasdc
?Test en ligne de commande:
la source
?2^1+2~2*1-*2+p
enregistre deux octets.GS2, 9 octets
Cela utilise l'algorithme de ma réponse Jelly . Essayez-le en ligne!
est également court, mais ne contient notamment aucun caractère non ASCII.
Comment ça fonctionne
la source
J, 16 octets
Cela utilise le même algorithme que ma réponse Jelly. Testez - le avec J.js .
la source
Lua, 33 octets ( Essayez-le en ligne )
Comment ça fonctionne:
la source
Dyalog APL, 13 octets
Cela utilise le même algorithme que ma réponse Jelly. Testez-le sur TryAPL .
la source