Tło
Wszyscy znamy klasyczny dowód, który wygląda następująco:
A = B
a² = AB
a² - b² = AB - b²
(ab), (A + B) = b (ab),
(A + B) = b
b + b =
2b = B
2 = 1 (Ha!)
O Oczywiście błąd polega na tym, że nie można podzielić przez 0. Ponieważ a = b, a - b = 0, więc podział był ukryty przez 0.
Wyzwanie
Musisz powtórzyć ten dowód. Najpierw zadeklaruj dwie liczby całkowite a i b (nie ma znaczenia, jak je nazwiesz) równe. Następnie zadeklaruj aMod i bMod jako modyfikowalne wersje aib, początkowo równe odpowiednio aib. Musisz je pomnożyć przez a, a następnie odjąć b * b od obu. Musisz podzielić przez -b, a następnie podzielić przezb (lub a), aby uzyskać. Następnie wydrukuj aMod i bMod ze znakiem równości między nimi.
Podstępni
Oczywiście, ponieważ zadeklarowałeś aib równe, a - b = 0, a dzielenie przez 0 powoduje błąd. Musisz więc kreatywnie to sfałszować. Ponadto, ponieważ próbujesz odtworzyć dowód, wynik wszystkich operacji na aMod i bMod nie może być równy po wydrukowaniu. Nie muszą równać się dokładnie 2 i 1, tylko dwie liczby, które nie są równe.
Oto przykład:
#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;
}
Może nie najlepszy, ale ilustruje sens.
Bonus Underhanded
Zamiast drukować znak równości, możesz wydrukować tylko dwie zmienne (aMod i bMod), a następnie mieć kod, który wydaje się porównywać dwie zmienne pod kątem równości, ale w rzeczywistości leży, że są one równe (i drukuje jakąś formę true
).
Pamiętaj, że jest to konkurs popularności, więc wygrywa najwyższa liczba głosów pozytywnych.
Ponadto nowa wersja matematyki o nazwie Mathematics 2.0 wykorzystała standardowe luki automatyczne unieważniające dowód.
źródło
Odpowiedzi:
JavaScript
Wynik:
Zauważ, że 0/0 = NaN
Wskazówka
źródło
Python 2
Jestem prawie pewien, że to oczywiste, ponieważ wszyscy znają Python, ale oto moja próba:
Wyprowadza
True
.Wskazówka:
źródło
Rubin
ideone
Wskazówka:
Wyjaśnienie:
źródło
GolfScript
Ostrzeżenie: ten program trochę oszukuje, ponieważ nie drukuje aMod i bMod
Wypróbuj tutaj !
Więc co się dzieje?
źródło
Prolog
Dane wyjściowe po
areEqual(4,4)
wywołaniu (lub jakiejkolwiek innej parze liczb):Dlaczego?
źródło
JavaScript
Dane wyjściowe:
http://jsbin.com/furino/2/edit?js,out JsBin nie wydaje się być w stanie wykonać tego kodu. Zamiast tego użyj konsoli przeglądarki.
Dlaczego?
Kolejny kod JavaScript: nie jest dokładnie zgodny z regułami, wyświetla tylko wtedy, gdy zmienne są równe, czy nie.
Dlaczego?
źródło
NaN
nie jest równaNaN
specyfikacji pływaka IEEE. W rzeczywistości szybkim sposobem sprawdzenia, czy maszNaN
w C, jest porównanie go z samym sobą. Dotyczy to wszystkich języków, nie tylko JS.Fantom
Wynik:
Dlaczego?
źródło
a
równeb
na końcu.do
Błąd klasyczny dowodu wymaga nieporozumienia w klasycznej składni C. Niestety spotkałem programistów „tylko na wysokim poziomie”, którzy są przekonani, że C jest uszkodzony z powodu wyników podobnych do tego kodu. Jeśli wiesz, jak działa C, staje się to dość oczywiste, ale jeśli widziałeś kod i zakładałeś, że jest to inny język, może nie być.
Oczywiście nie działa to tak dobrze, gdy jest napisane bardziej idiomatycznie
#include <stdio.h>
i int jest rzucane przed deklaracjami.źródło