अनिर्धारित व्यवहार मेरी बिल्ली को मार डाला [बंद]


82

अपरिभाषित व्यवहार ने मेरी बिल्ली को मार डाला

यह सर्वविदित है कि अपरिभाषित व्यवहार आपकी बिल्ली [प्रशस्ति पत्र की जरूरत] को मार सकता है ।
लेकिन यह कर सकते हैं?

आपका कार्य

  1. एक कार्यक्रम लिखें जो अपरिभाषित व्यवहार को आमंत्रित करता है।
  2. एक परिदृश्य का वर्णन करें जो उपरोक्त कार्यक्रम के साथ शुरू हो रहा है, जिसके परिणामस्वरूप आपके स्वामित्व में रहने के दौरान फेलिस कैटस अपने जीवन को समाप्त करता है, उपरोक्त यूबी के परिणामस्वरूप।
  3. परिदृश्य में प्रत्येक चरण के लिए संभाव्यता का अनुमान लगाएं।
  4. कुल संभावना की गणना करें कि कार्यक्रम का एक भी रन आपकी बिल्ली को मार देगा।

नियम

  1. यह एक , इसलिए यदि आप कर सकते हैं तो रचनात्मक रहें।
  2. यह एक प्रोग्रामिंग से संबंधित चुनौती है, इसलिए घटनाओं की श्रृंखला ज्यादातर कंप्यूटर के भीतर होनी चाहिए, वास्तविक दुनिया में नहीं (निश्चित रूप से, अगर आपकी बिल्ली है तो वास्तविक दुनिया तक पहुंचना होगा)।
  3. यदि आप ऐसी भाषा चुनते हैं जिसमें अपरिभाषित व्यवहार नहीं है, तो कुछ इसी तरह का उपयोग करें।
  4. आपके उत्तर के निर्माण में किसी भी जानवर को नुकसान नहीं पहुंचाया जा सकता है।

स्कोरिंग

वोट की गणना के साथ-साथ परिदृश्य की कुल संभावना (जो 1 से अधिक नहीं हो सकती)।

C में उदाहरण:

main(){printf();}

परिदृश्य:

  1. printfढेर से कचरा के साथ बुलाया - अपरिभाषित व्यवहार। प्रोबेलिटी: 100%।
  2. पहला पैरामीटर स्ट्रिंग होना होता है Your cat is ugly!। प्रोबेलिटी: (1/256) 17 = (1.148 * 10 -37 )%।
  3. संदेश देखकर, आप अपनी बंदूक उठाएं और अपनी बिल्ली को गोली मार दें। प्रायिकता: 3%।
  4. बिल्ली मर जाती है। संभाव्यता: 93%।

कुल संभावना: (3.202 * 10 -39 )%।


50
1) अपरिभाषित व्यवहार का आह्वान करें 2) मात्र इस तथ्य से प्रेरित रहें कि आप अपरिभाषित व्यवहार का आह्वान कर सकते हैं, और लंबा जीवन जी सकते हैं, 3) बुढ़ापे में बिल्ली की मृत्यु हो जाती है। कुल संभावना: 100%
Geobits

5
अगर मैं इतनी देर तक प्रोग्रामिंग करने के बाद यूबी बनाने के लिए एक ही तरीके से नहीं आ पाता तो @ ऑबरन मैं खुद को मार देता । तब बिल्ली अब मेरे कब्जे में नहीं होगी। यूबी को आमंत्रित करना मुझे जीवित रखता है, ताकि "... अपने स्वामित्व में रहते हुए अपने जीवन को समाप्त कर सके , परिणामस्वरूप ..."। परिचर पार्सिंग एफटीडब्ल्यू।
Geobits

8
यदि कोई व्यक्ति इस catआदेश या उस प्रकार की किसी चीज़ को मारने के लिए इसे पुनः स्थापित करता है, तो मुझे अधिक आश्चर्य होगा ।
केशलाम

5
-1 मुझे बिल्लियों से प्यार है। क्यों बिल्लियाँ? कत्ल क्यों नहीं किया?
VX

22
यदि एक बिल्ली को खाया जाना है, तो पायथन एक समाधान है।
निकोलस बारबुल्स्को

जवाबों:


113

सी

इस प्रश्न के अधिकांश उत्तरों ने इस प्रश्न की गलत व्याख्या की कि यह catUNIX प्रणाली पर प्रक्रिया को मार रहा था । यहां एक कार्यक्रम है जो प्रजाति फेलिस कैटस के जैविक जीवन के विघटन का कारण बन सकता है जैसा कि प्रश्न द्वारा निर्दिष्ट किया गया है।

यह उदाहरण विंडोज पर चलता है, लेकिन इसे iexplore -kस्थापित वेब ब्राउज़र को लॉन्च करने के लिए कमांड के साथ बदलकर आसानी से अधिकांश UNIX ऑपरेटिंग सिस्टम में पोर्ट किया जा सकता है।

#include <stdlib.h>
#include <stdio.h>    

int main() {
    char i; // uninitialised
    printf("Redirecting you to a website which will inform you how to properly feed your cat.");
    if (i != 42) {
         system("iexplore -k https://pets.stackexchange.com/questions/tagged/cats+diet");
    } else {
         system("iexplore -k https://cooking.stackexchange.com/questions/tagged/chocolate");
    }
    return 0;
}

