未定義の行動が猫を殺した[終了]


82

未定義の行動が猫を殺した

未定義の動作が猫を殺す可能性があることはよく知られています[要出典]
しかし、できますか?

あなたのタスク

  1. 未定義の動作を呼び出すプログラムを作成します。
  2. 前述のUBの結果として、上記のプログラムが実行されて開始し、Felis catusが所有権を保持している間にその寿命を終了させるシナリオを説明してください。
  3. シナリオの各段階の確率を推定します。
  4. プログラムを1回実行すると猫が死亡する可能性の合計を計算します。

ルール

  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%
ジオビット

5
@Oberon 長い間プログラミングした後にUBを作成する単一の方法が思いつかなかったら、私は自殺していました。そうすれば、猫はもはや私の所有物ではなくなります。UBを呼び出すと、私は生き続けます。その結果、「... あなたの所有権にある間、その人生終わらせ、結果として...」。FTWのあいまいな解析。
ジオビット14年

8
誰かがこれを再解釈してcatコマンドまたはその種のものを殺すともっと面白くなります。
ケシュラム14年

5
-1猫が大好きです。なぜ猫?害虫を殺さないのはなぜですか?
VX 14年

22
猫が食べられる場合、Pythonは解決策です。
ニコラスバルブレスコ14年

回答:


113

C

この質問に対するほとんどの回答catは、UNIXシステム上のプロセスを強制終了するという点で質問を誤って解釈しました。ここに、質問によって特定された種Felis Cattusの生物学的生命体の終causeを引き起こすことができるプログラムがあります。

この例はWindowsで実行されますがiexplore -k、インストールされたWebブラウザーを起動するコマンドに置き換えることにより、ほとんどの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;
}

このプログラムは、ユーザーに猫の食事に関するアドバイスを提供するふりをします。

Internet Explorerを起動し、猫を餌にする方法に関する多くの役立つ質問を一覧表示するペットstackexchangeにユーザーを誘導します。それがユーザーに送信することが低い(1/256)チャンス、しかし、ありstackexchangeクッキングチョコレート含む食器準備する方法のヒントをリストの代わりにある非常に有毒な猫には。さらに悪いことに、インターネットエクスプローラーをキオスクモード(フルスクリーン)で起動します。このモードでは、アドレスバーが非表示になり、技術に詳しくないユーザーにとっては脱出が困難になります。

この巧妙な策略は、ユーザーに猫のチョコレートを与えるように促し、それが適切な食事であると信じて、それによって不注意にそれを殺してしまいます。


3
ペンは剣よりも強力です!:)
Pieter Witvoet 14年

12
これは、猫を実際に殺す現実的な可能性がある唯一の解決策のように見えます。賛成票を投じられますが、実際に誰も実際に実行しないことを心から願っています。
チャールズスターツ14年

43
Internet Explorerは、あなた自身で猫を殺すかもしれません。
マイケルハンプトン14年

4
(例のように)確率分析を使用して、猫を殺すシナリオをステップごとに追加できますか?現状では、これは有効な答えではありません。
ウゴレン14年

3
Internet Explorerを使用すると、MEで未定義の動作が引き起こされます。—すみません、言わなければなりませんでした。
tomsmeding

88

バッシュ

これによるとINT_MIN % -1未定義(what ???)である場合とそうでない場合があるため、c / c ++で実装されている言語で問題が発生する可能性があります。

#!/bin/bash

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

cat親ならば早期に殺されるbashプロセスがクラッシュしてもしなくてもよいが起こる可能性があります。

私のVMでは、次の出力が表示されます。

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

(私はこの質問の採点を本当に理解していませんが、とにかくここに行きます)

計算し$((2**63%-1))ます。クラッシュは常にbash 4.2.25で発生しますが、一部の3.xバージョンではハングするようです。より多くの不確実性。正確な確率をお伝えすることはできましたが、ハイゼンブルグの不確実性の原理により、ブラックホールに陥ります。か何か。したがって、それらの確率は約42%であると安全に言えると思います。


4
@ klingt.net:それは「ここに文字列」と呼ばれている-それはそれはのショートカットです...はるかgooglableあるecho $((-2**63/-1)) | cat
VX

14
realを使用する場合は+1 cat
アルビンウォン14年

