เมื่อใด (x == x + 2) [ปิด]


90

ความท้าทาย: กำหนดxในลักษณะที่การแสดงออก(x == x+2)จะประเมินเป็นจริง

ฉันติดแท็กคำถามด้วย C แต่ยินดีต้อนรับคำตอบในภาษาอื่นตราบใดที่พวกเขามีความคิดสร้างสรรค์หรือเน้นแง่มุมที่น่าสนใจของภาษา

ฉันตั้งใจจะยอมรับโซลูชัน C แต่ภาษาอื่นสามารถรับการโหวตของฉันได้

  1. ถูกต้อง - ทำงานกับการใช้งานที่ได้มาตรฐาน ข้อยกเว้น - สมมติว่ามีการใช้งานประเภทพื้นฐานหากเป็นการใช้งานทั่วไป (เช่นสมมติว่าintเป็นส่วนประกอบ 32 บิต 2) ก็โอเค
  2. ง่าย - ควรมีขนาดเล็กใช้คุณสมบัติภาษาขั้นพื้นฐาน
  3. น่าสนใจ - เป็นเรื่องส่วนตัวฉันยอมรับ ฉันมีตัวอย่างสำหรับสิ่งที่ฉันคิดว่าน่าสนใจ แต่ฉันไม่ต้องการให้คำแนะนำ อัพเดต : การหลีกเลี่ยงตัวประมวลผลล่วงหน้าเป็นสิ่งที่น่าสนใจ
  4. ด่วน - คำตอบที่ดีแรกจะได้รับการยอมรับ

หลังจากได้รับคำตอบ 60 ครั้ง (ฉันไม่เคยคาดหวังว่าจะมีการคาดการณ์เช่นนี้) มันอาจเป็นการดีที่จะสรุปพวกเขา

60 คำตอบแบ่งเป็น 7 กลุ่มโดย 3 กลุ่มสามารถนำไปใช้ใน C ส่วนที่เหลือเป็นภาษาอื่น:

  1. ตัวประมวลผลล่วงหน้า C #define x 2|0แนะนำ แต่มีความเป็นไปได้อื่น ๆ อีกมากมาย
  2. จุดลอยตัว ตัวเลขขนาดใหญ่อินฟินิตี้หรือน่านทั้งหมดทำงานได้
  3. เลขคณิตของตัวชี้ ตัวชี้ไปยังโครงสร้างขนาดใหญ่ทำให้การเพิ่ม 2 เพื่อตัด

    ส่วนที่เหลือไม่ทำงานกับ C:

  4. โอเปอร์เรเตอร์ที่เกินพิกัด - A +ที่ไม่เพิ่มหรือ a ==ที่คืนค่าจริงเสมอ
  5. ทำให้xการเรียกฟังก์ชั่น (บางภาษาให้มันได้โดยไม่ต้องx()ไวยากรณ์) จากนั้นมันจะคืนสิ่งอื่นทุกครั้ง
  6. ชนิดข้อมูลหนึ่งบิต x == x+2 (mod 2)แล้วก็
  7. การเปลี่ยน2- บางภาษาช่วยให้คุณกำหนด0ได้

29
ทำไม4. Quick? คุณหมายถึง "ใครรู้จักและโชคดีพอที่จะอ่านคำถามนี้ก่อน"?
ลุค

6
@ugoren ให้ลงคะแนนเสียงชุมชน (และออกเสียงลงคะแนนตัวเองสำหรับคนที่คุณชอบ) แล้วเลือกคำตอบที่ด้านบนหลังจาก 7 วันหรือดังนั้น :)
ลัค

3
เกี่ยวกับความเป็นไปได้ที่ 2: NaN ไม่ทำงาน NaN + 2 เป็น NaN อีกครั้ง แต่ NaN == NaN เป็นเท็จ
Martin B

2
โซลูชัน Scala โดยที่ x คือชุดที่ประกอบด้วย '2' และ + หมายถึงadd to Setโดยไลบรารีมาตรฐานโดยไม่ต้องกำหนด+ตัวเองใหม่ไม่เหมาะกับ 7 หมวดหมู่เหล่านี้ IMHO
ผู้ใช้ไม่ทราบ