यह कार्यक्रम उपयोगकर्ता को बिल्ली के आहार के बारे में सलाह देने का दिखावा करता है।

यह इंटरनेट एक्सप्लोरर शुरू करेगा और बिल्लियों को खिलाने के तरीके के बारे में बहुत सारे उपयोगी प्रश्नों को सूचीबद्ध करने के लिए पालतू जानवरों को निर्देशित करेगा। हालांकि, एक कम (1/256) मौका है कि यह उपयोगकर्ता को स्टैटेक्सचेंज को पकाने के बजाय यह सुझाव देगा कि चॉकलेट युक्त व्यंजन कैसे तैयार करें, जो बिल्लियों के लिए अत्यधिक विषैला है । मामले को बदतर बनाने के लिए, यह किओस्क मोड (फुलस्क्रीन) में इंटरनेट एक्सप्लोरर लॉन्च करेगा, जो एड्रेस बार को छुपाता है और गैर-तकनीकी-समझदार उपयोगकर्ता के लिए भागने में मुश्किल है।

यह चतुर उपयोग उपयोगकर्ता को अपनी बिल्ली चॉकलेट खिलाने में विश्वास दिलाएगा कि यह उसके लिए एक उपयुक्त आहार है, इस प्रकार वे अनजाने में इसे मार देते हैं।


3
कलम तलवार से शक्तिशाली है! :)
पीटर विटवेट

12
यह अब तक एकमात्र समाधान की तरह दिखता है, जिसमें वास्तव में बिल्ली को मारने का कोई वास्तविक मौका है। मुझे उकसाने के लिए मजबूर किया जाता है, हालांकि मुझे पूरी उम्मीद है कि कोई भी वास्तव में इसे व्यवहार में नहीं लाता है।
चार्ल्स स्टैट्स

43
Internet Explorer आपकी बिल्ली को खुद ही मार सकता है।
माइकल हैम्पटन

4
क्या आप परिदृश्य को जोड़ सकते हैं, कदम से कदम, कि बिल्ली को मारता है, संभावना विश्लेषण (उदाहरण के रूप में) के साथ? जैसा कि यह है, यह एक वैध उत्तर नहीं है।
बदसूरत

3
Internet Explorer का उपयोग करना ME में अपरिभाषित व्यवहार को प्रेरित करता है। - क्षमा करें, ऐसा कहना पड़ा।
tomsmeding

88

दे घुमा के

इसके अनुसार , INT_MIN % -1अनिर्धारित (क्या ???) नहीं हो सकता है, और इसलिए c / c ++ में लागू किसी भी भाषा के लिए परेशानी हो सकती है।

#!/bin/bash

cat <<< $((2**63%-1))

catजल्दी को मार डाला जाएगा, अगर माता पिता bashप्रक्रिया, दुर्घटनाओं जो या ऐसा नहीं हो सकता है।

मेरे वीएम पर मुझे यह आउटपुट मिलता है:

$ ./schroedinger.sh
./schroedinger.sh: line 3:  7805 Floating point exception(core dumped) cat <<< $((2**63/-1))
$ 

(मैं वास्तव में इस सवाल के लिए स्कोरिंग नहीं समझता, लेकिन यहाँ वैसे भी जाता है)

गणना करें $((2**63%-1))। क्रैश हमेशा बैश 4.2.25 पर होता है, लेकिन कुछ 3.x संस्करणों पर लटका हुआ लगता है। अधिक अनिश्चितता। मैं आपको सटीक संभावना बता सकता था, लेकिन हेइज़ेनबर्ग अनिश्चितता सिद्धांत के कारण मैं फिर एक ब्लैक होल नीचे गिर गया। या कुछ और। इसलिए मुझे लगता है कि हम सुरक्षित रूप से कह सकते हैं कि संभावना लगभग 42% है।


4
@ klingt.net: इसे "हियर स्ट्रिंग्स" कहा जाता है - यह बहुत अधिक गूगलेबल है ... यह इसके लिए शॉर्टकट हैecho $((-2**63/-1)) | cat
VX

14
असली का उपयोग करने के लिए +1 cat
एल्विन वोंग

1
@mardavi INT_MAX = 2^63 - 1। यदि हम 1 को जोड़ते हैं INT_MAX, तो 64 बिट नंबर स्पेस घूम जाता है और हम प्राप्त करते हैं INT_MIN। दूसरे शब्दों में हस्ताक्षरित 64 बिट पूर्णांक अंकगणित 2^63 == -2^63,। मैं इस्तेमाल किया जा सकता था -2**63, लेकिन बिना इस तरह के terseness को प्राथमिकता दी -, क्योंकि इस मामले में मॉड्यूलर अंकगणित समान है।
डिजिटल ट्रामा


1
क्या आप परिदृश्य को जोड़ सकते हैं, कदम से कदम, कि बिल्ली को मारता है, संभावना विश्लेषण (उदाहरण के रूप में) के साथ? जैसा कि यह है, यह एक वैध उत्तर नहीं है।
बदसूरत

40

सी (अनुक्रम बिंदु)

deadcat.c:

#include <stdio.h>
int main()
{
    int i=3;
    int k=0;
    k=i+(++i);
    if (k==7)
        printf("The cat is fine. k=i+(++i) =%d\n",k);
    else
        printf("Urgent Notice: Your cat has rabies. k=i+(++i) =%d\n",k);
}

