Khi nào (x == x + 2)? [đóng cửa]


90

Thách thức: Xác định xtheo cách mà biểu thức (x == x+2)sẽ đánh giá là đúng.

Tôi đã gắn thẻ câu hỏi bằng C, nhưng câu trả lời bằng các ngôn ngữ khác đều được chào đón, miễn là chúng sáng tạo hoặc làm nổi bật một khía cạnh thú vị của ngôn ngữ.

Tôi dự định chấp nhận giải pháp C, nhưng các ngôn ngữ khác có thể nhận được phiếu bầu của tôi.

  1. Đúng - hoạt động trên các triển khai tuân thủ tiêu chuẩn. Ngoại lệ - giả sử triển khai các loại cơ bản, nếu đó là cách triển khai phổ biến (ví dụ: giả sử intlà bổ sung 32 bit 2) là OK.
  2. Đơn giản - nên nhỏ, sử dụng các tính năng ngôn ngữ cơ bản.
  3. Thú vị - đó là chủ quan, tôi thừa nhận. Tôi có một số ví dụ cho những gì tôi cho là thú vị, nhưng tôi không muốn đưa ra gợi ý. Cập nhật : Tránh tiền xử lý là thú vị.
  4. Nhanh chóng - Câu trả lời tốt đầu tiên sẽ được chấp nhận.

Sau khi nhận được 60 câu trả lời (tôi không bao giờ mong đợi như vậy), có thể tốt để tóm tắt chúng.

60 câu trả lời chia thành 7 nhóm, 3 trong số đó có thể được thực hiện bằng C, phần còn lại bằng các ngôn ngữ khác:

  1. Bộ tiền xử lý C. #define x 2|0đã được đề xuất, nhưng có nhiều khả năng khác.
  2. Điểm nổi. Số lượng lớn, vô cùng hoặc NaN đều hoạt động.
  3. Con trỏ số học. Một con trỏ tới một cấu trúc khổng lồ gây ra thêm 2 để bao quanh.

    Phần còn lại không hoạt động với C:

  4. Quá tải toán tử - A +không thêm hoặc a ==luôn trả về giá trị true.
  5. Thực hiện xmột cuộc gọi chức năng (một số ngôn ngữ cho phép nó mà không cần x()cú pháp). Sau đó, nó có thể trả lại một cái gì đó mỗi lần.
  6. Một kiểu dữ liệu một bit. Sau đó x == x+2 (mod 2).
  7. Thay đổi 2- một số ngôn ngữ cho phép bạn gán 0cho nó.

29
Tại sao 4. Quick? Bạn có nghĩa là "Bất cứ ai biết một và đủ may mắn để đọc câu hỏi này đầu tiên"?
Luc

6
@ugoren Hãy để cộng đồng bỏ phiếu (và tự bầu cho những người bạn thích), sau đó chọn câu trả lời hàng đầu sau 7 ngày hoặc lâu hơn :)
Luc

3
Về khả năng 2: NaN không hoạt động. NaN + 2 lại là NaN, nhưng NaN == NaN là sai.
Martin B

2
Giải pháp Scala, trong đó x là Tập hợp chứa '2' và + có nghĩa là add to Setthư viện chuẩn, mà không xác định lại +chính mình, không phù hợp với 7 danh mục này, IMHO.
người dùng không xác định

2
Tại sao câu hỏi này và tất cả các câu trả lời Community Wiki?
mbomb007

Câu trả lời:


71
main()
{
double x=1.0/0.0;
printf("%d",x==x+2);
}

Đầu ra 1.

Liên kết: http://ideone.com/dL6A5


7
float x=1./0là một chút ngắn hơn và có lẽ thanh lịch hơn. Nhưng dù sao, đây chắc chắn là câu trả lời tốt đầu tiên.
ugoren

1
Ahh tốt chia cũ bằng không. Điều đó khiến tôi mất nhiều thời gian để tìm ra hơn là tôi muốn thừa nhận. haha
Cấp