2
ทำไมคำถามนี้และคำตอบทั้งหมดของ Wiki ชุมชน
mbomb007

คำตอบ:


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

เอาท์พุท 1

ลิงก์: http://ideone.com/dL6A5


7
float x=1./0สั้นกว่านี้เล็กน้อยและอาจจะสง่างามกว่านี้ แต่อย่างไรก็ตามนี่เป็นคำตอบแรกที่ดีแน่นอน
ugoren

1
Ahh ดีหารเก่าด้วยศูนย์ ฉันต้องใช้เวลานานกว่าที่จะยอมรับ ฮ่าฮ่า
แกรนท์

โอ๊ะฉันยังคิดเรื่องนี้อยู่ แต่ใน Windows ไม่ได้คอมไพล์ฉันก็เลยทำมันทิ้ง :( +1 แม้ว่า
ทิวดอร์

x = 1e999 เป็นอีกหนึ่งวิธีในการทำเช่นนี้
shiona

4
@shiona float x=1e20น่าจะเพียงพอ
l0n3sh4rk

125

Fortran IV:

2=0

หลังจากนี้ทุก 2 คงที่ในโปรแกรมเป็นศูนย์ เชื่อฉันสิฉันได้ทำสิ่งนี้แล้ว (ตกลง 25 ปีที่แล้ว)


23
เหตุผลทั้งหมดที่ทำให้ฉันไม่แตะต้อง Fortran
C0deH4cker

3
อย่างน้อยก็โยนคำเตือนหรือไม่?
Michael Stern

15
@MichaelStern คำเตือน: คุณกำลังเปลี่ยนมูลค่า 2!
Cruncher

100

ดูเหมือนว่าจะใช้งานได้:

#define x 2|0

(2|0 == 2|(0+2))โดยทั่วไปการแสดงออกที่มีการขยายไปยัง เป็นตัวอย่างที่ดีว่าทำไมคนเราควรใช้วงเล็บเมื่อกำหนดมาโคร


3
ใช้งานได้จริงและฉันคิดว่ามันเป็นโซลูชั่นประมวลผลตามที่หรูหราที่สุด แต่ฉันคิดว่าการทำมันโดยไม่ใช้ตัวประมวลผลล่วงหน้านั้นน่าสนใจกว่า
ugoren

มันเป็นแค่ฉันหรือควร2|(0+2)จะเป็น1?
phunehehe

1
@phunehehe: |เป็นบิตหรือ ; ||เป็นตรรกะหรือ
PleaseStand

20
สิ่งนี้ทำให้ฉันนึกถึงตารางบ๊อบบี้เล็กน้อย
vsz

1
@rakeshNS: ผมเพิ่มชุดพิเศษของวงเล็บเพื่อแสดงให้เห็นความสำคัญผู้ประกอบการ นั่นเป็นเหตุผลที่ฉันพูดว่า "พื้นฐาน"
PleaseStand

79

brainfuck

x

นี้แน่นอนยืด "ประเมินเป็นจริง" เล็กน้อยเพราะใน Brainfuck ไม่มีอะไรประเมินผลได้จริง- คุณเพียงจัดการเทป แต่ถ้าคุณต่อท้ายการแสดงออกของคุณ

x
(x == x+2)

โปรแกรมเทียบเท่า

+

(เพราะทุกอย่าง แต่<>+-[],.เป็นความคิดเห็น) ซึ่งไม่ทำอะไรเลยนอกจากการเพิ่มมูลค่าที่เราอยู่ตอนนี้ เทปถูกกำหนดค่าเริ่มต้นด้วยศูนย์ทั้งหมดดังนั้นเราจึงลงท้ายด้วย 1 บนตำแหน่งเคอร์เซอร์ซึ่งหมายความว่า "จริง": ถ้าตอนนี้เราเริ่มต้นส่วนที่มีเงื่อนไขด้วย[]มันจะเข้า / วน


12
+1 จะต้องเป็นกฎที่สร้างสรรค์ที่สุด
ninjalj

3
ทำไมคุณต้องการx?
James

3
@James คำถามที่กล่าวว่าการกำหนดxเพื่อให้ที่นี่ถูกกำหนดให้เป็นx x
user80551

1
@James คำตอบไม่ได้มีneedอะไรยกเว้น+
Cruncher

56

F #

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

13
ฉันชอบอันนี้ แทนการเล่นกลตัวเลขเพียงแค่กำหนดความหมายของ ==
evilcandybag

4
แฮงค์ตัวดำเนินการความเสมอภาคใน F # ไม่ใช่อย่างนั้น=เหรอ? ==ไม่ได้กำหนดโดยค่าเริ่มต้น
Jwosty

50

C

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

หมายเหตุ: อาจไม่ทำงานถ้าFLT_EVAL_METHOD != 0(ดูความคิดเห็นด้านล่าง)


24
+1 สำหรับแอปพลิเคชันในโลกแห่งความจริง มีคนจำนวนมากที่ไม่เข้าใจคณิตศาสตร์จุดลอยตัว
Tim S.

1
@ mbomb007: ฉันคิดว่ามันแตกต่างกัน - คำตอบที่คุณเชื่อมโยงจะขึ้นอยู่กับINF + 2 == INFในขณะที่คำตอบของฉันใช้ลอยแม่นยำที่มีขนาดใหญ่พอที่ 2 จะน้อยกว่าหนึ่ง ULP
Paul R

2
@ mbomb007: ฉันคิดว่าพวกเขาแตกต่างกันมาก - ∞ + 2 = ∞เป็นสิ่งที่ทุกคนสามารถเข้าใจและไม่ได้ขึ้นอยู่กับคอมพิวเตอร์ใด ๆ ที่เฉพาะเจาะจงในขณะที่เพิ่ม 2 ลงในจำนวนที่เป็นรูปธรรมและมันไม่มีผลใด ๆ คอมพิวเตอร์และ IMHO ที่น่าสนใจมากขึ้น
GoatInTheMachine

1
นี้พร้อมที่จะล้มเหลวเมื่อเป็นคณิตศาสตร์กระทำตามFLT_EVAL_METHOD == 1 doubleแนะนำค่า FP ที่มากขึ้นเพื่อให้แน่ใจว่ามีlong doubleความแม่นยำมากกว่า1.0e37f
chux

1
@ chux: ขอบคุณสำหรับการยืนยัน - นั่นเป็นสิ่งที่ฉันอาจต้องระวังในอนาคตเนื่องจากรหัสของฉันกลายเป็นข้ามแพลตฟอร์มมาก
พอลอาร์

36

C #

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

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

ไม่ใช่เตี้ย แต่ค่อนข้างหรูหรา

http://ideone.com/x56Ul


4
ก็เพิ่งได้รับป้าย 'คำตอบที่ดี' สำหรับโพสต์นี้ รับป้ายสำหรับสิ่งชั่วร้ายอย่างจริงจัง! อย่าทำที่บ้าน !
fjdumont

มันชั่วร้าย แต่มันก็สวยมาก ...
Kevin

32

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


Haskell:กำหนดℤ / 2ℤบนBooleans:

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

แล้วสำหรับการใด ๆเราจะมีx :: Boolx == x + 2

อัปเดต:ขอบคุณสำหรับแนวคิดในความคิดเห็นฉันอัปเดตอินสแตนซ์ตามนั้น


3
คุณสามารถทำให้ง่ายขึ้น:fromInteger = odd
Rotsor

1
ยัง(+)สามารถนิยามได้ตามที่(/=)ฉันเชื่อ
MatrixFrog

2
()วิธีการแก้ปัญหาที่สั้นกว่าจะทำให้อินสแตนซ์สำหรับ
โทมัส Eding

31

หลาม

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

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

ดี ภาษาทั้งหมดที่รองรับการใช้งานเกินพิกัดสามารถใช้โซลูชันที่คล้ายกัน แต่ C ไม่ใช่หนึ่งในนั้น
ugoren

ใช้ได้กับการบรรทุกเกินพิกัด__cmp__เป็นclass X(int):__cmp__=lambda*x:0(หรือ__eq__นานกว่าเล็กน้อยclass X(int):__eq__=lambda*x:True
dr jimbob

ตัวอักษรคู่สั้นถ้าคุณไม่ขยายจาก int ..class X:__add__=lambda s,o:s
Doboy

ฉันขอถามว่าการคูณนั้นทำอะไรได้บ้าง
seequ

2
@TheRare มันไม่ใช่การคูณจริง เนื่องจาก__add__โดยปกติจะได้รับการขัดแย้งหลายครั้ง ( lambda x,y:) ฉันบันทึกอักขระบางตัวโดยใช้ * เพื่อแพ็คอาร์กิวเมนต์ทั้งหมดลงใน tuple ( lambda *y:) ดูเอกสารสำหรับข้อมูลเพิ่มเติม
grc

31

GNU Cรองรับโครงสร้างที่ไม่มีสมาชิกและขนาด 0:

struct {} *x = 0;

2
ดีมาก! ฉันคิดเกี่ยวกับการคำนวณทางคณิตศาสตร์ด้วยข้อมูลที่มีขนาดใหญ่มากซึ่งนำไปสู่การพัน แต่ไม่ได้คิดตรงกันข้าม
ugoren

26

PHP:

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

หรือ:

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

เอาท์พุท:

บูล (จริง)


1
จริง ๆ แล้วฉันพยายามหาคำตอบ PHP ที่ไม่ธรรมดา แต่คุณเอาชนะฉันได้
PleaseStand

25

มันเป็นความเข้าใจผิดที่พบบ่อยใน C ช่องว่างไม่สำคัญ ฉันนึกภาพไม่ออกว่ามีใครบางคนไม่ได้ทำสิ่งนี้ใน 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;
}

1พิมพ์


ดีแม้ว่าอาจไม่ถูกต้องทางเทคนิค ( x == x+2ยังคงเป็นเท็จ) แต่เมื่อคุณนำความคิดขึ้นมาฉันคิดว่า#define x -2*__LINE__สง่างามยิ่งขึ้น
ugoren

3
@ugoren ขอบคุณ! หากคุณต้องการให้สิ่งนี้เป็นหนึ่งบรรทัดให้ใช้COUNTERแทนLINE - ต้องใช้ GCC 4.3+
H2CO3

1
_CATเป็นตัวระบุลิขสิทธิ์ สิ่งใดที่เริ่มต้นด้วยเครื่องหมายขีดล่างและตัวอักษรตัวพิมพ์ใหญ่สงวนไว้ใน C.
Konrad Borowski

@xfix ถูกต้องอัปเดตเพื่อลบ UB
H2CO3

20

C

มันเป็นเรื่องที่น่าสนใจมากขึ้นหากไม่ใช้มาโครและไม่ใช้ความไม่สิ้นสุด

/////////////////////////////////////
// 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);

ลองถ้าคุณไม่เชื่อ!


1
0. ไม่ยังไม่เชื่อ
MSalters

@MSalters: คุณใช้คอมไพเลอร์อะไร? คุณอาจปิดการใช้งาน trigraph
vsz

VS2010 มีความเป็นไปได้ค่อนข้างมากที่ค่าเริ่มต้นจะถูกปิดใช้งาน การต่อข้อมูลนั้นหรือการต่อบรรทัดไม่สามารถใช้งานได้??\
MSalters

MSalters: trigraph ??\ คือการถูกแปลงเป็นหนึ่งเดียวจึงไม่มี\ ??\ คอมไพเลอร์สมัยใหม่บางตัวจะให้คำเตือนโดยค่าเริ่มต้นสำหรับทั้งตรีโกณมิติและการต่อแถวแม้จะเปิดใช้งานก็ตาม
vsz

18

Mathematica:

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

ฉันคิดว่าวิธีนี้เป็นเรื่องแปลกเพราะใช้แนวคิดของค่านิยมของ Mathematica

แก้ไข:

ฉันกำลังขยายคำตอบของฉันจะอธิบายสิ่งที่ค่าหมายถึงในMathematica

xบรรทัดแรกเป็นหลักนอกจากนี้นิยามใหม่สำหรับสัญลักษณ์ ฉันโดยตรงสามารถเก็บคำนิยามในการทำงานระดับโลกที่มีความเกี่ยวข้องกับการ+สัญลักษณ์ แต่เช่นนิยามใหม่จะเป็นอันตรายเพราะนิยามใหม่อาจเผยแพร่อันเป็นผ่านMathematica ของในตัวอัลกอริทึม

แต่ใช้แท็กผมที่เกี่ยวข้องกับความหมายสัญลักษณ์x/: xตอนนี้เมื่อใดก็ตามที่Mathematicaเห็นสัญลักษณ์xก็จะตรวจสอบเพื่อดูว่ามันถูกดำเนินการโดยผู้ประกอบการเพิ่มเติม+ในรูปแบบของรูปแบบx + 2 + ___ที่สัญลักษณ์___หมายถึงลำดับโมฆะที่เป็นไปได้ของสัญลักษณ์อื่น ๆ

นิยามใหม่นี้มีความเฉพาะเจาะจงมากและใช้ความสามารถในการจับคู่รูปแบบที่กว้างขวางของ Mathematica ยกตัวอย่างเช่นการแสดงออกx+y+2ผลตอบแทนx+yแต่การแสดงออกx+3ผลตอบแทนx+3; เพราะในกรณีก่อนรูปแบบสามารถจับคู่ได้ แต่ในกรณีหลังรูปแบบไม่สามารถจับคู่ได้หากไม่มีการทำให้เข้าใจง่ายขึ้นเพิ่มเติม


1
ฉันคิดว่าคุณควรอธิบายว่ามันทำอะไร คนส่วนใหญ่ไม่รู้จัก Mathematica (หรือค่านิยมคืออะไร)
ugoren

1
ขอบคุณ @ugoren ฉันใช้เวลาส่วนใหญ่ในเว็บไซต์ Mathematica Stack Exchange ดังนั้นฉันลืมอธิบายสิ่งที่ทำให้ตัวอย่างของฉันมีความหมาย ฉันทำการแก้ไขที่อธิบายแนวคิดอย่างกระชับที่สุดเท่าที่จะทำได้
Carl Morris

17

javascript:

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

ทดสอบซอ


2
คุณสามารถใช้Infinityหรือ-Infinity, x = 1/0และด้วยเหตุนี้คุณสามารถใช้ทางลัดของ
zzzzBov

6
@zzzzBov: แน่นอนว่าเป็นรหัสกอล์ฟที่ดีกว่า ฉันเลือก(99999999999999999 == 99999999999999999+2)เพราะฉันคิดว่ามันน่าสนใจกว่า(Infinity == Infinity+2)นี้เล็กน้อยเหมือนอย่างที่ OP บอกว่า "มันเป็นเรื่องส่วนตัว" :)
Briguy37