निष्पादन (या नहीं):

$ clang -w deadcat.c -o deadcat; ./deadcat
The cat is fine. k=i+(++i) =7
$ gcc deadcat.c -o deadcat; ./deadcat
Urgent Notice: Your cat has rabies. k=i+(++i) =8

परिदृश्य और संभावना

यह मानते हुए कि इस कार्यक्रम को चलाने वाले पांच प्रतिशत लोग सी कोड को संकलित करने के लिए (बनाम 90 प्रतिशत जीसीसी का उपयोग करते हैं और 5 प्रतिशत अन्य सी कंपाइलरों का उपयोग करते हैं):

"बिल्ली ठीक है" होने की संभावना। = .050
 "तत्काल सूचना: आपकी बिल्ली को रेबीज है" होने की संभावना। = .950

 "आपकी बिल्ली को रेबीज" होने की प्रतिक्रिया की संभावना इसे नीचे रखकर = .040 है
 सूचना को अनदेखा करने की संभावना = .900
 उपचार के लिए बिल्ली को ले जाने की संभावना = ०.६०

 बिल्ली के रहने की कुल संभावना: .05 + .95 * (.90 + .06) = .962
 बिल्ली के मरने की कुल संभावना: .95 * .04 = .038
 जाँच करें: बिल्ली के रहने या मरने की कुल संभावना: = 1.000

स्पष्टीकरण:

k = i + (++ i) अनुक्रम बिंदुओं के बीच "i" पहुंचता है और बदलता है। संभावना कार्यक्रम द्वारा निर्धारित नहीं है; यह संकलक की पसंद पर निर्भर करता है, जो उपयोगकर्ता द्वारा बनाया गया है। "अपरिभाषित" का अर्थ "यादृच्छिक" नहीं है।

Https://stackoverflow.com/questions/4176328/undefined-behavior-and-fterenceence-points देखें


4
विभिन्न संकलक के साथ व्यवहार का प्रदर्शन करने के लिए +1।
ntoskrnl

1
अनुकूलन स्तर भी व्यवहार को बदल सकता है
शाफ़्ट फ्रीक

1
@ratchet freak: हाँ, लेकिन मैं इसे इस विशेष समस्या के साथ प्रदर्शित नहीं कर सका। मैंने कोशिश की -O0, -O1, -O2 और -O3 ने कई gcc वर्जन पर gcc-4.2.3 से लेकर gcc-4.8.2 तक, और SunOS पर cc-5.0 की, लेकिन उन सभी ने कैट को मार दिया।
ग्लेन रेंडर्स-पीरसन

2
क्या आप परिदृश्य को जोड़ सकते हैं, कदम से कदम, कि बिल्ली को मारता है, संभावना विश्लेषण (उदाहरण के रूप में) के साथ? जैसा है, यह मान्य उत्तर नहीं है।
ugoren

1
मैंने यह मान लिया कि इलाज के लिए पशु-पक्षियों को ले जाने वाली सभी बिल्लियाँ जीवित रहेंगी। संभवत: उनमें से कुछ एक संचार योग्य बीमारी को पकड़ने या पशु चिकित्सा कदाचार से मर जाएंगे। यह कहने के लिए अंतिम संभावनाओं को थोड़ा बदल सकता है ।96 / .04
ग्लेन रैंडर्स-पीरसन

37

सी

पृष्ठभूमि की कहानी

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

हम एक विस्तारित छुट्टी पर जा रहे थे, लेकिन वह पशु चिकित्सक के कार्यालय में बिल्ली पर चढ़ना नहीं चाहता था। वह इसके बारे में चिंतित थी कि यह बीमारी से जूझ रहा है या गलत व्यवहार किया जा रहा है। मैंने एक स्वचालित बिल्ली फीडर बनाया ताकि हम इसे घर पर छोड़ सकें। मैंने सी में माइक्रोकंट्रोलर के फर्मवेयर को लिखा था। फाइल में mainनीचे दिए गए कोड के समान दिख रहा था ।

हालाँकि, मेरी पत्नी भी एक प्रोग्रामर है और बिल्ली के प्रति मेरी भावनाओं को जानती है, इसलिए उसने इसे घर पर छोड़ने के लिए सहमत होने से पहले एक कोड-समीक्षा पर जोर दिया। उसकी कई चिंताएँ थीं, जिनमें शामिल हैं:

  • main मानकों के अनुरूप हस्ताक्षर नहीं है (एक होस्ट किए गए कार्यान्वयन के लिए)
  • main मान वापस नहीं करता है
  • tempTmके mallocबजाय बुलाया गया था के बाद से uninitialized प्रयोग किया जाता हैcalloc
  • वापसी का मूल्य mallocनहीं डाला जाना चाहिए
  • माइक्रोकंट्रोलर समय गलत या रोल ओवर हो सकता है (Y2K या यूनिक्स समय 2038 समस्याओं के समान)
  • elapsedTimeचर पर्याप्त रेंज नहीं हो सकता है

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

, पूरी तरह से काल्पनिक परिदृश्य, कोई चिंता नहीं।


कोड

#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

