कब (x == x + 2) होता है? [बन्द है]


90

चुनौती: xइस तरह परिभाषित करें कि अभिव्यक्ति (x == x+2)सही का मूल्यांकन करेगी।

मैंने C के साथ प्रश्न को टैग किया, लेकिन अन्य भाषाओं में उत्तर स्वागत योग्य हैं, जब तक वे रचनात्मक हैं या भाषा के एक दिलचस्प पहलू को उजागर करते हैं।

मैं एक सी समाधान को स्वीकार करने का इरादा रखता हूं, लेकिन अन्य भाषाओं को मेरा वोट मिल सकता है।

  1. सही - मानक-अनुरूप कार्यान्वयन पर काम करता है। अपवाद - यदि यह एक सामान्य कार्यान्वयन है (जैसे कि मान int32bit 2 का पूरक है) ठीक है , तो बुनियादी प्रकारों के कार्यान्वयन को ठीक माना जाता है।
  2. सरल - छोटा होना चाहिए, मूल भाषा सुविधाओं का उपयोग करना चाहिए।
  3. दिलचस्प है - यह व्यक्तिपरक है, मैं मानता हूं। मेरे पास कुछ उदाहरण हैं जो मुझे दिलचस्प मानते हैं, लेकिन मैं संकेत नहीं देना चाहता। अपडेट करें : प्रीप्रोसेसर से बचना दिलचस्प है।
  4. त्वरित - पहला अच्छा जवाब स्वीकार किया जाएगा।

60 उत्तर मिलने के बाद (मुझे इस तरह के अनुमान की उम्मीद नहीं थी), उन्हें संक्षेप में प्रस्तुत करना अच्छा हो सकता है।

60 उत्तर 7 समूहों में विभाजित हैं, जिनमें से 3 को C में लागू किया जा सकता है, बाकी अन्य भाषाओं में:

  1. C प्रीप्रोसेसर। #define x 2|0सुझाव दिया गया था, लेकिन कई अन्य संभावनाएं हैं।
  2. तैरनेवाला स्थल। बड़ी संख्या, अनंत या NaN सभी काम करते हैं।
  3. सूचक अंकगणित। एक विशाल संरचना के लिए एक सूचक जिसके चारों ओर लपेटने के लिए 2 जोड़ रहा है।

    बाकी सी के साथ काम नहीं करते:

  4. ऑपरेटर ओवरलोडिंग - A +जो जोड़ या नहीं करता है== ही जो हमेशा सच होता है।
  5. बनाना xएक समारोह कॉल (कुछ भाषाओं के बिना इसे अनुमति x()वाक्य रचना)। फिर यह हर बार कुछ और लौटा सकता है।
  6. एक बिट डेटा प्रकार। तब x == x+2 (mod 2)
  7. बदलना 2- कुछ भाषा आपको 0इसे असाइन करने देती है।

29
क्यों 4. Quick? आपका मतलब है "जो कोई भी जानता है और पहले इस प्रश्न को पढ़ने के लिए पर्याप्त भाग्यशाली है"?
ल्यूक

6
@ यूगोरेन समुदाय को वोट दें (और अपने आप को उन लोगों के लिए वोट दें जिन्हें आप पसंद करते हैं), फिर 7 दिनों या उसके बाद शीर्ष उत्तर चुनें :)
Luc

3
संभावना 2 के बारे में: NaN काम नहीं करता है। NaN + 2 फिर से NaN है, लेकिन NaN == NaN गलत है।
मार्टिन बी

2
स्केल समाधान, जहां x एक सेट है जिसमें '2' है, और + add to Setमानक पुस्तकालय द्वारा + का अर्थ है, +अपने आप को फिर से परिभाषित किए बिना , इन 7 श्रेणियों, IMHO में फिट नहीं होता है।
उपयोगकर्ता अज्ञात

2
यह प्रश्न और सभी उत्तर सामुदायिक विकी क्यों हैं?
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
आह अच्छा पुराना शून्य से विभाजित। मुझे यह पता लगाने में अधिक समय लगा कि मैं कबूल करना चाहता हूं। haha
अनुदान

