Comme vous le savez peut-être, il y a un fait mathématique amusant que si vous ajoutez tous les nombres naturels, vous vous retrouvez avec ... -1/12 (voir Wikipedia ici) .
Bien sûr, ce résultat est très étrange et ne peut être obtenu en ajoutant simplement un nombre suivi d’un autre, mais quelques astuces mathématiques spéciales.
Cependant, votre tâche consiste à écrire un programme qui ressemble à une tentative d’ajout de tous les nombres naturels, mais lorsque vous l’exécutez, il renvoie -1/12.
En pseudocode, cela pourrait ressembler à ceci:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Vous pouvez le faire comme bon vous semble: exploiter un dépassement de tampon, jouer avec les erreurs renvoyées alors que certaines variables deviennent trop grosses ou simplement masquer de manière astucieuse l'élément crucial du code. Les seules conditions sont que le code doit d’abord donner l’impression de tenter d’ajouter tous les nombres naturels et, une fois exécuté, il renvoie -1/12 (quel que soit le format, il peut s’agir de décimal, binaire, texte, texte ASCII, etc.).
Le code peut bien sûr contenir beaucoup plus que ce qui est montré ci-dessus, mais il devrait être assez clair pour tromper le lecteur.
C'est un concours de popularité - votez pour l'idée la plus intelligente!
la source
Réponses:
C
Devrait fonctionner sur des plates-formes où les deux
sizeof(float)
etsizeof(int)
sont 4 et suit la norme de virgule flottante IEEE (je suppose).Version 1:
Sortie:
-0.083
Explication:
Un merci spécial à @Geobits pour l’idée de terminer la boucle en comparant la somme au lieu du compteur.
Edit: Version 2
Sortie:
-0.083333
Explication:
la source
79776
est137A0
, qui est((int) "\rz") << 4
. Je ne sais pas si c'est utile, cependantwhile(!(abs<delta))
au lieu dewhile(abs>delta)
supprimer le contrôle NaN.Python
Résultat:
Alors, quel est le truc?
la source
Mathematica
(Remarque: le coller dans un cahier Mathematica révélera probablement ce qui se passe.)
la source
68+{0,37,46,37,31,36,40,33,48}
, carPlus
a l'Listable
attribut. Personnellement, je trouve cela plus idiomatique.C
Formate bien la réponse comme
-1/12
, pas0.8333
.Comment ça fonctionne?
la source
Brainfuck
Le code vient d'évaluer 1 + 2 + 3 + ...
la source
1 + 2 + 3 + ...
ce qui signifie que 256 doit être triangulairei == 256
comme vous le prétendez également, mais 256 n'est pas un nombre triangulaire. De plus, d'où vient votre code-1/12
?1/12
au lieu de-1/12
(Heureux aujourd'hui? +.
- -.
+ +.
+ S'il vous plaît, votez pour moi.
) Ces quatre.
sont pour sortir.256
.i
deviennent donc nulles256
(c'est ce que je voulais dire par débordement). Sur ce point, la boucle externe se termine et les lignes suivantes (qui ressemblent à des commentaires) sont exécutées, d’où la sortie de-1/12
.Ajoutons juste un peu mieux de laisser la boucle à la réponse de Ace.
Astuce il n'y a pas de débordement ...
la source
average=sum/i;
un SIGFPE, pris parhandler
, affiche -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
est un cadeau mortel que quelque chose se passe là-bas, et voir que c'est dans le gestionnaire pour SIGFPE rend cela trop évident pour mes goûts.Perl 6
Ceci calcule la somme en utilisant la fonction zêta. J'aurais utilisé
[+] 1..*
(somme de tous les nombres compris entre 1 et l'infini), sauf que s'exécute dans un temps infini.la source
Java
Cela ajoute tous les nombres de 0 à la valeur maximale, multipliés par 12, et ajoute également 1 à la fin. Le résultat est 0, la somme des nombres doit donc être (0 - 1) / 12.
Explication:
la source
Rubis
Démo
D'accord, la sémantique et la syntaxe de sortie supposées ici ont peu de sens, mais ce n'est peut-être pas évident au premier abord.
Notez également que cela est, en fait, indépendant de Ruby Platform et Version. Cela dépend de la définition de certaines autres constantes comme prévu.
la source
C
Afin de traiter la somme (presque) infinie dans un laps de temps raisonnable, compilez avec les options suivantes pour certaines optimisations du compilateur (obligatoire):
Exemple de sortie:
la source
??/
astuce du trigraphe a depuis longtemps cessé d’être intelligente. :(Java
En théorie, cela va imprimer
true
. Cependant, je pense que mon ordinateur va s'effondrer avant la fin de son exécution.la source
-1/12
est en réalité égale à zéro. Donc, je suppose que c’est une sorte de comportement de débordement qui provoque la fin de la boucle et lesum
débordement à zéro par hasard ?long
. L'univers n'existera probablement plus d'ici là, mais ce n'est que théorique, n'est-ce pas? Et oui, les 32 bits du bassum
seront tous à zéro - c'est pourquoi il est importantsum
d'être unint
, pas unlong
. Bien sûr, comme @ace l'a dit, Java utilise la division entière pour évaluer-1/12
, donc zéro.Java
Comment ça fonctionne:
J'aimerais pouvoir poster ceci comme spoiler mais je ne peux pas comprendre comment. Voici le reste du code qui est caché discrètement.
la source
Aucune solution Haskell, inacceptable!
Nous pouvons utiliser les listes infinies de Haskell pour obtenir une réponse exacte!
Haskell:
La solution est assez simple lorsque vous prenez en compte les flèches ....
Alors, quel est le truc?
la source
C
Selon la norme C, cela pourrait très bien s’imprimer
Answer = -1/12
car il y aura un débordement d’entier signé qui constitue un comportement indéfini. Trouver un compilateur capable de le faire est laissé au lecteur comme un exercice.la source
printf
Mathematica
la source
Python 3.x
Un peu nouveau ici. Des conseils?
la source
JavaScript (ECMAScript 6)
Comment ça fonctionne:
1:
2:
3:
4:
la source
C ++
Si les deux
#define
s sont supprimés, le code sera toujours du code C ++ valide et essaiera réellement (mais bien sûr échouer) de calculer la somme de tous les entiers.Comment ça fonctionne:
Compte tenu du pseudocode des affiches, je n'ai pas pu résister à l'ajout de celui-ci. Il utilise la même base et une autre petite idée mais je ne pense pas que ce soit aussi élégant.
Comment ça fonctionne:
Et pourquoi vous ne devriez pas essayer de le lancer:
la source