//#include "feedcat.h"
// contains extern void FeedCat(struct tm *);
// implemented in feedcat.c
// stub included here for demonstration only
#include <stdio.h>
// passed by pointer to avoid putting large structure on stack (which is very limited)
void FeedCat(struct tm *amPm)
{
    if(amPm->tm_hour >= 12)
        printf("Feeding cat dinner portion\n");
    else
        printf("Feeding cat breakfast portion\n");
}

// fallback value calculated based on MCU clock rate and average CPI
const uintmax_t FALLBACK_COUNTER_LIMIT = UINTMAX_MAX;

int main (void (*irqVector)(void))
{
    // small stack variables
    // seconds since last feed
    int elapsedTime = 0;
    // fallback fail-safe counter
    uintmax_t loopIterationsSinceFeed = 0;
    // last time cat was fed
    time_t lastFeedingTime;
    // current time
    time_t nowTime;

    // large struct on the heap
    // stores converted calendar time to help determine how much food to
    // dispense (morning vs. evening)
    struct tm * tempTm = (struct tm *)malloc(sizeof(struct tm));

    // assume the cat hasn't been fed for a long time (in case, for instance,
    // the feeder lost power), so make sure it's fed the first time through
    lastFeedingTime = (size_t)(-1);

    while(1)
    {
        // increment fallback counter to protect in case of time loss
        // or other anomaly
        loopIterationsSinceFeed++;

        // get current time, write into to nowTime 
        time(&nowTime);

        // calculate time since last feeding
        elapsedTime = (int)difftime(nowTime, lastFeedingTime);

        // get calendar time, write into tempTm since localtime uses an
        // internal static variable
        memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));

        // feed the cat if 12 hours have elapsed or if our fallback
        // counter reaches the limit
        if(  elapsedTime >= 12*60*60 || 
             loopIterationsSinceFeed >= FALLBACK_COUNTER_LIMIT)
        {
            // dispense food
            FeedCat(tempTm);

            // update last feeding time
            time(&lastFeedingTime);

            // reset fallback counter
            loopIterationsSinceFeed = 0;
        }
    }
}

अपरिभाषित व्यवहार:

उन लोगों के लिए जो खुद को यूबी खोजने से परेशान नहीं करना चाहते हैं:

इस कोड में निश्चित रूप से स्थानीय-विशिष्ट, अनिर्दिष्ट और कार्यान्वयन-परिभाषित व्यवहार है, लेकिन यह सभी सही ढंग से काम करना चाहिए। समस्या कोड की निम्न पंक्तियों में है: पॉइंटर को उस ऑब्जेक्ट के बजाय

struct tm * tempTm //... //... memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpyअधिलेखित करता tempTMहै, जो स्टैक को मिटाता है। यह अन्य चीजों के अलावा ओवरराइट करता है, elapsedTimeऔर loopIterationsSinceFeed। यहाँ एक उदाहरण रन है जहाँ मैंने मूल्यों को छापा है:

pre-smash : elapsedTime=1394210441 loopIterationsSinceFeed=1 post-smash : elapsedTime=65 loopIterationsSinceFeed=0


बिल्ली को मारने की संभावना:

  • विवश निष्पादन पर्यावरण और निर्माण श्रृंखला को देखते हुए, अपरिभाषित व्यवहार हमेशा होता है।
  • इसी तरह, अपरिभाषित व्यवहार हमेशा बिल्ली के फीडर को उद्देश्य के रूप में काम करने से रोकता है (या यों कहें, इसे "इच्छित रूप से" काम करने की अनुमति देता है)।
  • यदि फीडर काम नहीं करता है, तो यह बहुत संभावना है कि बिल्ली मर जाएगी। यह एक बिल्ली नहीं है जो खुद के लिए रोक सकता है, और मैं पड़ोसी को उस पर देखने के लिए कहने में विफल रहा।

मुझे लगता है कि बिल्ली संभावना 0.995 के साथ मर जाती है ।


यह (पहले) &मेमसीपी में है, है ना?
स्कोर_उंडर

@Score_Under हाँ, मुझे उत्तर को थोड़ा संपादित करने दें। मैंने अपरिभाषित व्यवहार का दोहन करने के अन्य तरीकों के साथ खेला, लेकिन अधिकांश और भी स्पष्ट थे।
जेरी

1
एक बिल्ली को मारने के लिए +1, नहीं cat
केविन

31

दे घुमा के

क्लासिक संस्करण

cat & # This is your cat.
pkill -$RANDOM cat

इसकी सीमा में सभी बिल्लियों को मारने का लाभ है ।

ध्यान दें कि प्रक्रिया को तुरंत रोक दिया जाता है, इसलिए pkill के एकल आह्वान के साथ इसे समाप्त करने का एकमात्र तरीका SIGKILL (9) भेजना है।

इसलिए:

p(SUCCESS) = p(RANDOM == 9) = 0.0275 %


क्वांटम संस्करण

schroedinger=/dev/null             # We'll need this guy.
heisenberg=/dev/urandom            # Also needed, for uncertainty principle.
cat $heisenberg > $schroedinger &  # Steal cat from Heisenberg and give it to Schrödinger.
felix=$!                           # Name cat for future references.
exec 2> $schroedinger              # Send all results to Schrödinger.
kill -SIGSTOP $felix               # Catch Felix and put him into a box.
if (($RANDOM & 1))                 # Flip a coin.
then kill $felix                   # Heads: Kill! Kill! Kill!
fi                                 # By now, Felix can be thought of as both alive and dead.
read -sn 1                         # Wait for somebody to open the box.
kill -SIGCONT $felix               # Let him open it.
if ps p $felix > $schroedinger     # Let Schrödinger check on Felix.
then echo The cat is alive.        # Hooray for tails!
else echo The cat is dead.         # At least, now we know.
fi                                 # This concludes the experiment.
kill -SIGKILL $felix               # Felix is no longer required.

