Como sabrás, existe un hecho matemático divertido de que si sumas todos los números naturales terminas con ... -1/12 (ver Wikipedia aquí) .
Por supuesto, este es un resultado muy extraño y no se puede obtener simplemente agregando un número seguido de otro, sino algunos trucos matemáticos especiales.
Sin embargo, su tarea es escribir un programa, que parece que intenta agregar todos los números naturales, pero cuando lo ejecuta, devuelve -1/12.
En pseudocódigo podría verse así:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Puede hacerlo de la forma que desee: puede explotar el desbordamiento del búfer, jugar con errores generados mientras alguna variable se vuelve demasiado grande o simplemente ocultar lo crucial a lo largo del código de alguna manera inteligente. Las únicas condiciones son que el código debe parecer al principio como si intentara agregar todos los números naturales y cuando se ejecuta devuelve -1/12 (en cualquier formato, puede ser decimal, binario, texto, ascii art, lo que sea).
Por supuesto, el código puede contener mucho más de lo que se muestra arriba, pero debe ser lo suficientemente claro como para engañar al lector.
Este es un concurso de popularidad: ¡vota por la idea más inteligente!
fuente
Respuestas:
C
En caso de trabajar en plataformas donde ambos
sizeof(float)
ysizeof(int)
son 4 y sigue el estándar de punto flotante IEEE (supongo).Versión 1:
Salida:
-0.083
Explicación:
Un agradecimiento especial a @Geobits por la idea de terminar el ciclo al comparar la suma en lugar del contador.
Editar: Versión 2
Salida:
-0.083333
Explicación:
fuente
79776
es137A0
, que es((int) "\rz") << 4
. No está seguro de lo útil que es, sin embargowhile(!(abs<delta))
lugar dewhile(abs>delta)
soltar el cheque NaN.Pitón
Resultado:
Entonces, ¿cuál es el truco?
fuente
Mathematica
(Nota: pegar esto en un cuaderno de Mathematica probablemente revelará lo que está sucediendo).
fuente
68+{0,37,46,37,31,36,40,33,48}
, ya quePlus
tiene elListable
atributo. Personalmente, esto me parece más idiomático.C
Muy bien formatea la respuesta como
-1/12
, no0.8333
.¿Cómo funciona?
fuente
Brainfuck
El código solo evalúa 1 + 2 + 3 + ...
fuente
1 + 2 + 3 + ...
que significa que 256 tendría que ser triangular,i == 256
como también afirma, pero 256 no es un número triangular. Además, ¿de dónde sale el código-1/12
?1/12
lugar de-1/12
(¿Feliz hoy? +.
- -.
+ +.
+ Por favor, vote por mí.
) Estos cuatro.
son para la salida.256
.i
convierte en cero cuando llega256
(eso es lo que quise decir con desbordamiento). En este punto, el bucle externo termina y se ejecutan las siguientes líneas (que parecen comentarios), de ahí la salida de-1/12
.Solo agrego un poco mejor ofuscación de dejar el bucle a la respuesta de as.
Sugerencia no hay desbordamiento ...
fuente
average=sum/i;
da un SIGFPE, capturadohandler
, imprimiendo -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
es un obvio que algo está sucediendo allí, y ver que está en el controlador de SIGFPE hace que esto sea demasiado obvio para mis gustos.Perl 6
Esto calcula la suma usando la función zeta. Hubiera usado
[+] 1..*
(suma de todos los números entre 1 e infinito), excepto que se ejecuta en tiempo infinito.fuente
Java
Esto agrega todos los números desde 0 al valor máximo, multiplicado por 12, y también agrega 1 al final. El resultado es 0, por lo tanto, la suma de los números debe ser (0 - 1) / 12.
Explicación:
fuente
Rubí
Manifestación
De acuerdo, la supuesta semántica y sintaxis de salida aquí tiene poco sentido, pero tal vez eso no sea aparente a simple vista.
También tenga en cuenta que esto es, de hecho, independiente de Ruby Platform and Version. Depende de que se definan otras constantes como se esperaba.
fuente
C
Para tratar la suma (casi) infinita en un período de tiempo razonable, compile con las siguientes opciones para algunas optimizaciones del compilador (obligatorio):
Salida de muestra:
fuente
??/
truco del trigrafo hace tiempo que dejó de ser inteligente. :(Java
En teoría, esto se imprimirá
true
. Sin embargo, creo que mi computadora se desmoronará antes de que termine de funcionar.fuente
-1/12
es muy cero. Entonces, ¿supongo que es algún tipo de comportamiento de desbordamiento lo que hace que el ciclo finalice y, por coincidencia, sesum
desborde a cero?long
. El universo probablemente ya no existirá para entonces, pero esto es solo teórico, ¿verdad? Y sí, los 32 bits inferioressum
serán todos cero, por eso es importantesum
ser unint
, no unlong
. Por supuesto, como ha dicho @ace, Java utiliza la división de enteros para evaluar-1/12
, por lo que es cero.Java
Cómo funciona:
Ojalá pudiera publicar esto como un spoiler, pero no puedo entender cómo. Aquí está el resto del código que está escondido furtivamente.
fuente
¡Sin soluciones Haskell, inaceptable!
¡Podemos utilizar las infinitas listas de Haskell para obtener una respuesta exacta!
Haskell
La solución es bastante sencilla cuando tienes en cuenta las flechas ...
Entonces, ¿cuál es el truco?
fuente
C
Según el estándar C, esto podría imprimirse muy bien,
Answer = -1/12
ya que habrá un desbordamiento de entero con signo que es un comportamiento indefinido. Encontrar un compilador que haga esto se deja como ejercicio para el lector.fuente
printf
Mathematica
fuente
Python 3.x
Un poco nuevo aquí. ¿Algun consejo?
fuente
JavaScript (ECMAScript 6)
Cómo funciona:
1:
2:
3:
4:
fuente
C ++
Si
#define
se eliminan los dos s, el código seguirá siendo un código C ++ válido e intentará (pero, por supuesto, fallará) calcular la suma de todos los enteros.Cómo funciona:
Dado el pseudocódigo de los carteles, no pude resistirme a agregar este. Utiliza la misma idea básica y otra pequeña, pero no creo que sea tan elegante.
Cómo funciona:
Y por qué no deberías intentar ejecutarlo:
fuente