1
@mardavi INT_MAX = 2^63 - 1。に1を追加するINT_MAXと、64ビットの数値スペースが折り返され、が得られINT_MINます。符号付き64ビット整数演算で言い換えれば、2^63 == -2^63。を使用することもできましたが、モジュラー演算はこの場合と同じであるため、の-2**63ない簡潔さを優先しました-
デジタル外傷14年


1
(例のように)確率分析を使用して、猫を殺すシナリオをステップごとに追加できますか?現状では、これは有効な答えではありません。
ウゴレン14年

40

C(シーケンスポイント)

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

シナリオと確率

このプログラムを実行している人の5パーセントがCコードのコンパイルにclangを使用すると仮定します(90パーセントはgccを使用し、5パーセントは他のCコンパイラを使用します)。

「猫は元気です」という確率。= .050
 「緊急通知:猫に狂犬病が発生している」という確率。= .950

 「あなたの猫は狂犬病を患っています」に反応させる確率= .040
 通知を無視する確率= .900
 猫を治療のために獣医に連れて行く確率= .060

 猫が生きる確率の合計:.05 + .95 *(.90 + .06)= .962
 猫が死亡する確率の合計:.95 * .04 = .038
 チェック:猫の生存または死亡の合計確率:= 1.000

説明:

k = i +(++ i)は、シーケンスポイント間で「i」にアクセスして変更します。確率はプログラムによって決定できません。ユーザーが作成するコンパイラの選択に依存します。「未定義」は、必ずしも「ランダム」を意味するわけではありません。

https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-pointsを参照してください


4
さまざまなコンパイラでの動作を示すために+1。
NTOSKRNL

1
最適化レベルも動作を変更する可能性があります
ラチェットフリーク14年

1
@ラチェットフリーク:はい、しかし、私はこの特定の問題でそれを実証できませんでした。SunOSでgcc-4.2.3からgcc-4.8.2までの多くのgccバージョン、およびcc-5.0で-O0、-O1、-O2、および-O3を試しましたが、それらはすべて猫を殺しました。
グレンランダース-パーソン14年

2
(例のように)確率分析を使用して、猫を殺すシナリオをステップごとに追加できますか?現状では、これは有効な答えではありません。
ウゴレン14年

1
私は、治療のために獣医に連れて行かれたすべての猫が生きると仮定しました。おそらくそれらのいくつかは、伝染性のネコの病気にかかったり、獣医の医療過誤で死亡したりするでしょう。これにより、最終的な確率が少し変わる可能性があります。たとえば、.96 / .04
グレンランダース-パーソン14年

37

C

バックストーリー

妻は家族から猫を相続しました。残念ながら、私は動物に対して非常にアレルギーがあります。猫はプライムをかなり過ぎており、それを手に入れる前から安楽死させられていたはずでしたが、感傷的な価値があるため、猫を駆除することはできませんでした。私は終了する計画孵化し、私のその苦しみを。

私たちは長期休暇に出かけていましたが、彼女は獣医のオフィスで猫に乗りたくありませんでした。彼女は病気にかかったり、虐待されたりすることを心配していました。家に置いておくことができるように、自動猫送り装置を作成しました。マイクロコントローラーのファームウェアはCで作成しました。含まれmainているファイルは以下のコードのように見えました。

しかし、私の妻もプログラマーであり、猫に対する私の気持ちを知っていたので、彼女はコードレビューを自宅に放置することに同意する前に主張しました。彼女には、次のようないくつかの懸念がありました。

  • main 標準に準拠した署名がない(ホストされた実装の場合)
  • main 値を返さない
  • tempTmmalloc代わりに呼び出されたため、初期化されずに使用されますcalloc
  • の戻り値はmallocキャストしないでください
  • マイクロコントローラーの時間が不正確であるか、ロールオーバーする可能性があります(Y2KまたはUnix時間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;
        }
    }
}

未定義の動作:

UBを自分で見つけるのを煩わせたくない場合:

このコードには、ローカル固有の、指定されていない、実装定義の動作が確実にありますが、すべて正常に動作するはずです。問題は次のコード行にあります。ポインタが指すオブジェクトの代わりにポインタを

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の確率で死亡すると推定しています。


&memcpyの(最初の)ですよね?
Score_Under

@Score_Underはい、答えを少し編集させてください。未定義の動作を利用する他の方法を試しましたが、ほとんどはさらに明白でした。
ジェリー14年

1
猫を殺すための+1ではなくcat
ケビン14年