प्रयोग के दौरान बिल्ली को मारने की संभावना: 50%


+1 लेकिन यह मेरे विचार से अधिक संभावना है। SIGINT (2), SIGQUIT (3), SIGABRT (6), SIGPIPE (13) और SIGTERM (15), कम से कम, इसे यहां मारता है।
l0b0

@ l0b0: यह नहीं है, कम से कम तुरंत नहीं। cat &टर्मिनल से पढ़ने का प्रयास करता है, लेकिन नहीं कर सकता। आपके द्वारा बताए गए संकेतों (और कुछ और) में से कोई भी काम करेगा यदि आप SIGCONT (18) को बाद में भेजते हैं। इसके अलावा, मैं मानता हूँ कि फांसी और समाप्त बिल्ली के रूप में ही होगा की मौत हो गई है, लेकिन दखल यह संतोषजनक प्रतीत नहीं होता ...: पी
डेनिस

3
अपरिभाषित व्यवहार भाषा की एक विशेषता का उपयोग कर रहा है जिसे अपरिभाषित के रूप में निर्दिष्ट किया गया है । अर्थात्, भाषा डिजाइनरों ने उद्देश्यपूर्ण रूप से कार्यान्वयन को आसान बनाने के लिए, या यह संकेत देने के लिए कि कुछ भी वैध कार्यक्रम में उपयोग नहीं किया जाना चाहिए, को इंगित करने के लिए कुछ कृत्रिम निर्माण के व्यवहार को छोड़ दिया है । अपरिभाषित व्यवहार का आमतौर पर यादृच्छिक संख्या पीढ़ी से कोई लेना-देना नहीं होता है, और यहां कोई अपरिभाषित व्यवहार नहीं किया जाता है।
ओरेगॉनट्रिल

@OregonTrail: नियम कहते हैं कि यदि आप ऐसी भाषा चुनते हैं जिसमें अपरिभाषित व्यवहार नहीं है, तो कुछ इसी तरह का उपयोग करें। बैश में अपरिभाषित व्यवहार नहीं है, इसलिए मैंने यादृच्छिक संख्याओं का उपयोग किया।
डेनिस

3
बाश के वातावरण में बहुत सारे अपरिभाषित व्यवहार हैं जिनका उपयोग किया जा सकता है। उदाहरण के लिए, @DigitalTrauma Bash के प्रिंटफ़ द्वारा दिए गए उत्तर में सिस्टम के प्रिंटफ़ का भी उपयोग किया गया है जिसमें बहुत सारे अपरिभाषित व्यवहार हैं।
ओरेगॉनट्रिल

17

सी

ध्यान दें कि यह केवल लिनक्स पर काम करता है।

main() {
  FILE *f = fopen("skynet", "w");
  srand(time(0));
  while(rand() != rand())
    fputc(rand()%256, f);
  fclose(f);
  system("chmod +x skynet");
  system("./skynet");
}
  1. किसी फ़ाइल में यादृच्छिक डेटा लिखें और इसे लागू करें (100%)
  2. रैंडम डेटा स्काईनेट (1x10 ^ -999999999999999999999999999999999999999999999999999999999999) .pro) के स्रोत कोड होने के लिए होते हैं।
  3. परिणामस्वरूप प्रलयकाल में बिल्ली की मृत्यु हो जाती है (99.999%)

कुल संभावना: 1x10 ^ -99999999999999999999999999999999999999999999999999999999999999, aprox।


हम्मम, स्काईनेट क्या है?
सर्ज बोर्श

20
अपरिभाषित व्यवहार कहाँ है?
ugoren

@ सर्जबोरश: en.wikipedia.org/wiki/Skynet_(Terminator)
cHao

1
मुझे लगता है कि यादृच्छिक सामग्री वाली फ़ाइल चलाना वास्तव में परिभाषित नहीं है।
11684

2
@ 11684, यदि सामग्री स्काईनेट का कोड होता है, तो स्काइनेट के प्रोग्रामर को पता होता है कि वे क्या कर रहे हैं, कोई अपरिभाषित व्यवहार नहीं है।
ugoren

15

सी ++

आपकी कैट डेड और अलाइव दोनों है जब तक आप उत्सुक नहीं हैं। तब आपको एहसास होता है कि 0.5 संभावना है कि आपकी बिल्ली मर चुकी है।

#ifdef WIN32
#pragma warning(disable: 4700)
#endif
#include <random>
#include <iostream>
#include <vector>
#include <climits>
#include <memory>
class Cat
{
public:
    enum class State {DEAD, ALIVE};
    Cat()
    {
        int x; // Uninitialized Variable on Stack
        if (x % 2 == 0) // Is the Uninitialized Variable even? 50-50
        {
            m_dead = State::DEAD;

        }
        else
        {
            m_dead = State::ALIVE;
        }
    };
    operator State() //Check if your Cat is Dead / Alive
    {
        if (m_dead == State::DEAD)
        {
            delete this; //Boom Cat is dead
            std::cout<<"Your Curiosity killed your Cat"<<std::endl;
            return false;
        }
        return m_dead;
    }
private:
    State m_dead;
};