अर्ग, मैं भी इस के बावजूद, लेकिन विंडोज पर संकलन नहीं है इसलिए मैंने इसे गिरा दिया। :( +1 हालांकि
ट्यूडर

x = 1e999 ऐसा करने का एक और तरीका है।
शियोना

4
@ सियोना float x=1e20पर्याप्त होगा
l0n3sh4rk

125

फोरट्रान IV:

2=0

इसके बाद कार्यक्रम में हर 2 लगातार शून्य है। मेरा विश्वास करो, मैंने ऐसा किया है (ठीक है, 25 साल पहले)


23
मेरे लिए और अधिक सभी कारण फोरट्रान को कभी नहीं छूना।
C0deH4cker

3
क्या यह कम से कम एक चेतावनी फेंक सकता है?
माइकल स्टर्न

15
@MichaelStern चेतावनी: आप 2 का मूल्य बदल रहे हैं!
क्रंचर

100

यह काम करने लगता है:

#define x 2|0

मूल रूप से, अभिव्यक्ति का विस्तार किया जाता है (2|0 == 2|(0+2))। यह एक अच्छा उदाहरण है कि मैक्रो को परिभाषित करते समय किसी को कोष्ठक का उपयोग क्यों करना चाहिए।


3
निश्चित रूप से काम करता है, और मुझे लगता है कि यह सबसे सुंदर प्रीप्रोसेसर आधारित समाधान है। लेकिन मुझे लगता है कि प्रीप्रोसेसर के बिना इसे करना अधिक दिलचस्प है।
ugoren

क्या यह सिर्फ मैं हूं या होना 2|(0+2)चाहिए 1?
फुन्हेहे

1
@phunehehe: |है बिटवाइज़ या ; ||तार्किक है या।
कृपया

20
यह किसी तरह मुझे छोटे बॉबी टेबल्स की याद दिलाता है।
21

1
@rakeshNS: मैंने ऑपरेटर पूर्वता दिखाने के लिए कोष्ठक का अतिरिक्त सेट जोड़ा । इसलिए मैंने कहा "मूल रूप से"।
कृपया 23

79

Brainfuck

x

यह निश्चित रूप से थोड़ा-बहुत "सच का मूल्यांकन" करता है, क्योंकि ब्रेनफक में वास्तव में किसी भी चीज का मूल्यांकन नहीं होता है - आप केवल एक टेप में हेरफेर करते हैं। लेकिन अगर आप अब अपनी अभिव्यक्ति को बढ़ाते हैं

x
(x == x+2)

कार्यक्रम के बराबर है

+

(क्योंकि सब कुछ लेकिन <>+-[],.एक टिप्पणी है)। जहाँ हम अभी हैं उस मूल्य को बढ़ाने के अलावा कुछ नहीं करते। टेप को सभी शून्य के साथ आरंभीकृत किया गया है, इसलिए हम कर्सर स्थिति पर 1 के साथ समाप्त होते हैं, जिसका अर्थ है "सच": यदि हमने अब के साथ एक सशर्त खंड शुरू किया है [], तो यह / पाश में प्रवेश करेगा।


12
+1 नियमों का सबसे रचनात्मक झुकाव होना चाहिए।
नवजाल

3
आपको इसकी आवश्यकता क्यों है x?
जेम्स

3
@James सवाल परिभाषित करने के लिए कहते हैं xतो यहाँ xके रूप में परिभाषित किया गया है x
user80551

1
@ जवाब में needकुछ भी नहीं है सिवाय इसके+
क्रंचर

56

एफ #

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

13
मैं यह पसंद है। बाजीगरी की संख्या के बजाय, बस == का अर्थ फिर से परिभाषित करें
दुष्टाचारी

4
रुको, एफ # में समानता ऑपरेटर नहीं है =? ==डिफ़ॉल्ट रूप से भी परिभाषित नहीं किया गया है।
जोवोती

50

सी

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

नोट: काम नहीं कर सकता है FLT_EVAL_METHOD != 0(नीचे टिप्पणी देखें)।


24
वास्तविक दुनिया के अनुप्रयोगों के लिए +1। बहुत से लोग फ्लोटिंग पॉइंट गणित को नहीं समझते हैं।
टिम एस।

1
@ mbomb007: मुझे लगता है कि वे अलग-अलग हैं - आप जिस उत्तर पर भरोसा करते हैं INF + 2 == INF, उसका जवाब है , जबकि मेरा उत्तर एक एकल सटीक फ्लोट का उपयोग करता है जो कि काफी बड़ा है कि 2 एक से कम ULP है।
पॉल आर

2
@ mbomb007: मुझे यह भी लगता है कि वे बहुत अलग हैं - ∞ + 2 = ∞कुछ ऐसा है जिसे कोई भी समझ सकता है और किसी भी कंप्यूटर पर निर्भर नहीं है, जबकि 2 को एक ठोस संख्या में जोड़ना और इसका कोई प्रभाव नहीं होना थोड़ा अधिक आश्चर्यजनक और सीमित परिशुद्धता के लिए विशिष्ट है। कंप्यूटर, और अधिक दिलचस्प IMHO
GoatInTheMachine

1
यह आसानी से विफल हो सकता है जब FLT_EVAL_METHOD == 1गणित के रूप में किया जाता है double। एक बड़ा एफपी मूल्य भी पार करने के लिए सुनिश्चित करें कि अनुशंसा long doubleकी तरह परिशुद्धता1.0e37f
chux

1
@chux: पुष्टि के लिए धन्यवाद - यह निश्चित रूप से कुछ है जिसे मुझे भविष्य में देखने की आवश्यकता हो सकती है, क्योंकि मेरा अधिकांश कोड क्रॉस-प्लेटफॉर्म पर समाप्त होता है।
पॉल आर

36

सी#

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
इसे डांग, बस इस पोस्ट के लिए एक 'अच्छा जवाब' बिल्ला मिला। गंभीरता से, EVIL सामान के लिए बैज मिल रहा है ?! घर पर यह मत करो !
fjdumont

यह बुराई है, लेकिन यह बहुत सुंदर है ...
केविन

32

स्काला: { val x = Set(2); (x == x + 2) }


हास्केल: परिभाषित करें पर ℤ / 2ℤ Booleans:

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

फिर किसी के लिए भी x :: Boolहमारे पास होगा x == x + 2

अपडेट करें: टिप्पणी में विचारों के लिए धन्यवाद, मैंने तदनुसार उदाहरण को अद्यतन किया।


3
आप सरल कर सकते हैं:fromInteger = odd
Rotsor

1
(+)जैसा (/=)कि मेरा मानना ​​है कि इसे परिभाषित भी किया जा सकता है।
MatrixFrog

2
कम समाधान के लिए एक उदाहरण बनाना होगा ()
थॉमस ईडिंग

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
डॉ jimbob

यदि आप int से विस्तार नहीं करते हैं तो एक छोटा पात्र ..class X:__add__=lambda s,o:s
Doboy

क्या मैं पूछ सकता हूं कि गुणा क्या करता है?
see

2
@ यह वास्तव में गुणा नहीं है। क्योंकि __add__आम तौर पर कई तर्क दिए जाते हैं ( lambda x,y:), मैं सभी तर्कों को एक टुपल ( lambda *y:) में पैक करने के लिए * का उपयोग करके कुछ पात्रों को बचाता हूं । अधिक जानकारी के लिए डॉक्स देखें ।
grc

31

GNU C बिना किसी सदस्य और आकार के संरचनाओं का समर्थन करता है:

struct {} *x = 0;

2
बहुत अच्छा! मैंने बहुत बड़े डेटा के साथ सूचक अंकगणित के बारे में सोचा था जो रैपराउंड के लिए अग्रणी था, लेकिन इसके विपरीत नहीं सोचा था।
ugoren

26

पीएचपी:

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

या:

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

आउटपुट:

bool (सही)


1
मैं वास्तव में इस मृत-सरल PHP उत्तर के साथ आने की कोशिश कर रहा था, लेकिन आपने मुझे इसे हरा दिया।
कृपया 12

25

यह एक आम गलत धारणा है कि सी में, व्हाट्सएप कोई फर्क नहीं पड़ता। मैं कल्पना नहीं कर सकता कि कोई व्यक्ति 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__है कि यह अधिक सुरुचिपूर्ण है।
बदसूरत

3
@ यूगोरन धन्यवाद! आप यह सब, एक पंक्ति पर होना उपयोग करना चाहते हैं काउंटर के बजाय लाइन - जीसीसी 4.3+ हालांकि की आवश्यकता है।
H2CO3

1
_CATआरक्षित पहचानकर्ता है। कुछ भी जो अंडरस्कोर, और अपरकेस अक्षर से शुरू होता है, सी में आरक्षित है
कोनराड बोरोस्की

@xfix बिल्कुल सही है, UB को हटाने के लिए अपडेट किया गया है।
H2CO3

20

सी

मैक्रोज़ का उपयोग किए बिना और अनन्तता का दुरुपयोग किए बिना यह अधिक दिलचस्प है।

/////////////////////////////////////
// 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। नहीं, अभी भी यह विश्वास नहीं है।
11

@MSalters: आप किस कंपाइलर का उपयोग करते हैं? आपके पास ट्रिगर अक्षम हो सकते हैं।
vsz

VS2010। बहुत संभव है कि ट्रिग्राफ डिफ़ॉल्ट रूप से अक्षम हो। या तो वह या लाइन ??\
संघटन के

MSalters: ट्रिग्राफ ??\ को एकल में परिवर्तित किया जाना है \ , इसलिए कोई भी नहीं है ??\ । हालाँकि कुछ आधुनिक कंपाइलर ट्रिग्राफ और डिफ़ॉल्ट रूप से सक्षम होने पर भी चेतावनी देते हैं।
19

18

मेथेमेटिका:

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

मुझे लगता है कि यह समाधान उपन्यास है क्योंकि इसमें गणितज्ञ का उपयोग किया गया है अप वैल्यूज़ अवधारणा का ।

संपादित करें:

मैं यह समझाने के लिए अपने उत्तर का विस्तार कर रहा हूं कि गणित में अप वैल्यूज़ का क्या मतलब है

पहली पंक्ति अनिवार्य रूप से प्रतीक के अलावा को फिर से परिभाषित करती है x। मैं सीधे वैश्विक समारोह में इस तरह की परिभाषा को संग्रहीत कर सकता हूं जो +प्रतीक के साथ जुड़ा हुआ है , लेकिन ऐसा पुनर्परिभाषित खतरनाक होगा क्योंकि पुनर्वितरण Mathematica के अंतर्निहित एल्गोरिथम के माध्यम से अप्रत्याशित रूप से प्रचारित हो सकता है।

इसके बजाय, टैग का उपयोग करते हुए x/:, मैंने परिभाषा को प्रतीक के साथ जोड़ा x। अब जब भी गणितज्ञ प्रतीक को देखता है x, तो यह देखने के लिए जाँचता है कि क्या यह +फॉर्म के पैटर्न में जोड़ ऑपरेटर द्वारा संचालित किया जा रहा है, x + 2 + ___जहाँ प्रतीक का ___अर्थ अन्य प्रतीकों का एक संभावित अशक्त अनुक्रम है।

यह पुनर्परिभाषित बहुत विशिष्ट है और गणितज्ञ की व्यापक पैटर्न मिलान क्षमताओं का उपयोग करता है। उदाहरण के लिए, अभिव्यक्ति x+y+2लौटती है x+y, लेकिन अभिव्यक्ति x+3लौटती है x+3; क्योंकि पूर्व मामले में, पैटर्न का मिलान किया जा सकता था, लेकिन बाद के मामले में, पैटर्न को अतिरिक्त सरलीकरण के बिना मिलान नहीं किया जा सकता था।


1
मुझे लगता है कि आपको समझाना चाहिए कि यह क्या करता है। अधिकांश लोगों को गणितज्ञ (या क्या मूल्य हैं) पता नहीं है।
ugoren

1
शुक्रिया @ यूगोरेन, मैं अपना ज्यादातर समय गणितज्ञ स्टाॅक एक्सचेंज वेबसाइट पर बिताता हूं, इसलिए मैं यह समझाना भूल गया कि मेरे उदाहरण ने क्या सार्थक किया। मैंने एक ऐसा एडिट किया, जो कॉन्सेप्ट को कंफर्टेबल तरीके से समझाता है।
कार्ल मॉरिस

17

जावास्क्रिप्ट:

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

टेस्ट फिडल


2
आप उपयोग कर सकते हैं Infinity, या -Infinity, और इसके कारण आप शॉर्टकट का उपयोग कर सकते हैं x = 1/0
zzzzBov

6
@zzzzBov: यह निश्चित रूप से एक बेहतर कोड गोल्फ है। मैंने चुना (99999999999999999 == 99999999999999999+2)क्योंकि मुझे लगता है कि यह थोड़ा अधिक दिलचस्प है (Infinity == Infinity+2), हालांकि ओपी कहते हैं, "यह व्यक्तिपरक है" :)
ब्रिग्य 37