Argh, tôi cũng mặc dù vậy, nhưng trên Windows không được biên dịch nên tôi đã bỏ nó. :( +1 mặc dù
Tudor

x = 1e999 là một cách khác để làm điều này.
shiona

4
@shiona float x=1e20là đủ
l0n3sh4rk

125

Pháo đài IV:

2=0

Sau đó, mỗi hằng số 2 trong chương trình bằng không. Tin tôi đi, tôi đã làm điều này (ok, 25 năm trước)


23
Tất cả lý do nhiều hơn để tôi không bao giờ chạm vào Fortran.
C0deH4cker

3
Nó ít nhất ném một cảnh báo?
Michael Stern

15
@MichaelStern CẢNH BÁO: BẠN ĐANG THAY ĐỔI GIÁ TRỊ CỦA 2!
Cruncher

100

Điều này dường như làm việc:

#define x 2|0

Về cơ bản, biểu thức được mở rộng đến (2|0 == 2|(0+2)). Đó là một ví dụ tốt về lý do tại sao người ta nên sử dụng dấu ngoặc đơn khi xác định macro.


3
Chắc chắn hoạt động, và tôi nghĩ đó là giải pháp dựa trên tiền xử lý thanh lịch nhất. Nhưng tôi nghĩ làm điều đó mà không có người tiền sản xuất thì thú vị hơn.
ugoren

Là nó chỉ cho tôi hay nên 2|(0+2)được 1?
phunehehe

1
@phunehehe: |bit OR HOẶC ; ||là logic HOẶC.
Vui lòng khởi động

20
Điều này bằng cách nào đó làm tôi nhớ đến Bobby Bảng nhỏ.
vsz

1
@rakeshNS: Tôi đã thêm bộ dấu ngoặc đơn bổ sung để hiển thị quyền ưu tiên của toán tử . Đó là lý do tại sao tôi nói "Về cơ bản".
Vui lòng khởi động

79

Brainfuck

x

Điều này tất nhiên kéo dài "đánh giá thành đúng" một chút, bởi vì trong Brainfuck không có gì thực sự đánh giá bất cứ điều gì - bạn chỉ thao tác một cuộn băng. Nhưng nếu bây giờ bạn thêm biểu thức của bạn

x
(x == x+2)

chương trình tương đương với

+

(bởi vì tất cả mọi thứ nhưng <>+-[],.là một nhận xét). Mà không làm gì ngoài việc tăng giá trị nơi chúng ta đang ở. Băng được khởi tạo với tất cả các số không, vì vậy chúng tôi kết thúc bằng 1 trên vị trí con trỏ, có nghĩa là "đúng": nếu bây giờ chúng tôi bắt đầu một phần có điều kiện [], nó sẽ nhập / lặp.


12
+1 Phải là sự uốn cong sáng tạo nhất của các quy tắc.
ninjalj

3
Tại sao bạn cần x?
James

3
@James Câu hỏi nói để xác định xvì vậy ở đây xđược định nghĩa là x.
dùng80551

1
@James câu trả lời không có needgì ngoại trừ+
Cruncher

56

ĐỤ#

let (==) _ _ = true
let x = 0
x == (x + 2) //true

13
Tôi thích cái này. Thay vì tung hứng các con số, chỉ cần xác định lại ý nghĩa của ==
evilcandybag

4
Đợi đã, không phải là toán tử đẳng thức trong F # đơn giản =sao? ==thậm chí không được xác định theo mặc định.
Jwosty

50

C

int main() { float x = 1e10; printf("%d\n", x == x + 2); }

Lưu ý: có thể không hoạt động nếu FLT_EVAL_METHOD != 0(xem bình luận bên dưới).


24
+1 cho các ứng dụng trong thế giới thực. Quá nhiều người không hiểu toán học dấu phẩy động.
Tim S.

1
@ mbomb007: Tôi nghĩ rằng chúng khác nhau - câu trả lời bạn liên kết dựa vào INF + 2 == INF, trong khi câu trả lời của tôi sử dụng một số float chính xác duy nhất đủ lớn để 2 nhỏ hơn một ULP.
Paul R

2
@ mbomb007: Tôi cũng nghĩ chúng rất khác nhau - ∞ + 2 = ∞là điều ai cũng có thể hiểu và không phụ thuộc vào bất cứ thứ gì cụ thể của máy tính, trong khi thêm 2 vào một con số cụ thể và nó không có tác dụng gì đáng ngạc nhiên và cụ thể hơn với độ chính xác hạn chế của máy tính và thú vị hơn IMHO
GoatInTheMachine

1
Điều này có thể dễ dàng thất bại khi FLT_EVAL_METHOD == 1toán học được thực hiện như double. Đề xuất giá trị FP lớn hơn chắc chắn vượt quá long doubleđộ chính xác như1.0e37f
chux

1
@chux: cảm ơn vì đã xác nhận - đó chắc chắn là điều tôi có thể cần để ý trong tương lai, vì phần lớn mã của tôi cuối cùng là đa nền tảng.
Paul R

36

C #

class T {
  static int _x;
  static int X { get { return _x -= 2; } }

  static void Main() { Console.WriteLine(X == X + 2); }
}

Không phải là một shortie, nhưng hơi thanh lịch.

http://ideone.com/x56Ul


4
Xin chào, vừa nhận được huy hiệu 'Câu trả lời hay' cho bài đăng này. Nghiêm túc mà nói, nhận huy hiệu cho công cụ EVIL?! Đừng làm điều này ở nhà !
fjdumont

Thật là xấu xa, nhưng nó thật đẹp ...
Kevin

32

Scala: { val x = Set(2); (x == x + 2) }


Haskell: Xác định / 2ℤ trên Booleans:

instance Num Bool where
    (+) = (/=)
    (-) = (+)
    (*) = (&&)
    negate = id
    abs    = id
    signum = id
    fromInteger = odd

sau đó cho bất kỳ x :: Boolchúng ta sẽ có x == x + 2.

Cập nhật: Cảm ơn các ý tưởng trong bình luận, tôi đã cập nhật ví dụ cho phù hợp.


3
Bạn có thể đơn giản hóa:fromInteger = odd
Rotsor

1
Cũng (+)có thể được định nghĩa như (/=)tôi tin.
MatrixFrog

2
Giải pháp ngắn hơn sẽ là một ví dụ cho ().
Thomas Eding

31

Con trăn

class X(int):__add__=lambda*y:0
x=X()

# Then (x == x+2) == True

Đẹp. Tất cả các ngôn ngữ hỗ trợ quá tải toán tử có thể sử dụng các giải pháp tương tự, nhưng C không phải là một trong số các ngôn ngữ đó.
ugoren

Cũng hoạt động với quá tải __cmp__như class X(int):__cmp__=lambda*x:0(hoặc __eq__mặc dù hơi lâu hơnclass X(int):__eq__=lambda*x:True
dr jimbob

Một vài ký tự ngắn hơn nếu bạn không kéo dài từ int ..class X:__add__=lambda s,o:s
Doboy

Tôi có thể hỏi phép nhân đó làm gì không?
xem

2
@TheRare nó không thực sự nhân. Vì __add__thường được đưa ra nhiều đối số ( lambda x,y:), tôi lưu một số ký tự bằng cách sử dụng * để đóng gói tất cả các đối số thành một tuple ( lambda *y:). Xem tài liệu để biết thêm.
grc

31

GNU C hỗ trợ các cấu trúc không có thành viên và kích thước 0:

struct {} *x = 0;

2
Rất đẹp! Tôi đã nghĩ về số học con trỏ với dữ liệu rất lớn dẫn đến sự bao bọc, nhưng không nghĩ ngược lại.
ugoren

26

PHP:

$x = true;
var_dump($x == $x+2);

Hoặc là:

var_dump(!($x==$x+2));

Đầu ra:

bool (đúng)


1
Tôi đã thực sự cố gắng đưa ra câu trả lời PHP đơn giản chết người này, nhưng bạn đã đánh bại tôi.
Vui lòng khởi động

25

Đó là một quan niệm sai lầm phổ biến rằng trong C, khoảng trắng không thành vấn đề. Tôi không thể tưởng tượng ai đó đã không nghĩ ra điều này trong GNU C:

#include <stdio.h>
#define CAT_IMPL(c, d) (c ## d)
#define CAT(c, d) CAT_IMPL(c, d)
#define x CAT(a, __LINE__)

int main()
{
    int a9 = 2, a10 = 0;
    printf("%d\n", x ==
        x + 2);
    return 0;
}

In 1.


Đẹp, mặc dù có lẽ không hợp lệ về mặt kỹ thuật ( x == x+2vẫn là sai). Nhưng một khi bạn đưa ra ý tưởng, tôi nghĩ #define x -2*__LINE__là thanh lịch hơn.
ugoren

3
@ugoren cảm ơn! Nếu bạn muốn tất cả điều này nằm trên một dòng, hãy sử dụng COUNTER thay vì LINE - yêu cầu GCC 4.3+.
H2CO3

1
_CATlà định danh dành riêng. Bất cứ điều gì bắt đầu bằng dấu gạch dưới và chữ in hoa được dành riêng trong C.
Konrad Borowski

@xfix hoàn toàn chính xác, được cập nhật để xóa UB.
H2CO3

20

C

Thật thú vị hơn khi không sử dụng macro và không lạm dụng vô hạn.

/////////////////////////////////////
// At the beginning                 /
// We assume truth!                 /

int truth = 1;
int x = 42;

/////////////////////////////////////
// Can the truth really be changed??/
truth = (x == x + 2);

/////////////////////////////////////
// The truth cannot be changed!     /
printf("%d",truth);

Hãy thử nếu bạn không tin!


1
0. Không, vẫn không tin.
MSalters

@MSalters: Bạn sử dụng trình biên dịch nào? Bạn có thể bị vô hiệu hóa.
vsz

VS2010. Theo mặc định, có thể các bộ ba bị vô hiệu hóa. Điều đó hoặc nối dòng không hoạt động với??\
MSalters

MSalters: bộ ba ??\ sẽ được chuyển đổi thành một \ , vì vậy không có ??\ . Tuy nhiên, một số trình biên dịch hiện đại đưa ra các cảnh báo theo mặc định cho cả hai phần ba và nối dòng ngay cả khi được bật.
vsz

18

Toán học:

x /: x + 2 := x
x == x + 2

Tôi nghĩ rằng giải pháp này là cuốn tiểu thuyết vì nó sử dụng Mathematica của khái niệm về giá trị Up.

BIÊN TẬP:

Tôi đang mở rộng câu trả lời của mình để giải thích ý nghĩa của Up Values ​​trong Mathicala .

Dòng đầu tiên về cơ bản xác định lại bổ sung cho biểu tượng x. Tôi có thể trực tiếp lưu trữ như một định nghĩa trong hàm toàn cầu được liên kết với các +biểu tượng, nhưng là một sự tái định nghĩa như vậy sẽ nguy hiểm vì các định nghĩa lại có thể tuyên truyền thất thường qua Mathematica của thuật toán tích hợp.

Thay vào đó, bằng cách sử dụng thẻ x/:, tôi liên kết định nghĩa với biểu tượng x. Bây giờ, bất cứ khi nào Mathicala nhìn thấy biểu tượng x, nó sẽ kiểm tra xem liệu nó có được vận hành bởi toán tử cộng +trong một mẫu có dạng x + 2 + ___biểu tượng trong đó biểu tượng ___có nghĩa là một chuỗi null có thể có của các ký hiệu khác hay không.

Định nghĩa lại này rất cụ thể và sử dụng các khả năng khớp mẫu mở rộng của Mathistica. Ví dụ, biểu thức x+y+2trả về x+y, nhưng biểu thức x+3trả về x+3; bởi vì trong trường hợp trước, mẫu có thể được khớp, nhưng trong trường hợp sau, mẫu không thể được khớp mà không cần đơn giản hóa thêm.


1
Tôi nghĩ bạn nên giải thích những gì nó làm. Hầu hết mọi người không biết Mathicala (hoặc Up Values ​​là gì).
ugoren

1
Cảm ơn bạn @ugoren, tôi dành phần lớn thời gian của mình trên trang web Trao đổi ngăn xếp Mathicala, vì vậy tôi đã quên giải thích điều gì làm cho ví dụ của tôi có ý nghĩa. Tôi đã thực hiện một chỉnh sửa giải thích khái niệm này một cách chính xác nhất có thể.
Carl Morris

17

Javascript:

var x = 99999999999999999;
alert(x == x+2);​

Kiểm tra Fiddle


2
Bạn có thể sử dụng Infinity, hoặc -Infinity, và vì điều này, bạn có thể sử dụng phím tắt của x = 1/0.
zzzzBov

6
@zzzzBov: Đó chắc chắn là một golf mã tốt hơn. Tôi đã chọn (99999999999999999 == 99999999999999999+2)bởi vì tôi nghĩ nó thú vị hơn một chút (Infinity == Infinity+2), mặc dù như OP nói, "nó chủ quan" :)
Briguy37

Đây là trường hợp thực tế duy nhất mà tôi thấy một tấm séc như thế này vì một lý do chính đáng (bên cạnh câu đố lập trình): Một chức năng giảng viên (dựa trên float) đang kiểm tra đầu vào của nó quá tuyệt vời để được đếm ngược -1và đệ quy . Bản thân ngôn ngữ là Python, nhưng điều đó không thực sự quan trọng trong trường hợp này.
Alfe

5
@NicoBurns không ture :(
ajax333221

2
@NicoBurns, chạy mã đó trong bảng điều khiển tạo ra false; bất cứ nơi nào bạn nhận được thông tin đó trên JS đều sai và không đáng tin cậy.
zzzzBov

17

kế hoạch

(define == =)
(define (x a b c d) #t)
(x == x + 2)
;=> #t

Đẹp. Lược đồ (x == x + 2)trông giống như của C, nhưng có nghĩa là một điều hoàn toàn khác.
ugoren

1
Bây giờ làm điều đó cho (= x 2).
Joe Z.

(define (x a b c d) #t):)
Cruncher

@ugoren điều này được xác định để làm điều này bởi chương trình này. x chỉ đơn giản là tên của một hàm ở đây. Và như vậy là ==
Cruncher

16

Câu trả lời rõ ràng:

Khi điều này chấm dứt:

while (x != x+2) { }
printf("Now");

1
+1 meta.codegolf.stackexchange.com/a/1070/8766 nhưng điều này thực sự khéo léo.
dùng80551

1
Tôi nghĩ rằng while(!(x == x+2)) {}sẽ có tinh thần nhiều hơn
Cruncher

Câu trả lời này có trước bài đăng meta với hai năm. Tất cả mọi thứ được coi là sáo rỗng ngày nay là tiểu thuyết tại một số điểm.
daniero

16

Đây là một giải pháp cho JavaScript không khai thác Infinity-Infinitycác trường hợp cạnh của phép cộng dấu phẩy động. Điều này không hoạt động trong Internet Explorer 8 trở xuống cũng như trong chế độ nghiêm ngặt chọn tham gia ES5. Tôi sẽ không gọi các withtuyên bố và getters đặc biệt là các tính năng "nâng cao".

with ({ $: 0, get x() {return 2 * this.$--;} }) {
    console.log(x == x+2);
}

Chỉnh sửa để thêm: Thủ thuật trên cũng có thể thực hiện mà không cần sử dụng withget, như Andy E đã lưu ý trong Mẹo chơi golf trong JavaScript và cũng bởi jncraton trên trang này:

var x = { $: 0, valueOf: function(){return 2 * x.$++;} };
console.log(x == x+2);

Một khái niệm hay - thực hiện xmột cuộc gọi hàm, mặc dù nó trông giống như một biến đọc. Tôi giả sử thứ tự đánh giá từ trái sang phải, nhưng không sao vì nó được chỉ định trong JS (không giống như C).
ugoren

14

Dưới đây không phải là tiêu chuẩn C tuân thủ , nhưng sẽ hoạt động trên bất kỳ nền tảng 64 bit nào:

int (*x)[0x2000000000000000];

Tuyệt vời về nguyên tắc, nhưng dường như được thực hiện sai. xsẽ được tăng lên trong các bước của 2 ^ 61, vì vậy x + 8sẽ bằng nhau x.
ugoren

@ugoren, nó hoạt động với tôi, trên Linux với 4 byte int.
han

Bạn hoàn toàn đúng. Tôi đã bỏ lỡ thực tế rằng đó là một mảng int, không phải char.
ugoren

10

Hiền nhân:

x=Mod(0,2)
x==x+2

trả về True

Nói chung cho GF (2 ** n), luôn luôn đúng x = x + 2 với mọi x

Đây không phải là một lỗi hoặc một vấn đề với tràn hoặc vô cùng, nó thực sự chính xác


1
Thủ thuật tương tự hoạt động với PARI / GP
Hagen von Eitzen

10

Lisp thường gặp

* (defmacro x (&rest r) t)
X
* (x == x+2)
T

Nó khá dễ dàng khi xkhông phải là một giá trị thực tế.


8

APL (Dyalog)

X←1e15
X=X+2

APL thậm chí không có vô cực, chỉ là những chiếc phao không đủ chính xác để nói lên sự khác biệt giữa 1.000.000.000.000.0001.000.000.000.000.002. Theo tôi biết, đây là cách duy nhất để làm điều này trong APL.


Tôi thực sự thích điều này bởi vì đó là câu trả lời đầu tiên để khai thác độ chính xác của float.
AndrewKS

1
@AndrewKS: Thật ra Paul R đã sớm hơn một chút.
MSalters

8

Perl 6

Tôi ngạc nhiên khi không thấy giải pháp này trước đây. Dù sao, giải pháp là - nếu x02cùng một lúc? my \xtrong ví dụ này khai báo biến sigilless - câu hỏi này hỏi về x, không phải kiểu Perl $x. Các ?? !!nhà điều hành ternary.

$ perl6 -e 'my \x = 0|2; say x == x + 2 ?? "YES" !! "NO"'
YES

Nhưng...

$ perl6 -e 'my \x = 0|2; say x == x + 3 ?? "YES" !! "NO"'
NO

xlà nhiều giá trị cùng một lúc. xbằng 02cùng một lúc. x + 2bằng 24cùng một lúc. Vì vậy, về mặt logic, chúng bằng nhau.


8

Python 2.X (Sử dụng xác định lại số nguyên (được lưu trong bộ nhớ cache))

Tôi đã nhận thấy tất cả các câu trả lời python đã xác định các lớp xác định lại +toán tử. Tôi sẽ trả lời bằng một minh chứng thậm chí ở mức độ thấp hơn về tính linh hoạt của trăn. (Đây là đoạn mã dành riêng cho python2)

Trong python, số nguyên được lưu trữ ít nhiều theo cách này trong C:

typedef struct {            // NOTE: Macros have been expanded
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
    long ob_ival;
} PyIntObject;

Đó là, một cấu trúc với một size_t, void *longđối tượng, theo thứ tự đó.
Khi chúng ta sử dụng và do đó lưu trữ một số nguyên, chúng ta có thể sử dụng ctypesmô-đun của python để xác định lại số nguyên đó, để không chỉ có x == x+2mà còn2 == 0

import ctypes
two = 2 # This will help us access the address of "2" so that we may change the value

# Recall that the object value is the third variable in the struct. Therefore,
# to change the value, we must offset the address we use by the "sizeof" a 
# size_t and a void pointer
offset = ctypes.sizeof(ctypes.c_size_t) + ctypes.sizeof(ctypes.c_voidp)

# Now we access the ob_ival by creating a C-int from the address of 
# our "two" variable, offset by our offset value.
# Note that id(variable) returns the address of the variable.
ob_ival = ctypes.c_int.from_address(id(two)+offset)

#Now we change the value at that address by changing the value of our int.
ob_ival.value = 0

# Now for the output
x = 1
print x == x+2
print 2 == 0

Bản in

True
True

7

Perl

sử dụng chương trình con với các tác dụng phụ trên biến gói:

sub x () { $v -= 2 }
print "true!\n" if x == x + 2;

Đầu ra: true!


1
sub x{}"hoạt động" là tốt .. (ít nhất là trong 5.10.1 của tôi), nhưng tôi không thể hiểu tại sao ..
mykhal

2
Bởi vì sub x{}trả về undef hoặc danh sách trống, cả hai đều là số không. Và x + 2 được phân tích cú pháp là x (+2). perl -MO=Deparsetiết lộprint "true\n" if x() == x(2);
Perleone

Thật tuyệt vời, @mykhal và @Perleone!
memowe

7

Con trăn

khai thác chính xác điểm nổi làm cho điều này rất đơn giản.

>>> x = 100000000000000000.0
>>> (x == x+2)
True

Để làm cho nó ít cụ thể hơn hệ thống yêu cầu nhập thêm

>>> import sys
>>> x = float(sys.maxint + 1)
>>> (x == x+2)
True

Điều này cũng nên làm việc trong các ngôn ngữ khác. Điều này hoạt động vì sự giới thiệu của 100000000000000000.0 và 100000000000000002.0 hoàn toàn giống nhau cho máy, vì cách các điểm nổi được thể hiện bên trong máy. xem http://en.wikipedia.org/wiki/IEEE_floating_point để biết thêm thông tin.

Vì vậy, điều này về cơ bản sẽ hoạt động trong bất kỳ ngôn ngữ nào cho phép bạn thêm số nguyên vào số float và kết quả của việc này là số float.


6

Đây là một giải pháp cho C ++ dựa trên quá tải toán tử. Nó dựa vào chuyển đổi ngầm định từ một enumsang một int.

#include <iostream>

enum X {};
bool operator==(X x, int y)
{
    return true;
}

int main()
{
    X x;
    std::cout << std::boolalpha << (x == x+2) << std::endl;
    return 0;
}

Bạn có thể sử dụng std::boolalphathay vì ?:.
Jon Purdy

5

Tôi biết đó là một thử thách mã ... nhưng tôi đã đánh gôn nó. Lấy làm tiếc.

Ruby - 13 ký tự - Giải pháp vô cực

x=1e17;x==x+2

trả về đúng

Ruby - 41 ký tự - Giải pháp quá tải Op

class Fixnum;def + y;0 end end;x=0;x==x+2

hoặc là

class A;def self.+ y;A end end;x=A;x==x+2

5

Nếu có thể khai thác câu hỏi một chút, thì tôi sẽ thêm một số Java mới. Thủ thuật này chắc chắn không mới, nhưng có lẽ thú vị là điều này có thể có trong Java.

static void pleaseDoNotDoThis() throws Exception {
    Field field = Boolean.class.getField("FALSE");
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, true);
}

public static void main(String args[]) throws Exception {
    pleaseDoNotDoThis();
    doit(1);
    doit("NO");
    doit(null);
    doit(Math.PI);
}

static void doit(long x) {
    System.out.format("(x == x + 2) = (%d == %d) = %s\n", x, x+2, (x == x + 2));
}

static void doit(String x) {
    System.out.format("(x == x + 2) = (%s == %s) = %s\n", x, x+2, (x == x + 2));
}

static void doit(double x) {
    System.out.format("(x == x + 2) = (%f == %f) = %s\n", x, x+2, (x == x + 2));
}

Và kết quả:

(x == x + 2) = (1 == 3) = true
(x == x + 2) = (NO == NO2) = true
(x == x + 2) = (null == null2) = true
(x == x + 2) = (3,141593 == 5,141593) = true
(x == x + 2) = (Infinity == Infinity) = true

4

Giải pháp VBScript này hoạt động tương tự như giải pháp JavaScript của tôi. Tôi đã không sử dụng một bộ tiền xử lý nhưng giải pháp có vẻ tầm thường.

y = 0
Function x
x = y
y = -2
End Function

If x = x + 2 Then
    WScript.Echo "True"
Else
    WScript.Echo "False"
End If

Tôi sẽ đăng cùng một giải pháp trong ruby, cho đến khi tôi thấy bạn - điều đó là có thể bởi vì cả hai ngôn ngữ đều cho phép bỏ qua dấu ngoặc đơn.
waldrumpus
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.