Chứng minh cổ điển Fallacy [đóng]


18

Bối cảnh

Vì vậy, tất cả chúng ta đều biết bằng chứng kinh điển diễn ra như sau:

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!)
Trong Tất nhiên, sai lầm là bạn không thể chia cho 0. Vì a = b, a - b = 0, do đó, có một phép chia ẩn cho 0.

Các thách thức

Bạn phải nhân rộng bằng chứng này. Đầu tiên, khai báo hai số nguyên a và b (không quan trọng bạn gọi chúng là gì) bằng nhau. Sau đó khai báo aMod và bMod là các phiên bản có thể sửa đổi của a và b và ban đầu bằng a và b, tương ứng. Bạn phải nhân cả hai với a, sau đó trừ b * b từ cả hai. Sau đó, bạn phải chia cho a - b và sau đó chia chúng cho b (hoặc a) để có được. Sau đó, in ra aMod và bMod với dấu bằng giữa chúng.

Đồ lót

Tất nhiên, vì bạn đã khai báo a và b bằng nhau, a - b = 0 và chia cho 0 gây ra lỗi. Vì vậy, bạn phải sáng tạo giả nó. Ngoài ra, vì bạn đang cố gắng sao chép bằng chứng, kết quả trên tất cả các thao tác trên aMod và bMod không được bằng nhau khi được in. Họ không phải bằng chính xác 2 và 1, chỉ hai số không bằng nhau.

Đây là một ví dụ:

#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;
}

Có thể không phải là tốt nhất, nhưng nó minh họa điểm.

Tiền thưởng

Thay vì in dấu bằng, bạn chỉ có thể in ra hai biến (aMod và bMod), sau đó có mã xuất hiện để so sánh hai biến cho đẳng thức nhưng thực tế nằm ở chỗ chúng bằng nhau (và in một số dạng true).

Hãy nhớ rằng, đây là một cuộc thi phổ biến, vì vậy số lượng người ủng hộ cao nhất sẽ giành chiến thắng.
Ngoài ra, một phiên bản mới của toán học có tên là Toán học 2.0 đã sử dụng các sơ hở tiêu chuẩn tự động làm mất hiệu lực một bằng chứng.


Đây là một liên kết Wikipedia về sai lầm toán học để mọi người có thể hiểu rõ hơn

3
Tôi đang bỏ phiếu để đóng câu hỏi này dưới dạng ngoài chủ đề vì các thử thách ngầm không còn thuộc chủ đề trên trang web này. meta.codegolf.stackexchange.com/a/8326/20469
mèo

Câu trả lời:


17

JavaScript

var a=3,b=3,a2=3,b2=3
[a2,b2]=[a2*a,b2*a]
[a2,b2]=[a2-b*b,b2-b*b]
[a2,b2]=[a2/(a-b),b2/(a-b)]
console.log([a2/a,b2/a])

Đầu ra:

[1, NaN]

Lưu ý rằng 0/0 = NaN

Dấu

Hãy thử thêm một số dấu chấm phẩy.
Chương trình này là thực sự var a=3,b=3,a2=3,b2=3[a2,b2]=...=[a2/(a-b),b2/(a-b)];console.log([a2/a,b2/a]).
Và NaN là [3/0,undefined/0]/3.


Ồ Điều đó rất thông minh, "vô tình" quên thêm dấu chấm phẩy làm cho (gần như) toàn bộ chương trình thành một câu chạy.
user155698

3

Con trăn 2

Tôi khá chắc chắn rằng mọi người đều biết Python, nhưng đây là nỗ lực của tôi:

a=b=1
x,y=a*a,a*b
x,y=x-b*b,y-b*b
x,y=a+b/a-b,b
x,y=x/a,y/a
print(x==y)

Nó đầu ra True.

Dấu:

Kiểm tra bộ phận của tôi.


vì mọi người đều sử dụng Python . Tôi biết trăn, nhưng tôi hiếm khi sử dụng nó
rpax

@rpax Đó là những gì tôi muốn nói.
mbomb007

Xin lỗi, tôi đã không đọc đúng câu trả lời của bạn.
rpax

2

Hồng ngọc

def calculate a,
  b = a
  left, right = a, b
  left, right = [left, right].map { |x| x * a     }
  left, right = [left, right].map { |x| x - b*b   }
  left, right = [left, right].map { |x| x / a - b }
  left, right = [left, right].map { |x| x / b     }
  puts $/=[left, right].join(' = ')
end

calculate 3,
STDOUT.write($/)

thần tượng

Dấu:

,

Giải trình:

Hai dòng kết thúc bằng dấu phẩy khiến chương trình hoạt động khác với nó. Không có dấu phẩy, phương thức lấy một đối số duy nhất a, đặt bbằng a, thực hiện các phép biến đổi từ chứng minh trên mỗi một (trừ một số dấu ngoặc đơn bị thiếu, nó không chia cho 0) và đưa ra kết quả (Với đầu vào là 3 , nó sẽ xuất ra "-1 = -1". Tuy nhiên, với dấu phẩy kéo dài, b = adòng trở thành một phần của chữ ký phương thức, nghĩa là nó khai báo một đối số thứ hai có giá trị mặc định. Lời gọi phương thức ở cuối truyền vào kết quả STDOUT.write($/)là 1 (số byte được ghi vào STDOUT, do $/được xác định trước thành ký tự dòng mới.) Vì vậy, a là 3 và b là 1, dẫn đến phương trình bắt đầu là "3 = 1". rác ra ngoài.


Thủ thuật tốt đẹp với dòng mới của bạn.
LegionMammal978

Bạn có thể thêm một lời giải thích cho những người không phải là Ruby?
kirbyfan64sos

@ kirbyfan64sos Chắc chắn rồi, xong rồi.
lịch sử

2

GolfScript

Cảnh báo: chương trình này gian lận một chút, vì nó không in aMod và bMod

1nt main(){
  int a = 2, b = 2;
  int aMod,bMod;
//The next line should throw and error, but why doesn't it??/
  aMod = (a*a - b*b) / (a-b);
//The next line should throw and error, but why doesn't it??/
  bMod = (b*a - b*b) / (a-b);
//The if should fail, but it works??/
  if(aMod == bMod)
    printf("1");
  return 0;
};

Hãy thử nó ở đây !

Vì vậy những gì đang xảy ra?

Điều đầu tiên bạn có thể nhận thấy là "những bức tượng bị cấm". Nhưng hãy nhớ, đây là GolfScript chứ không phải C! Ngoài ra, có lẽ nhận thấy rằng nó không thực sự nói "int main ()", nó nói "1nt main ()". Trong GolfScript, "1" có nghĩa là đẩy 1 lên ngăn xếp và "nt main" được xử lý như hai biến chưa được khởi tạo, không làm gì cả. Hai dấu ngoặc đơn trước tiên thêm 1 vào số trên cùng của ngăn xếp, sau đó trừ đi một, về cơ bản là tự hủy. Dấu ngoặc biểu thị một khối được đẩy lên ngăn xếp, và sau đó dấu chấm phẩy bật ra ngay lập tức. Vì vậy, cuối cùng, chúng ta chỉ có "1" ban đầu được đẩy lên và vào cuối chương trình GolfScript, ngăn xếp được in. Câu trả lời này được lấy cảm hứng từ điều này .


Phát hiện ra. Kích hoạt hệ thống -1 tự động. Lỗi: -1 không thành công (4792, RPLS)
Máy

Điều này là lén lút, bởi vì nó lừa bạn nghĩ rằng nó thất bại để lừa bạn. +1
Rɪᴋᴇʀ 20/03/2016

1

Prolog

areEqual(A, B) :-
    Amod = A,
    Bmod = B,

    Amod = Amod * A,
    Bmod = Bmod * B,

    Amod = Amod - B*B,
    Bmod = Bmod - B*B,

    Amod = Amod / (A-B),
    Bmod = Bmod / (A-B),

    Amod = Amod / A,
    Bmod = Bmod / A,

    Amod == Bmod.

Đầu ra khi areEqual(4,4)được gọi (hoặc bất kỳ cặp số nào khác thực sự):

false

Tại sao?

Trong Prolog, toán tử "=" không ảnh hưởng; đó là "Hợp nhất". Do đó Amod = Amod * Athất bại vì Amodđã được hợp nhất với A, và do đó không thể thống nhất với Amod * A. Prolog sau đó lập tức dừng thực thi quy tắc hiện tại và trả về false.


2
Tôi nghĩ rằng nó phải là cách khác, bạn phải xuất ra "true" khi hai giá trị này khác nhau, không phải "false" khi chúng bằng nhau ^^ '
Katenkyo

1

JavaScript

//Very badly written code!
//No! It is "poetic" code!
while(true){break;}{ 
let scrollMaxX = 3, screenX = 3;
var scrollBarWithBeerMax = scrollMaxX, Yscroll = screenX; for(var i = 0; i<1; i++){}}

scrollBarWithBeerMax *= scrollMaxX;
Yscroll *= screenX;

scrollBarWithBeerMax -= screenX * screenX;
Yscroll -= screenX * screenX;

scrollBarWithBeerMax /= (scrollMaxX - screenX);
Yscroll /= (scrollMaxX - screenX);

alert(scrollBarWithBeerMax + ' = ' + Yscroll);

Đầu ra:
http://jsbin.com/furino/2/edit?js,output JsBin dường như không thể thực thi mã này. Sử dụng bảng điều khiển trình duyệt thay thế.

Tại sao?

scrollMaxX và screenX là các biến đã có sẵn. Chúng được tích hợp trong trình duyệt. Do đó, kết quả có thể thay đổi. Các từ khóa let chỉ tạm thời thay đổi giá trị của họ.

Một JavaScript khác: Nó không tuân theo chính xác các quy tắc, nó chỉ xuất ra nếu các biến có bằng nhau hay không.

var a = 2;
var b = 2;

var a_duplicate = a;
var b_duplicate = b;

a_duplicate*=a
b_duplicate*=b;

a_duplicate-=b*b;
b_duplicate-=b*b;

a_duplicate/=(a-b);
b_duplicate/=(a-b);

alert(a_duplicate==b_duplicate);

Tại sao?

NaN không bằng NaN bởi thông số kỹ thuật float của IEEE. Cảm ơn Alex Van Liew đã chỉ ra rằng điều này không chỉ áp dụng cho Javascript.


NaNkhông bằng NaNthông số kỹ thuật của float float. Trong thực tế, một cách nhanh chóng để kiểm tra nếu bạn có điểm NaNC là so sánh nó với chính nó. Vì vậy, điều này áp dụng cho tất cả các ngôn ngữ, không chỉ JS.
Alex Van Liew

1
@AlexVanLiew Thú vị. Tôi không biết điều đó! Ok, thay đổi câu trả lời của tôi một chút và thêm tín dụng khi đến hạn.
Stefnotch

0

Tưởng tượng

a := 3
b := 3
duplicates := [a:b]
duplicates = duplicates.map {it * a}
duplicates = duplicates.map {it - b*b}
duplicates = duplicates.map {it / a-b}
echo(duplicates.join("") |Int a_2, Int b_2 ->Str| {"" +  a_2 + " = " + b_2})

Đầu ra:

-3 = 3

Tại sao?

[a: b] là bản đồ, không phải danh sách. Không lén lút như vậy, tôi biết :(


Bạn được cho là có a bằng b ở cuối.
mbomb007

Kết thúc của sai lầm ban đầu là 2 = 1, vì vậy kết thúc của bất kỳ câu trả lời nào ở đây không nên là "đúng"
Cain

Tôi đã nghĩ đến TIỀN THƯỞNG. Đừng bận tâm. "Thay vì in dấu bằng, bạn chỉ có thể in ra hai biến (aMod và bMod), sau đó có mã xuất hiện để so sánh hai biến cho đẳng thức nhưng thực tế nằm ở chỗ chúng bằng nhau (và in một số dạng đúng) . "
mbomb007

0

C

Sai lầm chứng minh cổ điển đòi hỏi sự hiểu lầm cú pháp C cổ điển. Đáng buồn thay, tôi đã gặp một số nhà phát triển "chỉ cấp cao", người tin rằng C bị hỏng vì kết quả tương tự như mã này. Nếu bạn biết cách C hoạt động thì nó trở nên khá rõ ràng, nhưng nếu bạn thấy mã và cho rằng đó là một ngôn ngữ khác, thì có thể không phải vậy.

a,b,LHS,RHS;
main(){
    a=2; b=2;
    LHS=a; RHS=b;

    //multiply both sides by a
    LHS,RHS *= a; 
    //subtract b squared from both sides
    LHS,RHS -= b*b; 
    //assert that it factors correctly
    if (LHS,RHS != (a+b)*(a-b), b*(a-b)) printf("ERROR!\n");
    //'hard' division, just to be sure the compiler doesn't remove it
    LHS,RHS /=! (a-b);
    //assert that a+a really is b+b
    if (a+a != b+b) printf("ERROR!\n");
    //now just divide them by b
    printf("%d = %d ? ", LHS/b, RHS/b);
    if (RHS = LHS) 
        printf("true!");
    else
        printf("false!");
}

Tất nhiên nó không hoạt động tốt khi được viết một cách thành ngữ hơn #include <stdio.h>và int được ném trước các tuyên bố.


Làm thế nào nó hoạt động mặc dù?
Máy

Đầu tiên lưu ý rằng trong c nếu bạn 'quên' int trong một khai báo, nó giả sử kiểu int để tương thích ngược với k & r c. Tiếp theo tra cứu, toán tử trong c và chú ý đến quyền ưu tiên của nó. Tiếp theo lưu ý = thay vì == trong câu lệnh if cuối cùng.
LambdaBeta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.