class Schrödinger
{
public:
    Schrödinger(size_t size):m_size(size)
    {
        for(size_t i = 0; i < size; i++)
        {
            cats.push_back(new Cat());
        }
    }
    ~Schrödinger()
    {
    }
    void Curiosity()
    {
        std::default_random_engine generator;
        std::uniform_int_distribution<int> distribution(0,m_size);
        if(*cats[distribution(generator)] == Cat::State::ALIVE)
        {
            std::cout<<"You Cat is alive and still kicking" <<std::endl;
        }
    }
private:
    std::vector<Cat *> cats;
    size_t m_size;
};
int main()
{
    int size;    
    std::cout<<"How Big is Your Example Space ?";
    std::cin>>size;
    Schrödinger your(size);
    your.Curiosity();
    return 0;

}

क्या आप इसके this->m_deadबाद एक्सेस कर सकते हैं delete this?
ब्रायन चेन

@ ब्रायनचेन: एक वापसी याद आ रही थी। आपको इसे इंगित करने के लिए धन्यवाद :-)
अभिजीत

öसी ++ में एक वैध प्रतीक नहीं लगता है। शायद इसके साथ बदलें oe
रसलान

13

सी

लिनक्स पर चलता है।

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void f(char x) {
    if(sleep(1)==x) system("killall cat");
}
int main() {
    char x; // uninitialised
    system("cat /dev/urandom &");
    f(x);
    return 0;
}

बिल्ली को मारने की संभावना: 1/256 ( sleep(1)रिटर्न 0, इसलिए इसे xशून्य होने पर मार दिया जाएगा ।)

एक बोनस के रूप में, यह आपके सिस्टम पर वर्तमान में चल रही सभी बिल्लियों को मारता है।


यदि आप बिल्लियों से बहुत नफरत करते हैं, तो मैं आपके सामने प्रस्तुत हूं:

द कैट सेंटीपीड (बाश)

echo "Hello World"|cat|cat|cat

इस तथ्य के आधार पर कि, द ह्यूमन सेंटीपीड (प्रथम अनुक्रम) में , कुत्ते के सभी तीन कुत्ते सेंटीपीड की मृत्यु हो गई, और मानव सेंटीपीड के तीन में से दो लोगों की मृत्यु हो गई, मेरा अनुमान है कि एक बिल्ली को मारने की संभावना 5/6 है।


कैट सेंटीपीड वास्तव में मजाकिया है
सर्ज बोर्श

बिल्ली सेंटीपीड "वास्तविक" उत्तर होना चाहिए।
इस्माइल मिगुएल

@ इस्माइल मिगुएल तुम शायद सही हो, मैंने सी कोड हटा दिया है। पहले तो यह एक मजाक के रूप में था, लेकिन बाद में मुझे एहसास हुआ कि मैं इसे वास्तविक उत्तर देने के लिए इसे फिर से लिख सकता हूं।
ace_HongKongInd डिपेंडेंस

आप अपना सी कोड रख सकते हैं, मेरे पास और इसके खिलाफ कुछ भी नहीं है। मैं सिर्फ इतना है कि बैश संस्करण एक उत्तर के रूप में अधिक उपयुक्त था।
इस्माइल मिगुएल

@ इस्माइल मिगुएल नाह, कि सी कोड वैसे भी काफी बेवकूफ था
ace_HongKongInd डिपेंडेंस

9

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

~"cat".localeCompare("dead")
  ? "Cat is dead"
  : "Cat is fine"

निष्पादन:

  • क्रोम: में परिणाम"Cat is fine"
  • फ़ायरफ़ॉक्स: में परिणाम"Cat is dead"

स्पष्टीकरण:

15.5.4.9 String.prototype.localeCompare (वह)

कार्यान्वयन-परिभाषित फैशन में दो स्ट्रिंग्स की तुलना की जाती है

ग्लेन रैंडर्स-पीरसन का हवाला देते हुए, संभावना कार्यक्रम द्वारा निर्धारित नहीं है; यह ब्राउज़र की पसंद पर निर्भर करता है, जो उपयोगकर्ता द्वारा बनाया गया है।


एफएफ 27 पर प्रतिलिपि प्रस्तुत करने योग्य नहीं है। आप किस संस्करण पर परीक्षण कर रहे हैं?
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 19

-1: अपरिभाषित व्यवहार और कार्यान्वयन-परिभाषित व्यवहार पूरी तरह से अलग हैं।
श्वेतार्क

2
@whitequark नहीं वे नहीं हैं। यह एक अपरिभाषित परिणाम वाला एक परिभाषित कार्य है। अगाध अपरिभाषित व्यवहार।
जॉर्ज रीथ

1
@whitequark मैं यहाँ कोई C नहीं देखता हूँ। जहाँ तक जावास्क्रिप्ट का संबंध है, क्या जावास्क्रिप्ट के पास अपरिभाषित व्यवहार है, ऐसा लगता है कि कार्यान्वयन परिभाषित व्यवहार निष्क्रिय है।
जॉर्ज रीथ