นี่เป็นกรณีเดียวในโลกแห่งความจริงที่ฉันเห็นเช็คเช่นนี้ด้วยเหตุผลที่ดี (นอกเหนือจากปริศนาการเขียนโปรแกรม): ฟังก์ชั่นคณะ (ตามฐานลอย) กำลังตรวจสอบอินพุตว่ามันยอดเยี่ยมเกินกว่าที่จะนับถอยหลัง-1และเรียกซ้ำ . ภาษาเองคือ Python แต่นั่นไม่สำคัญในกรณีนี้
Alfe

5
@NicoBurns ไม่ทำให้มัว :(
ajax333221

2
@NicoBurns, ใช้รหัสว่าในคอนโซลผลิตfalse; ทุกที่ที่คุณรับข้อมูลเกี่ยวกับ JS นั้นผิดและไม่ควรเชื่อถือได้
zzzzBov

17

โครงการ

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

ดี Scheme (x == x + 2)ดูเหมือนกับ C แต่หมายถึงสิ่งที่ต่างออกไปโดยสิ้นเชิง
ugoren

1
(= x 2)ตอนนี้ทำเพื่อ
Joe Z.

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

@ugoren สิ่งนี้ถูกกำหนดให้ทำโดยโปรแกรมนี้ x เป็นชื่อฟังก์ชั่นที่นี่ ==
Cruncher

16

คำตอบที่ชัดเจน:

เมื่อสิ่งนี้สิ้นสุดลง:

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

1
+1 meta.codegolf.stackexchange.com/a/1070/8766แต่นี่มันช่างฉลาดจริง ๆ
user80551

1
ฉันคิดว่าwhile(!(x == x+2)) {}จะเป็นจิตวิญญาณมากขึ้น
Cruncher

คำตอบนี้มาถึงเมตาโพสต์ที่มีสองปี ทุกสิ่งที่ถือว่าเป็นถ้อยคำที่เบื่อหูวันนี้เป็นนวนิยายในบางจุด
daniero

16

นี่คือโซลูชันสำหรับ JavaScript ที่ไม่ใช้ประโยชน์จากInfinityและ-Infinityกรณีขอบของการเพิ่มจุดลอย สิ่งนี้ใช้ได้ทั้งใน Internet Explorer 8 และต่ำกว่าหรือในโหมดเข้มงวดในการเลือกใช้ ES5 ฉันจะไม่เรียกwithคำแถลงนี้และผู้ให้ข้อมูลโดยเฉพาะอย่างยิ่งฟีเจอร์ "ขั้นสูง"

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

แก้ไขเพื่อเพิ่ม:เคล็ดลับข้างต้นเป็นไปได้โดยไม่ใช้withและgetตามที่ระบุไว้โดยAndy Eในเคล็ดลับสำหรับการเล่นกอล์ฟใน JavaScriptและjncratonในหน้านี้:

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

แนวคิดที่ดี - การxใช้งานเป็นฟังก์ชั่นการโทรถึงแม้ว่ามันจะดูเหมือนการอ่านตัวแปร ฉันถือว่าลำดับการประเมินผลจากซ้ายไปขวา แต่ก็ไม่เป็นไรเพราะมันระบุไว้ใน JS (ต่างจาก C)
ugoren

14

ต่อไปนี้ไม่ได้เป็นไปตามมาตรฐานCแต่ควรทำงานบนแพลตฟอร์ม 64 บิตใด ๆ :

int (*x)[0x2000000000000000];

ยิ่งใหญ่ในหลักการ แต่ดูเหมือนว่าจะนำไปใช้ผิด xจะเพิ่มขึ้นในขั้นตอนที่ 2 ^ 61 ดังนั้นจะเท่ากับx + 8 x
ugoren

@ugoren ก็ทำงานสำหรับฉันในลินุกซ์กับ int4
ฮัน

คุณพูดถูก ฉันคิดถึงความจริงที่ว่ามันเป็น array ของไม่ได้int char
ugoren

10

ปราชญ์:

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

ผลตอบแทนจริง

โดยทั่วไปสำหรับ GF (2 ** n) มันเป็นความจริงเสมอว่า x = x + 2 สำหรับ x ใด ๆ

นี่ไม่ใช่ข้อผิดพลาดหรือปัญหาเกี่ยวกับการล้นหรืออินฟินิตี้มันถูกต้องจริง


1
เทคนิคเดียวกันนี้ใช้ได้กับ PARI / GP
Hagen von Eitzen

10

เสียงกระเพื่อมสามัญ

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

มันค่อนข้างง่ายเมื่อxไม่จำเป็นต้องเป็นค่าจริง


8

APL (Dyalog)

X←1e15
X=X+2

APL ไม่ได้มีอินฟินิตี้ก็เพียงว่าลอยจะไม่แม่นยำพอที่จะบอกความแตกต่างระหว่างและ1.000.000.000.000.000 1.000.000.000.000.002นี่คือเท่าที่ฉันรู้วิธีเดียวที่จะทำได้ใน APL


ฉันชอบสิ่งนี้เพราะเป็นคำตอบแรกที่ใช้ประโยชน์จากความแม่นยำแบบลอย
AndrewKS

1
@AndrewKS: จริง ๆ แล้ว Paul R นั้นค่อนข้างเร็ว
MSalters

8

Perl 6

ฉันประหลาดใจที่ไม่เห็นโซลูชันนี้มาก่อน อย่างไรก็ตามการแก้ปัญหาคือ - สิ่งที่ถ้าxเป็น0และ2ในครั้งเดียว? my \xในตัวอย่างนี้ประกาศตัวแปร sigilless - คำถามนี้ถามเกี่ยวกับการxไม่ $xPerl ?? !!เป็นผู้ดำเนิน ternary

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

แต่...

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

xคือหลายค่าในครั้งเดียว xเท่ากับ0และ2ในครั้งเดียว x + 2เท่ากับ2และ4ในครั้งเดียว ดังนั้นในเชิงตรรกะพวกมันเท่ากัน


8

Python 2.X (การใช้นิยามใหม่ของจำนวนเต็ม (แคช))

ฉันสังเกตเห็นคำตอบหลามทั้งหมดได้กำหนดคลาสที่กำหนดตัว+ดำเนินการใหม่ ฉันจะตอบด้วยการสาธิตระดับต่ำยิ่งขึ้นของความยืดหยุ่นของงูหลาม (นี่เป็นข้อมูลโค้ดเฉพาะของ python2)

ในไพ ธ อนจำนวนเต็มจะถูกเก็บไว้ใน C:

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

นั่นคือโครงสร้างที่มีsize_t, void *และlongวัตถุในลำดับที่
เมื่อเราใช้และดังนั้นจึงเป็นจำนวนเต็มแคชเราสามารถใช้ctypesโมดูลของงูใหญ่เพื่อกำหนดจำนวนเต็มนั้นเพื่อที่ไม่เพียงx == x+2แต่2 == 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

พิมพ์

True
True

7

Perl

การใช้รูทีนย่อยที่มีผลข้างเคียงกับตัวแปรแพ็กเกจ:

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

เอาท์พุท: true!


1
sub x{}"ทำงาน" เช่นกัน .. (อย่างน้อยใน 5.10.1 ของฉัน) แต่ฉันไม่สามารถคิดว่าทำไม ..
mykhal

2
เนื่องจากsub x{}ส่งกลับค่า undef หรือรายการว่างซึ่งทั้งคู่เป็นศูนย์ที่เป็นตัวเลข และ x + 2 จะถูกแยกวิเคราะห์เป็น x (+2) perl -MO=Deparseเผยให้เห็นprint "true\n" if x() == x(2);
Perleone

มันยอดเยี่ยม @mykhal และ @Perleone!
memowe

7

หลาม

การใช้ประโยชน์จากความแม่นยำจุดลอยทำให้เรื่องนี้ง่ายมาก

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

เพื่อให้ระบบมีความเฉพาะเจาะจงน้อยลง

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

สิ่งนี้ควรทำงานในภาษาอื่นด้วย สิ่งนี้ทำงานได้เนื่องจากการพิมพ์ใหม่ของ 100000000000000000.0 และ 100000000000000002.0 นั้นเหมือนกันทุกประการสำหรับเครื่องเนื่องจากวิธีแสดงคะแนนลอยตัวภายในเครื่อง ดูhttp://en.wikipedia.org/wiki/IEEE_floating_pointสำหรับข้อมูลเพิ่มเติม

ดังนั้นสิ่งนี้จะใช้งานได้กับภาษาใด ๆ ที่อนุญาตให้คุณเพิ่มจำนวนเต็มเพื่อลอยและมีผลลัพธ์ของการลอยนี้


6

นี่คือวิธีการแก้ปัญหาสำหรับ C ++ โดยยึดตามการใช้งานเกินพิกัด มันต้องอาศัยการแปลงโดยปริยายจากไปยังenumint

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

คุณสามารถใช้แทนstd::boolalpha ?:
Jon Purdy

5

ฉันรู้ว่ามันเป็นรหัสที่ท้าทาย ... แต่ฉันเล่นกอล์ฟ ขอโทษ

Ruby - 13 ตัวอักษร - วิธีแก้ปัญหาไม่มีที่สิ้นสุด

x=1e17;x==x+2

ผลตอบแทนจริง

Ruby - 41 ตัวอักษร - Op การแก้ปัญหาการโอเวอร์โหลด

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

หรือ

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

5

หากการใช้ประโยชน์จากคำถามเล็กน้อยฉันจะเพิ่ม Java ใหม่ เคล็ดลับนั้นแน่นอนไม่ใช่เรื่องใหม่ แต่อาจน่าสนใจว่านี่เป็นไปได้ใน 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));
}

และผลลัพธ์:

(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

โซลูชัน VBScript นี้ทำงานคล้ายกับโซลูชัน JavaScript ของฉัน ฉันไม่ได้ใช้ preprocessor แต่ดูเหมือนว่าวิธีแก้ปัญหาเล็กน้อย

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

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

ฉันจะโพสต์คำตอบเดียวกันกับทับทิมจนกระทั่งฉันเห็นคุณ - เป็นไปได้เพราะทั้งสองภาษายอมให้ใส่วงเล็บ
waldrumpus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.