31

バッシュ

クラシック版

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

その範囲内のすべての猫を殺すという利点があります。

プロセスはすぐに停止するため、pkillを 1回呼び出すだけでプロセスを終了する唯一の方法は、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 14年

@ l0b0:そうではありません、少なくともすぐには。cat &端末からの読み取りを試みますが、できません。SIGCONT(18)を後で送信すれば、あなたが言及した(およびさらにいくつかの)シグナルはすべて機能します。また、猫をハングアップして終了することは、猫を殺すことと同じですが、中断することは満足のいくものではないようです...:P
デニス14年

3
未定義の動作は、undefinedとして指定された言語の機能を使用しています。つまり、言語設計者は、実装を簡単にするため、または有効なプログラムで構文を使用しないように指示するために、構文構文動作を意図的に未定義のままにしました。通常、未定義の動作は乱数生成とは関係がなく、ここで使用されている未定義の動作はありません。
OregonTrail 14年

@OregonTrail:ルールでは、未定義の動作を持たない言語を選択する場合は、同様のものを使用します。Bashには未定義の動作がないため、乱数を使用しました。
デニス14年

3
bashの環境には、使用可能な未定義の動作がたくさんあります。たとえば、@ DigitalTrauma Bashのprintfによる答えも、システムのprintfを使用していますが、これには未定義の動作がたくさんあります。
OregonTrail 14年

17

C

これはLinuxでのみ機能することに注意してください。

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 ^ -999999999999999999999999999999999999999999999999999999999999999、約)
  3. 猫は結果の終末で死ぬ(99.999%)

合計確率:1x10 ^ -999999999999999999999999999999999999999999999999999999999999999、約


うーん、スカイネットとは何ですか?
セージボルシュ14

20
未定義の動作はどこですか?
ウゴレン14年


1
@ugorenランダムなコンテンツでファイルを実行することは実際には定義されていないと思います。
11684 14年

2
@ 11684、コンテンツがスカイネットのコードである場合、スカイネットのプログラマーは自分が何をしているかを知っているので、未定義の動作はありません。
ウゴレン14年

15

C ++

好奇心が強いまで、あなたの猫は死んでも生きています。そして、あなたはあなたの猫が死んでいる確率が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か?
ブライアンチェン14年

@BryanChen:リターンがありませんでした。それを指摘してくれてありがとう:-)
Abhijit 14年

öC ++では有効なシンボルではないようです。多分それをに置き換えてくださいoe
ルスラン14年

13

C

Linuxで実行されます。

#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

The Human Centipede(First Sequence)では、犬ムカデの3匹すべてが死亡し、人間ムカデの3人中2人が死亡したという事実に基づいて、1匹の猫を殺す確率は5/6であると推定します。


猫ムカデは本当に面白いです
セージボルシュ14

猫のムカデは「実際の」答えでなければなりません。
イスマエルミゲル14年

@Ismael Miguelおそらくその通りです。Cコードを削除しました。最初は冗談を言うつもりでしたが、後でそれを実際の答えにするために言い換えることができることに気付きました。
ace_HongKongIndependence 14年

あなたはあなたのCコードを保持することができます、私はそれに対して何も持っていませんでした。私はちょうどbashバージョンが答えとしてより適していたと思います。
イスマエルミゲル14年

@Ismael Miguel Nah、そのCコードはとにかく馬鹿げていた
ace_HongKongIndependence 14年

9

JavaScript

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

実行:

  • Chrome:結果"Cat is fine"
  • Firefox:結果"Cat is dead"

説明:

15.5.4.9 String.prototype.localeCompare(その)

2つの文字列は実装定義の方法で比較されます

Glenn Randers-Pehrsonを引用して、確率はプログラムによって決定できません。ユーザーが行うブラウザの選択に依存します。


FF 27では再現できません。どのバージョンでテストしていますか?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

-1:未定義の動作と実装定義の動作は完全に異なります。
ホワイトクォーク14年

2
@whitequarkいいえ、そうではありません。結果が未定義の定義済み関数です。エルゴの未定義の動作。
ジョージリース14年

1
@whitequarkここにはCは表示されません。限りはJavaScriptを懸念しているんJavaScriptを未定義の動作をしている実装定義された動作が無難であると考えているようです。
ジョージリース14年

