L'arrière-plan
Donc, nous connaissons tous la preuve classique qui va comme ceci:
a = b
a² = ab
a² - b² = ab - b²
(ab) (a + b) = b (ab)
(a + b) = b
b + b = b
2b = b
2 = 1 (Ha ha!)
de bien sûr, l'erreur est que vous ne pouvez pas diviser par 0. Puisque a = b, a - b = 0, il y avait donc une division cachée par 0.
Le défi
Vous devez reproduire cette preuve. Tout d'abord, déclarez deux entiers a et b (peu importe comment vous les appelez) égaux. Déclarez ensuite aMod et bMod comme étant des versions modifiables de a et b et initialement égales à a et b, respectivement. Vous devez les multiplier tous les deux par a, puis soustraire b * b des deux. Vous devez ensuite diviser par a - b puis les diviser par b (ou a) pour obtenir. Ensuite, imprimez aMod et bMod avec un signe égal entre eux.
Les sournois
Bien sûr, puisque vous avez déclaré a et b égaux, a - b = 0 et la division par 0 provoque une erreur. Vous devez donc le simuler de manière créative. De plus, comme vous essayez de répliquer la preuve, le résultat de toutes les opérations sur aMod et bMod ne doit pas être égal lors de l'impression. Ils ne doivent pas nécessairement correspondre exactement à 2 et 1, juste deux nombres qui ne sont pas égaux.
Voici un exemple:
#include <iostream>
#define subtract(a, b) a - b
using namespace std;
int main()
{
int a = 4, b = 4;
int a_2 = a, b_2 = b;
a_2 *= a;
b_2 *= b;
a_2 -= b * b;
b_2 -= b * b;
a_2 = a_2 / subtract(a, b);
b_2 = b_2 / subtract(-b, -a); // a - b == (-b) - (-a)
a_2 /= a;
b_2 /= a;
cout << a_2 << " = " << b_2 << " because I did the same operations on both of them.";
return 0;
}
Peut-être pas le meilleur, mais il illustre le point.
Bonus sournois
Au lieu d'imprimer le signe égal, vous pouvez imprimer uniquement les deux variables (aMod et bMod), puis avoir un code qui semble comparer les deux variables pour l'égalité mais en réalité se trouve qu'elles sont égales (et imprime une certaine forme de true
).
N'oubliez pas qu'il s'agit d'un concours de popularité, donc le plus grand nombre de votes positifs l'emporte.
De plus, une nouvelle version des mathématiques appelée Mathématiques 2.0 a utilisé des failles standard pour invalider automatiquement une preuve.
la source
Réponses:
Javascript
Production:
Notez que 0/0 = NaN
Allusion
la source
Python 2
Je suis sûr que c'est évident car tout le monde connaît Python, mais voici ma tentative:
Il sort
True
.Allusion:
la source
Rubis
ideone
Allusion:
Explication:
la source
GolfScript
Attention: ce programme triche un peu, en ce qu'il n'imprime pas aMod et bMod
Essayez-le ici !
Alors que se passe-t-il?
la source
Prolog
La sortie quand
areEqual(4,4)
est appelée (ou tout autre couple vraiment):Pourquoi?
la source
Javascript
Sortie:
http://jsbin.com/furino/2/edit?js,output JsBin ne semble pas pouvoir exécuter ce code. Utilisez plutôt la console du navigateur.
Pourquoi?
Un autre JavaScript: il ne suit pas exactement les règles, il ne sort que si les variables sont égales ou non.
Pourquoi?
la source
NaN
n'est pas égal auxNaN
spécifications du flottant IEEE. En fait, un moyen rapide de tester si vous avez unNaN
in C est de le comparer avec lui-même. Cela s'applique donc à toutes les langues, pas seulement à JS.Fantom
Production:
Pourquoi?
la source
a
égalb
à la fin.C
L'erreur de preuve classique nécessite un malentendu de la syntaxe C classique. Malheureusement, j'ai rencontré des développeurs "de haut niveau uniquement" qui sont convaincus que C est cassé à cause de résultats similaires à ce code. Si vous savez comment C fonctionne, cela devient assez évident, mais si vous avez vu le code et supposé qu'il s'agissait d'un langage différent, il se peut que ce ne soit pas le cas.
Bien sûr, cela ne fonctionne pas aussi bien lorsqu'il est écrit de manière plus idiomatique avec des
#include <stdio.h>
int et placés devant les déclarations.la source