Dada la entrada de un solo entero positivo, genera la "suma alterna cruzada" que corresponde a ese entero.
Tome el ejemplo de la entrada n=5
. Para encontrar la suma alternativa cruzada, primero cree una cuadrícula cuadrada de ancho y alto n
que, leyendo de izquierda a derecha y de arriba a abajo, comience 1
y aumente en uno en cada posició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
Luego, tome las sumas de la cuadrícula que forman una "cruz" (es decir, ambas diagonales combinadas):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Finalmente, tome la suma alterna de esta secuencia:
1+5-7+9-13+17-19+21-25
-11
Otro ejemplo, para n=6
(solo para mostrar cómo se ve la cruz para los pares 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
Como se trata de code-golf , ganará el código más corto en bytes.
Estas son las salidas correctas para n=1
to n=100
, que puede usar como casos de prueba:
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
Respuestas:
Jalea,
211911107 bytesPruébalo en línea!
Idea
Suponga por un segundo que el primer término de la suma final se resta en lugar de sumar.
Sea n un número entero positivo.
Incluso caso
Las diferencias entre los elementos diagonales en la mitad inferior de las filas son los primeros n ÷ 2 números naturales impares. Como 1 + 3 + 5 +… + (2k + 1) = k 2 , suman (n ÷ 2) 2 = n 2 ÷ 4 .
En este ejemplo
Por lo tanto, la suma es 2 × n 2 ÷ 4 = n 2 ÷ 2 .
Caso extraño
Las diferencias entre los elementos diagonales en las filas correspondientes de arriba y abajo (
1
y5
, y21
y25
;7
y9
, y17
y19
) son las mismas, por lo que se cancelarán en la suma alterna.En este ejemplo
Todo lo que queda es el negativo del elemento central, que es la media aritmética del primer y último número, por lo que se puede calcular como - (n 2 + 1) ÷ 2 .
Caso general
Dado que ~ x = - (x + 1) para enteros complementarios de dos ( ~ denota NO a nivel de bits), la fórmula para el caso impar se puede reescribir como ~ n 2 ÷ 2 .
Además, dado que el primer término ( 1 ) de la suma original se agrega en lugar de restar, las fórmulas anteriores dejan un error de 2 , que debe corregirse.
Por lo tanto, la enésima suma alternativa cruzada es n 2 ÷ 2 + 2 si n es par, y ~ n 2 ÷ 2 + 2 si es impar.
Finalmente, NO bit a bit es una involución, es decir, ~~ x = x para todo x . De esta manera ~~~ x = ~ x , ~~~~ x = x , y, en general, ~ n x (lo que significa que ~ se aplica n veces) es x si n es par y ~ x si es impar.
Por lo tanto, podemos reescribir nuestra fórmula general como ~ n n 2 ÷ 2 + 2 para todos los enteros positivos n .
Código
fuente
JavaScript,
403822 bytes¡Usar esa solución nueva y elegante de forma cerrada es furor!
Gracias a ThomasKwa, puedo eliminar mi costosa función recursiva.
fuente
(n%2?3-n*n:4+n*n)/2
Jalea, 12 bytes
Pruébalo aquí .
fuente
CJam, 13
15bytesDos bytes de descuento gracias a Dennis.
Pruébalo en línea!
fuente
2%{~}&
con{~}*
guarda dos bytes.Minkolang 0.15 ,
261513 bytesUsando el algoritmo loco de Dennis, y aproveché otros dos bytes gracias a él. ¡Ese tipo es responsable de reducir a la mitad el conteo de bytes!
Pruébalo aquí!
Explicación
Vea la respuesta de Dennis para la explicación de por qué eso funciona. En un comentario sobre esta respuesta, sugirió otra mejora que funciona porque
:
es la división de enteros, por lo que puedo negar la parte superior de la pila y no preocuparme de que el +1 haga el complemento binario. Además, n y n ^ 2 tienen la misma paridad, lo que elimina la necesidad de un intercambio.fuente
GolfScript, 12 bytes
Esto usa el algoritmo de mi respuesta Jelly . Pruébalo en línea!
Cómo funciona
fuente
ES7, 17 bytes
Puerto simple de la respuesta de @ Dennis Python 2.
Mientras escribía esta respuesta, ¡también logré jugar mi puerto ES6 a 17 bytes!
fuente
MATL , 13
27bytesUsando las increíbles fórmulas de Dennis:
Pruébalo en línea!
Enfoque directo ( 27 bytes ):
fuente
Pure Bash, 28
Bueno, ahora que @Dennis nos ha mostrado a todos cómo hacer esto, esto necesita actualizarse:
Respuesta anterior:
Bash + utilidades GNU, 77
Aquí hay un comienzo:
N se pasa como un parámetro de línea de comandos.
paste
es realmente útil aquí para producir la suma alterna. La-d
opción permite una lista de caracteres separadores, que se usan cíclicamente.fuente
$[-1**$1*$1*$1+4>>1]
Es aún más corto.Julia,
4140251916 bytesEsta es una función anónima que acepta un entero y devuelve un entero. Para llamarlo, asígnelo a una variable.
El enfoque aquí, ideado por Dennis, es el siguiente. Primero obtenemos la paridad de n , es decir, n (mod 2), y la negamos. Esto nos da 0 para entradas pares y -1 para impares. Entonces XOR bit a bit con n 2 . Cuando n es par, esto es solo n 2 porque XOR con 0 es solo el número. Cuando n es impar, XOR con -1 es lo mismo que la negación bit a bit. Entonces, en este punto, tenemos n 2 o el NOT bit a bit de n 2 . Enteros dividimos esto entre 2 y sumamos 2 para obtener el resultado.
¡Ahorré un byte gracias a Sp3000 en una versión anterior y ahorré 9 gracias a Dennis en esta!
fuente
Jolf, 13 bytes
Pruébalo aquí!
fuente
Python 2, 24 bytes
Esto usa el algoritmo de mi respuesta Jelly , con una modificación menor:
En lugar de aplicar
~
n veces, aplicamos-
n veces (multiplicando por (-1) n ). Esto es equivalente porque ~ x = -x - 1 y los pisos de división de enteros en Python, entonces ~ x / 2 = (-x - 1) / 2 = -x / 2 .fuente
Pyth, 11 bytes
Pruébelo en línea en el compilador Pyth .
Cómo funciona
Esto usa el algoritmo de mi respuesta Jelly , con una modificación menor:
En lugar de aplicar
~
n veces, aplicamos-
n veces (multiplicando por (-1) n ). Esto es equivalente porque ~ x = -x - 1 y los pisos de división entera en Pyth, entonces ~ x / 2 = (-x - 1) / 2 = -x / 2 .fuente
dc, 17
Usando la misma fórmula probada de Dennis:
Pruébelo en líneaOh, ¿por qué no incluye el sandbox de Ideone bash?dc
?Prueba de línea de comando:
fuente
?2^1+2~2*1-*2+p
Guarda dos bytes.GS2, 9 bytes
Esto usa el algoritmo de mi respuesta Jelly . Pruébalo en línea!
es igualmente corto, pero notablemente no contiene caracteres no ASCII.
Cómo funciona
fuente
J, 16 bytes
Esto usa el mismo algoritmo que mi respuesta Jelly. Prueba con J.js .
fuente
Lua, 33 bytes ( Pruébelo en línea )
Cómo funciona:
fuente
Dyalog APL, 13 bytes
Esto usa el mismo algoritmo que mi respuesta Jelly. Pruébelo en TryAPL .
fuente