1
@whitequark誰も混乱していない。言葉は言葉であり、私はそれが何を意味するかを私に伝える委員会を必要としません。
ジョージリース14年

9
int foo() {}

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

値を返すことになっている関数の値を読み取ると、未定義の動作が発生します。今、それは明らかです、[引用が必要]「あなたが未定義の行動に達するたびに、神は子猫を殺します。」これを使用して、次のように結論付けます。

  • 未定義の動作に達する確率-100%
  • 確率は、神が殺したのはあなたの子猫です-1/200 000 000 理由を見る
  • 確率は0.0000005%です

ループによって簡単に拡張して、世界中のすべての猫を駆除できます。


5
あなたの確率は100倍高すぎます(2Mではなく200Mの猫)。
ウゴレン14年

私はパーセントでいます。:)
ペトル14年

1
それはパーセントであり、それでも100倍高すぎます。
ウゴレン14年

確かに、私はもう数字を読むことができません。
ペトル14年

これは間違っています。UBは、呼び出し元が戻り値を使用しようとした場合にのみ呼び出されます。それ以外の場合は、void以外の戻り値型を使用して関数の末尾を歩くことは完全に正当であり、明確に定義されています。
R ..

5

Java(ガベージコレクション)

コードは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 14年

私が理解している限り、「ほぼ常に」は、質問の予測不可能な側面と一致します。
user3001267

5

本当に殺すことを考えた人はいcatますか(a)?

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

cat死の確率

確率のために...いくつかのケースを区別する必要があると思います:

  1. Windowsユーザー:おそらく実行できません。死ぬ確率catは非常に低く、安全にゼロとみなすことができます。Cygwinがインストールされている場合、Unixユーザーとしてカウントされます。
  2. ルート権限なしで実行しているUnixユーザー:の削除catは失敗します。
  3. root権限で実行しているUnixユーザー:各呼び出しはcat1/6のチャンスでsを殺すだけですが、おそらく何か予期しないことが起こるまでそれを繰り返すでしょう。一般性を失うcatことなく、私は間違いなく死ぬと思います。

全体的な確率は、ユーザーがどのように混在しているかによって異なり、判断が困難です。しかし、私たちは確かに言うことができます:Windowsは子猫にとって安全な場所です。

ルールの順守のテスト

回答の作成中に動物を傷つけることはできません。

これは動物を殺さなかった、答えはアメリカ人道協会によって承認されています。

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

それcatが動物ではないことを明確に証明しfileます(隠されたファイルタイプの継承を知らない限り)


5

C

猫の名前が長すぎると死にます。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します。それは常に定義されていない振る舞いであり、少なくとも影響の順序はそうです。だから、評価しようと上のプログラム最初のクラッシュするか(1つは、皮肉なことに、あるではない未定義の動作:それはプログラムが何か他のものとの持ち運びできるようになる値を得てはいけません)、またはそれは、実際に深刻な国際が発生します副作用。その場合、生存率はわずか0.001%です。undefined

したがって、猫を殺す確率:49.9995%。


3

質問が効果が類似している限り未定義の動作を持たない言語を許可するので、現在に適用できるルールが複数ある場合に実行するルールを選択する際の非決定性のためにThueを選択します状態。

プログラムは電子レンジ用のコントローラーに送られ、その中には私の猫がいます。電子レンジのドアは閉じられ、ジップタイで補強されています。プログラムの出力は、電子レンジが猫の電子レンジを開始するかどうかを決定します。

  • 出力が0の場合、生きている哺乳類に対するマイクロ波の長時間暴露の影響に関する実験を開始します(現在十分に研究されていません)。
  • 出力が1の場合、猫が9つの命のうちの1つを失い、それを解放したという事実に満足するだけです。

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

猫を殺す確率は、インタープリターの実装に依存しますが、50%であるとしましょう。その場合、猫が死ぬ確率は0.5です。


非確定は非定義された意味ではありません
Score_Under

@Score_Under:あなたのポイントは何ですか?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

質問は未定義の動作を要求します。これには、コンパイルおよび実行される言語の動作の活用が含まれますが、実際に何をすべきかについての仕様はありません。Math.random()たとえば、物事に蝶番を付けることは、未定義の動作ではなく、単に予測できない動作です。
Score_Under

1
@Score_Under:質問には3. If you choose a language that doesn't have undefined behavior, use something similar.
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1

Java

仕様に よる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 );
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.