1
@whitequark कोई और नहीं भ्रमित है। एक शब्द एक शब्द है, मुझे यह बताने के लिए एक समिति की आवश्यकता नहीं है कि इसका क्या मतलब है।
जॉर्ज रीथ

9
int foo() {}

void main() {
    int x = foo();
}

फ़ंक्शन के एक मान को पढ़ना अपरिभाषित व्यवहार में एक मान परिणाम वापस करने के लिए माना जाता है। अब, यह स्पष्ट है, [उद्धरण वांछित] कि "हर बार जब आप अपरिभाषित व्यवहार तक पहुंचते हैं, तो भगवान एक किटी को मारता है।" इसका उपयोग करते हुए हम निष्कर्ष निकालते हैं:

  • संभावना आप अपरिभाषित व्यवहार तक पहुँच - 100%
  • संभावना है कि यह आपकी किटी है जिसे भगवान ने मार दिया - 1/200 000 000 क्यों देखें
  • तो संभावना 0.0000005% है

दुनिया में सभी बिल्लियों को भगाने के लिए लूप द्वारा आसानी से बढ़ाया जा सकता है।


5
आपकी संभावना 100 गुना बहुत अधिक है (200M बिल्लियों, 2M नहीं)।
ugoren

मैं पेरेन्ट्स में हूं। :)
पेट्र

1
यह percents में है, और अभी भी यह 100 गुना अधिक है।
बदसूरत

आप सही हैं, मैं अब और संख्या नहीं पढ़ सकता, जाहिरा तौर पर।
पेट्र

यह गलत है। यदि कॉल रिटर्न रिटर्न का उपयोग करने का प्रयास करता है, तो यूबी का केवल आह्वान किया जाता है। अन्यथा गैर-शून्य रिटर्न प्रकार के साथ किसी फ़ंक्शन के अंत तक चलना पूरी तरह से कानूनी और अच्छी तरह से परिभाषित है।
आर ..

5

जावा (कचरा संग्रह)

हालांकि कोड System.gc को लागू कर सकता है () यह सुनिश्चित नहीं करता है कि गारबेज कलेक्टर सभी अप्रयुक्त वस्तुओं को एकत्रित करेगा। इस प्रकार, निम्नलिखित कोड के लिए, यह अप्रत्याशित है कि बिल्ली को मार दिया जाएगा या नहीं।

public class KillTheCat {
    public static void main(String[] args) throws InterruptedException {
        KillTheCat cat = new KillTheCat();
        cat = null;
        System.gc();
        System.out.println("Cat is still alive.");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Cat has been killed.");
        System.exit(0);
    }
}

संभावना की गणना नहीं की जा सकती है।

ध्यान दें कि अभी भी एक मौका है कि बिल्ली को "पुनर्जीवित" किया जाएगा यदि sysout के बाद और System.exit (0) से पहले GC थ्रेड में एक संदर्भ स्विच है, लेकिन मैंने अवधारणा को सरल रखने के लिए इसे कवर नहीं करना पसंद किया।


1
यह अच्छा नहीं है। लिखित रूप में यह कोड लगभग दोनों को हमेशा प्रिंट करेगा। लाइन के System.out.close()बाद जोड़ना बेहतर होगा System.out.println("Cat is still alive.");
Durron597

जहां तक ​​मैं समझता हूं, "लगभग हमेशा" सवाल के अप्रत्याशित पहलू से मेल खाता है।
user3001267

5

किसी को भी वास्तव में हत्या (ए) के बारे में सोचा है cat?

[ $[ $RANDOM % 6 ] == 0 ] && rm /bin/cat || echo Meow

catमरने की संभावना

संभावना के लिए ... मुझे लगता है कि हमें कुछ मामलों में अंतर करने की आवश्यकता है:

  1. विंडोज उपयोगकर्ता : संभवतः इसे निष्पादित करने में सक्षम नहीं होगा। मरने की संभावना catबहुत कम है, सुरक्षित रूप से शून्य माना जा सकता है। यदि वह Cygwin स्थापित है, तो वह यूनिक्स उपयोगकर्ता के रूप में गिना जाएगा।
  2. यूनिक्स उपयोगकर्ता, रूट विशेषाधिकारों के बिना चल रहा है : हत्या catविफल रहेगी।
  3. यूनिक्स उपयोगकर्ता, रूट विशेषाधिकारों के साथ चल रहा है : जबकि प्रत्येक कॉल केवल cat1/6 के अवसर के साथ एस को मार देगा, वह बहुत अप्रत्याशित रूप से तब तक दोहराएगा जब तक कि कोई अप्रत्याशित घटना न हो। सामान्यता के नुकसान के बिना, मुझे लगता है catकि निश्चित रूप से मर जाएगा।

कुल मिलाकर संभावना इस बात पर निर्भर करती है कि उपयोगकर्ता कैसे मिश्रित हैं और यह निर्धारित करना कठिन है। लेकिन हम निश्चित रूप से कह सकते हैं: विंडोज बिल्ली के बच्चे के लिए एक सुरक्षित जगह है।

नियमों के पालन के लिए परीक्षण

आपके उत्तर के निर्माण में किसी भी जानवर को नुकसान नहीं पहुंचाया जा सकता है।

यह जानवरों को नहीं मारता था, जवाब अमेरिकी ह्यूमैन एसोसिएशन द्वारा अनुमोदित है ।