यह एकमात्र वास्तविक दुनिया का मामला है, जिसमें मैंने एक अच्छे कारण (प्रोग्रामिंग पहेलियों के अलावा) के लिए इस तरह का एक चेक देखा: ए (फ्लोट-आधारित) संकाय-समारोह इसके इनपुट की जाँच कर रहा था कि यह बहुत ही शानदार है -1और इसके द्वारा गिना जा रहा है । भाषा स्वयं अजगर थी, लेकिन इस मामले में वास्तव में कोई फर्क नहीं पड़ता।
अल्फ

5
@NicoBurns नहीं ट्यूर :(
ajax333221

2
@NicoBurns, कंसोल में उस कोड को चलाता है false; जहाँ भी आपको वह जानकारी जेएस पर मिल रही है वह गलत है और उस पर भरोसा नहीं किया जाना चाहिए।
zzzzBov

17

योजना

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

अच्छा लगा। योजना (x == x + 2)सी की तरह ही दिखती है, लेकिन इसका मतलब बिल्कुल अलग है।
15

1
अब इसके लिए करो (= x 2)
जो जेड।

(define (x a b c d) #t):)
क्रंचर

@ इस कार्यक्रम द्वारा ऐसा करने के लिए इसे परिभाषित किया गया है। x यहाँ एक फ़ंक्शन का नाम है। और इसलिए ==
क्रंचर

16

स्पष्ट उत्तर:

जब यह समाप्त हो जाता है:

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

1
+1 meta.codegolf.stackexchange.com/a/1070/8766 लेकिन यह वास्तव में सरल है।
user80551

1
मुझे लगता है कि while(!(x == x+2)) {}आत्मा में अधिक होगा
क्रंचर

यह उत्तर भविष्यवाणी करता है कि मेटा पोस्ट दो साल के साथ है। आज जो कुछ भी क्लिच माना जाता है वह किसी समय उपन्यास था।
डेनियरो

16

यहां जावास्क्रिप्ट के लिए एक समाधान है जो फ्लोटिंग-पॉइंट जोड़ के मामलों Infinityऔर -Infinityकिनारे का शोषण नहीं करता है । यह न तो इंटरनेट एक्सप्लोरर 8 और नीचे और न ही ऑप्ट-इन ईएस 5 सख्त मोड में काम करता है। मैं withबयान और गेटर्स को विशेष रूप से "उन्नत" विशेषताओं को नहीं कहूंगा ।

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

: जोड़ने के लिए संपादित ऊपर चाल का उपयोग कर के बिना भी संभव है withऔर getके रूप में द्वारा नोट, एंडी ई में जावास्क्रिप्ट में गोल्फ के लिए सुझाव और भी द्वारा jncraton इस पृष्ठ पर:

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

एक अच्छी अवधारणा - xएक फ़ंक्शन कॉल करना, हालांकि यह एक चर पढ़ने की तरह दिखता है। मैं बाएं से दाएं मूल्यांकन क्रम मानता हूं, लेकिन जेएस (सी के विपरीत) में निर्दिष्ट होने के बाद से यह ठीक है।
ugoren

14

निम्नलिखित मानकों का अनुपालन सी नहीं है , लेकिन केवल 64-बिट प्लेटफॉर्म के बारे में काम करना चाहिए:

int (*x)[0x2000000000000000];

सिद्धांत रूप में महान, लेकिन गलत तरीके से लागू किया गया लगता है। x2 ^ 61 के चरणों में वेतन वृद्धि होगी, तो x + 8समान होगा x
ugoren

@ यूगोरन, यह मेरे लिए लिनक्स पर 4-बाइट के साथ काम करता है int
हान

आप बिल्कुल सही कह रहे है। मैं इस तथ्य को याद करता हूं कि यह एक सरणी है 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

एपीएल भी, अनंत नहीं है यह है कि अभी तैरता काफी सटीक के बीच अंतर बताने के लिए नहीं हैं 1.000.000.000.000.000और 1.000.000.000.000.002। यह, जहाँ तक मुझे पता है, एपीएल में ऐसा करने का एकमात्र तरीका है।


मैं वास्तव में इसे पसंद करता हूं क्योंकि यह फ्लोट प्रिसिजन का फायदा उठाने का पहला जवाब है।
एंड्रयूके

1
@AndrewKS: वास्तव में पॉल आर थोड़ा पहले था।
एमएसलटर्स

8

पर्ल 6

मैं इस समाधान को पहले नहीं देख कर हैरान हूं। वैसे भी, समाधान है - क्या हुआ अगर xहै 0और 2एक ही बार में? my \xइस उदाहरण में sigilless वैरिएबल की घोषणा करता है - यह प्रश्न xपर्ल-स्टाइल के बारे में नहीं, के बारे में पूछता है $x?? !!त्रिगुट ऑपरेटर है।

$ 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

पायथन 2.X (कैश्ड पूर्णांक के पुनर्परिभाषित का उपयोग करके)

मैंने देखा है कि अजगर के जवाबों ने सभी वर्गों को परिभाषित किया है जो +ऑपरेटर को फिर से परिभाषित करते हैं । मैं अजगर के लचीलेपन के एक और भी निम्न-स्तरीय प्रदर्शन के साथ जवाब दूंगा। (यह एक अजगर-विशिष्ट स्निपेट है)

अजगर में, पूर्णांकों को C में इस तरह कमोबेश संग्रहीत किया जाता है:

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

यही कारण है, एक के साथ एक struct है 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

पर्ल

एक पैकेज चर पर साइड-इफेक्ट के साथ एक सबरूटीन का उपयोग करना:

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

आउटपुट: true!


1
sub x{}"काम करता है" के रूप में अच्छी तरह से .. (कम से कम मेरे 5.10.1 में), लेकिन मैं समझ नहीं पा रहा हूँ ..
mykhal

2
क्योंकि sub x{}या तो अपरिभाषित या एक खाली सूची देता है, दोनों एक संख्यात्मक शून्य हैं। और x + 2 को x (+2) के रूप में पार्स किया जाता है। perl -MO=Deparseपता चलता हैprint "true\n" if x() == x(2);
1

यह कमाल है, @mykhal और @Perleone!
मेमोवे

7

अजगर

फ्लोटिंग पॉइंट प्रिसिजन का शोषण यह बहुत सरल बनाता है।

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

इसे कम करने के लिए विशिष्ट प्रणाली को अतिरिक्त आयात की आवश्यकता होती है

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

यह अन्य भाषाओं में भी काम करना चाहिए। यह काम करता है क्योंकि मशीन के लिए 100000000000000000000.0 और 100000000000000002.0 का पुनर्मुद्रण बिल्कुल वैसा ही है, क्योंकि मशीन के अंदर फ्लोटिंग पॉइंट्स का प्रतिनिधित्व किया जाता है। http://en.wikipedia.org/wiki/IEEE_floating_point देखें अधिक जानकारी के लिए।

तो यह मूल रूप से किसी भी भाषा में काम करेगा जो आपको पूर्णांक को फ़्लोट में जोड़ने की अनुमति देता है और इसका परिणाम फ़्लोट होना है।


6

ऑपरेटर ओवरलोडिंग पर आधारित C ​​++ का समाधान यहां दिया गया है। यह एक से अंतर्निहित रूपांतरण पर निर्भर करता है enumएक करने के लिए 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;
}

आप उपयोग कर सकते हैं std::boolalphaके बजाय ?:
जॉन प्यूडी

5

मुझे पता है कि यह एक कोड चुनौती है ... लेकिन मैंने इसे गोल्फ किया। माफ़ करना।

रूबी - 13 वर्ण - अनंत समाधान

x=1e17;x==x+2

सच लौटाता है

रूबी - 41 अक्षर - ओप ओवरलोडिंग समाधान

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

यदि प्रश्न का थोड़ा सा दोहन करना ठीक है, तो मैं कुछ नए जावा जोड़ूंगा। चाल निश्चित रूप से नई नहीं है, लेकिन शायद यह दिलचस्प है कि यह जावा में संभव है।

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 समाधान मेरे जावास्क्रिप्ट समाधान के समान काम करता है। मैंने एक प्रीप्रोसेसर का उपयोग नहीं किया फिर भी समाधान तुच्छ लगता है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.