$ file `which cat`
/bin/cat: Mach-O 64-bit executable x86_64

स्पष्ट रूप से साबित होता है कि catकोई जानवर नहीं है (जब तक fileकिसी प्रकार की छिपी हुई फ़ाइल प्रकार विरासत में नहीं पता है)।


5

सी

यदि आपकी बिल्ली का नाम बहुत लंबा है, तो वह मर जाती है। getsबिल्ली की मृत्यु का कारण बनता है, अन्य समस्याओं के साथ।

#include <stdio.h>
#include <stdbool.h>

/* Stores instances of cats. */
struct cat {
    /* 6 bytes are more than enough. */
    char name[6];

    /* Stores whether your cat is dead. */
    bool dead;
};

int main(void) {
    /* This is your cat. */
    struct cat your_cat;
    /* It lives. */
    your_cat.dead = false;
    /* Determine its name. */
    printf("Your cat name: ");
    gets(your_cat.name);

    /* Output the cat state. */
    const char *state = your_cat.dead ? "dead" : "alive";
    printf("Your cat, %s, is %s.\n", your_cat.name, state);

    return your_cat.dead;
}

4

हास्केल

import Acme.Missiles
import System.IO.Unsafe
main = print (unsafePerformIO launchMissiles, undefined)

यहाँ, हम लागू unsafePerformIOकरने के लिए एक कार्रवाई है कि नमूदार दुष्प्रभाव । यह हमेशा अपरिभाषित व्यवहार है, कम से कम इतना प्रभाव का क्रम है। इसलिए या तो कार्यक्रम पहले मूल्यांकन करने की कोशिश में दुर्घटनाग्रस्त हो जाएगा undefined(कि एक, विडंबना यह है कि अपरिभाषित व्यवहार नहीं है: इसमें कभी भी ऐसा मूल्य नहीं होना चाहिए जो कार्यक्रम को किसी और चीज के साथ ले जाने की अनुमति दे), या यह वास्तव में गंभीर अंतरराष्ट्रीय को प्रभावित करेगा दुष्प्रभाव। उस स्थिति में, जीवित रहने का मौका केवल 0.001% है

बिल्ली को मारने की संभावना इस प्रकार: 49.9995%।


3

Thue

चूँकि प्रश्न एक ऐसी भाषा के लिए अनुमति देता है जिसमें अपरिभाषित व्यवहार नहीं होता है जब तक कि प्रभाव समान नहीं होता है, मैं थ्यू को इसके गैर-नियतात्मकता के लिए चुनता हूं जिसमें यह चुनने के लिए कि कौन से नियम को निष्पादित करना है जब 1 से अधिक नियम हैं जो वर्तमान पर लागू किया जा सकता है राज्य।

कार्यक्रम को माइक्रोवेव ओवन के लिए नियंत्रक में खिलाया जाएगा, जिसके अंदर मेरी बिल्ली है। माइक्रोवेव ओवन का दरवाजा बंद है और एक जिप टाई द्वारा प्रबलित है। कार्यक्रम का आउटपुट तय करेगा कि माइक्रोवेव ओवन बिल्ली को माइक्रोवेव करना शुरू करता है या नहीं।

  • यदि आउटपुट 0 है, तो हम जीवित स्तनपायी (जो वर्तमान में अपर्याप्त शोध किया गया है) पर माइक्रोवेव के लंबे समय तक प्रदर्शन के प्रभाव पर प्रयोग शुरू करेंगे।
  • यदि आउटपुट 1 है, तो हम सिर्फ इस तथ्य से संतुष्ट होंगे कि बिल्ली ने अपने 9 जीवन में से एक को खो दिया है और इसे बाहर निकाल दिया है।

i::=~0
i::=~1
::=
i

बिल्ली को मारने की संभावना दुभाषिया के कार्यान्वयन पर निर्भर है, लेकिन मान लें कि यह 50% है। फिर बिल्ली के मरने की संभावना 0.5 है


गैर-निर्धारित का मतलब गैर-परिभाषित नहीं है
स्कोर_उंडर

@ सोर_उंडर: आपकी बात क्या है?
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

यह सवाल अपरिभाषित व्यवहार के लिए पूछता है, जिसमें एक भाषा का व्यवहार शामिल है, जो संकलन और चलाएगा, लेकिन वास्तव में इसे क्या करना चाहिए, इसके बारे में कोई विनिर्देश नहीं है। Math.random()उदाहरण के लिए चीजों पर टिका लगाना अपरिभाषित व्यवहार नहीं है, सिर्फ अप्रत्याशित व्यवहार है।
स्कोर_उंडर 13

1
@Score_Under: प्रश्न में3. If you choose a language that doesn't have undefined behavior, use something similar.
ñ̷͉h̷̭̿a̸̡̅ẗ̵̨́h̷̰̀ĥ̷̳d

1

जावा

कल्पना के अनुसार java.util.Dateअपरिभाषित व्यवहार होगा। तो अपनी किस्मत आजमाएं:

import java.util.Date;

public class App3
{
    public static void main (String args[])
    {
        String aliveOrDead;
        Date d = new Date(-1000,-1000,-1000);
        aliveOrDead = (d.getTime()<0)? "dead" : "alive";
        System.out.println("The cat is:" +aliveOrDead );
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.