Hành vi không xác định giết chết con mèo của tôi [đóng]


82

Hành vi không xác định giết chết con mèo của tôi

Người ta biết rằng hành vi không xác định có thể giết chết con mèo của bạn [cần dẫn nguồn] .
Nhưng nó có thể không?

Nhiệm vụ của bạn

  1. Viết một chương trình gọi hành vi không xác định.
  2. Mô tả một kịch bản bắt đầu với chương trình trên được chạy, dẫn đến một con mèo Felis kết thúc cuộc đời của nó trong khi thuộc quyền sở hữu của bạn, là kết quả của UB đã nói ở trên.
  3. Ước tính xác suất cho từng giai đoạn trong kịch bản.
  4. Tính tổng xác suất để một lần chạy chương trình sẽ giết chết con mèo của bạn.

Quy tắc

  1. Đây là một , vì vậy hãy sáng tạo nếu bạn có thể.
  2. Đây là một thách thức liên quan đến lập trình, do đó, chuỗi sự kiện chủ yếu nằm trong máy tính chứ không phải trong thế giới thực (tất nhiên, nếu phải tiếp cận thế giới thực nếu đó là con mèo của bạn).
  3. Nếu bạn chọn ngôn ngữ không có hành vi không xác định, hãy sử dụng ngôn ngữ tương tự.
  4. Không có động vật có thể bị tổn hại trong việc sản xuất câu trả lời của bạn.

Chấm điểm

Số phiếu bầu cộng với tổng xác suất của kịch bản (không thể vượt quá 1).

Ví dụ trong C:

main(){printf();}

Kịch bản:

  1. printfđược gọi với rác từ ngăn xếp - hành vi không xác định. Xác suất: 100%.
  2. Tham số đầu tiên xảy ra là chuỗi Your cat is ugly!. Xác suất: (1/256) 17 = (1.148 * 10 -37 )%.
  3. Thấy tin nhắn, bạn nhặt súng và bắn con mèo của bạn. Xác suất: 3%.
  4. Con mèo chết. Xác suất: 93%.

Tổng xác suất: (3,202 * 10 -39 )%.


50
1) Gọi hành vi không xác định 2) Vẫn lấy cảm hứng từ thực tế đơn giản là bạn có thể gọi hành vi không xác định và sống một cuộc sống hạnh phúc lâu dài 3) Mèo chết vì tuổi già. Tổng xác suất: 100%
Geobits

5
@Oberon Tôi sẽ tự sát nếu tôi không thể nghĩ ra một cách duy nhất để tạo một UB sau khi lập trình quá lâu. Sau đó, con mèo sẽ không còn thuộc sở hữu của tôi. Gọi UB giúp tôi duy trì sự sống, do đó "... kết thúc cuộc đời trong khi thuộc quyền sở hữu của bạn , kết quả là ...". Phân tích cú pháp mơ hồ FTW.
Geobits

8
Tôi sẽ thích thú hơn nếu ai đó diễn giải lại điều này để giết catlệnh hoặc thứ gì đó tương tự.
keshlam

5
-1 Tôi yêu mèo. Tại sao mèo? Tại sao không giết chết vermin?
VX

22
Nếu một con mèo được ăn, Python là một giải pháp.
Nicolas Barbulesco

Câu trả lời:


113

C

Hầu hết các câu trả lời cho câu hỏi này đã giải thích sai câu hỏi ở chỗ nó đang giết chết catquá trình trên một hệ thống UNIX. Đây là một chương trình có thể gây ra sự sụp đổ của một dạng sống sinh học của loài Felis Cattus như được nêu cụ thể bởi câu hỏi.

Ví dụ này chạy trên Windows, nhưng nó có thể dễ dàng được chuyển đến hầu hết các hệ điều hành UNIX bằng cách thay thế iexplore -kbằng lệnh để khởi chạy trình duyệt web đã cài đặt.

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

Chương trình này giả vờ cung cấp lời khuyên về chế độ ăn cho mèo cho người dùng.

Nó sẽ khởi động Internet Explorer và hướng người dùng đến thú cưng stackexchange liệt kê rất nhiều câu hỏi hữu ích về cách cho mèo ăn. Có nghĩa là, tuy nhiên, một (1/256) cơ hội thấp mà nó sẽ gửi cho người dùng để nấu stackexchange thay vì danh sách các mẹo làm thế nào để chuẩn bị các món ăn có chứa sô cô la, đó là có độc tính cao với mèo . Để làm cho vấn đề tồi tệ hơn, nó sẽ khởi chạy trình thám hiểm internet ở chế độ kiosk (toàn màn hình), ẩn thanh địa chỉ và khó thoát khỏi đối với người dùng không am hiểu về công nghệ.

Mưu mẹo thông minh này sẽ dỗ người dùng cho ăn sô cô la mèo của họ tin rằng đó là chế độ ăn thích hợp cho nó, do đó khiến họ vô tình giết chết nó.


3
Ngòi bút mạnh hơn thanh kiếm! :)
Pieter Witvoet

12
Đây có vẻ là giải pháp duy nhất cho đến nay có bất kỳ cơ hội thực tế nào để giết chết một con mèo. Tôi buộc phải upvote, mặc dù tôi chân thành hy vọng không ai thực sự đưa nó vào thực tế.
Charles Staats

43
Internet Explorer có thể tự mình giết con mèo của bạn.
Michael Hampton

4
Bạn có thể thêm kịch bản, từng bước một, giết chết con mèo, với phân tích xác suất (như trong ví dụ) không? Vì nó là, đây không phải là một câu trả lời hợp lệ.
ugoren

3
Sử dụng Internet Explorer gây ra hành vi không xác định trong ME. - xin lỗi, phải nói thế.
tomsmeding

88

Bash

Theo đó , INT_MIN % -1có thể hoặc không thể không xác định (cái gì ???) và do đó có thể gây rắc rối cho bất kỳ ngôn ngữ nào được triển khai trong c / c ++.

#!/bin/bash

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

Các catsẽ bị giết chết sớm nếu phụ huynh bashquá trình bị treo, mà có thể hoặc không thể xảy ra.

Trên máy ảo của tôi, tôi nhận được kết quả này:

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

(Tôi không thực sự hiểu cách tính điểm cho câu hỏi này, nhưng dù sao đi nữa)

Tính toán $((2**63%-1)). Sự cố luôn xảy ra trên bash 4.2.25, nhưng dường như chỉ treo trên một số phiên bản 3.x. Không chắc chắn hơn. Tôi có thể cho bạn biết xác suất chính xác, nhưng do nguyên tắc không chắc chắn của Heisenburg nên tôi sẽ rơi xuống một lỗ đen. Hoặc một cái gì đó. Vì vậy, tôi nghĩ rằng chúng ta có thể nói rằng xác suất của họ là khoảng 42% một cách an toàn.


4
@ klingt.net: Nó được gọi là "Here String" - nó dễ hiểu hơn nhiều ... đó là lối tắt choecho $((-2**63/-1)) | cat
VX

14
+1 để sử dụng thực cat.
Alvin Wong

1
@mardavi INT_MAX = 2^63 - 1. Nếu chúng ta thêm 1 vào INT_MAX, không gian số 64 bit sẽ kết thúc và chúng ta sẽ nhận được INT_MIN. Nói cách khác trong số học số nguyên 64 bit đã ký , 2^63 == -2^63. Tôi có thể đã sử dụng -2**63, nhưng ưa thích sự căng thẳng mà không có -, vì số học mô-đun là giống nhau trong trường hợp này.
Chấn thương kỹ thuật số


1
Bạn có thể thêm kịch bản, từng bước một, giết chết con mèo, với phân tích xác suất (như trong ví dụ) không? Vì nó là, đây không phải là một câu trả lời hợp lệ.
ugoren

40

C (điểm thứ tự)

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

Thi hành (hoặc không):

$ 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

Kịch bản và xác suất

Giả sử rằng năm phần trăm những người chạy chương trình này sử dụng tiếng kêu để biên dịch mã C (so với 90 phần trăm sử dụng gcc và 5 phần trăm sử dụng trình biên dịch C khác):

Xác suất nhận được "Con mèo vẫn ổn." = .050
 Xác suất nhận được "Thông báo khẩn cấp: Con mèo của bạn bị bệnh dại." = .950

 Xác suất phản ứng với "Con mèo của bạn bị bệnh dại" bằng cách đặt nó xuống = .040
 Xác suất bỏ qua thông báo = .900
 Xác suất đưa mèo đến bác sĩ thú y để điều trị = .060

 Tổng xác suất sống của mèo: .05 + .95 * (.90 + .06) = .962
 Tổng xác suất mèo chết: .95 * .04 = .038
 Kiểm tra: Tổng xác suất mèo sống hoặc chết: = 1.000

Giải trình:

k = i + (++ i) truy cập và thay đổi "i" giữa các điểm chuỗi. Xác suất không được xác định bởi chương trình; nó phụ thuộc vào sự lựa chọn của trình biên dịch, được thực hiện bởi người dùng. "Không xác định" không nhất thiết có nghĩa là "ngẫu nhiên".

Xem https://stackoverflow.com/questions/4176328/undained-behavior-and- resultence- points


4
+1 để thể hiện hành vi với các trình biên dịch khác nhau.
ntoskrnl

1
mức độ tối ưu hóa cũng có thể thay đổi hành vi
ratchet freak

1
@ratchet freak: Vâng, nhưng tôi không thể chứng minh điều đó với vấn đề đặc biệt này. Tôi đã thử -O0, -O1, -O2 và -O3 trên một số phiên bản gcc khác nhau, từ gcc-4.2.3 đến gcc-4.8.2 và cc-5.0 trên SunOS, nhưng tất cả những thứ đó đã giết chết con mèo.
Glenn Randers-Pehrson

2
Bạn có thể thêm kịch bản, từng bước một, giết chết con mèo, với phân tích xác suất (như trong ví dụ) không? Vì nó là, đây không phải là một câu trả lời hợp lệ.
ugoren

1
Tôi cho rằng tất cả những con mèo được đưa đến bác sĩ thú y để điều trị sẽ sống. Có lẽ một số người sẽ chết vì mắc bệnh truyền nhiễm hoặc do sơ suất thú y. Điều đó có thể thay đổi xác suất cuối cùng một chút, để nói .96 / .04
Glenn Randers-Pehrson

37

C

Backstory

Vợ tôi thừa hưởng một con mèo từ gia đình. Thật không may, tôi rất dị ứng với động vật. Con mèo đã vượt quá giới hạn của nó và đáng lẽ đã bị tiêu hủy ngay cả trước khi chúng tôi nhận được nó, nhưng cô ấy không thể tự mình thoát khỏi nó vì giá trị tình cảm của nó. Tôi ấp ủ một kế hoạch nhằm chấm dứt của tôi đau khổ của nó.

Chúng tôi đang đi nghỉ dài ngày, nhưng cô ấy không muốn lên mèo ở văn phòng bác sĩ thú y. Cô lo lắng về việc mắc bệnh hoặc bị ngược đãi. Tôi đã tạo ra một máy nạp mèo tự động để chúng tôi có thể để nó ở nhà. Tôi đã viết phần sụn của vi điều khiển trong C. Tệp chứa có mainvẻ giống với mã bên dưới.

Tuy nhiên, vợ tôi cũng là một lập trình viên và biết cảm xúc của tôi đối với con mèo, vì vậy cô ấy khăng khăng đòi xem xét lại mã trước khi đồng ý để nó ở nhà mà không cần giám sát. Cô có một số mối quan tâm, bao gồm:

  • main không có chữ ký tuân thủ tiêu chuẩn (đối với triển khai được lưu trữ)
  • main không trả về giá trị
  • tempTmđược sử dụng chưa được khởi tạo kể từ khi mallocđược gọi thay vìcalloc
  • mallockhông nên bỏ giá trị trả về
  • thời gian của vi điều khiển có thể không chính xác hoặc cuộn qua (tương tự như các vấn đề về thời gian 2038 của Y2K hoặc Unix)
  • các elapsedTimebiến thể không có đủ tầm

Phải mất rất nhiều sức thuyết phục, nhưng cuối cùng cô ấy đã đồng ý rằng các vấn đề không phải là vấn đề vì nhiều lý do (điều đó không làm tổn thương rằng chúng tôi đã trễ chuyến bay). Vì không có thời gian để thử nghiệm trực tiếp, cô ấy đã phê duyệt mã và chúng tôi đã đi nghỉ. Khi chúng tôi trở về một vài tuần sau đó, tôi đau khổ của con mèo đã kết thúc (mặc dù kết quả là bây giờ tôi đã có rất nhiều nhiều hơn nữa).

Kịch bản hoàn toàn hư cấu, không phải lo lắng.


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

Hành vi không xác định:

Đối với những người không muốn tự mình tìm kiếm UB:

Chắc chắn có hành vi cụ thể cục bộ, không xác định và xác định thực hiện trong mã này, nhưng tất cả đều hoạt động chính xác. Vấn đề nằm ở các dòng mã sau:

struct tm * tempTm //... //... memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpyghi đè tempTMcon trỏ thay vì đối tượng mà nó trỏ tới, đập vỡ ngăn xếp. Điều này ghi đè, ngoài những thứ khác, elapsedTimeloopIterationsSinceFeed. Đây là một ví dụ chạy trong đó tôi đã in ra các giá trị:

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


Xác suất giết mèo:

  • Với môi trường thực thi bị ràng buộc và chuỗi xây dựng, hành vi không xác định luôn xảy ra.
  • Tương tự, hành vi không xác định luôn ngăn không cho mèo nạp hoạt động như dự định (hay đúng hơn, cho phép nó "hoạt động" như dự định).
  • Nếu máng ăn không hoạt động, rất có khả năng con mèo sẽ chết. Đây không phải là một con mèo có thể tự chống đỡ, và tôi đã thất bại khi yêu cầu người hàng xóm nhìn vào nó.

Tôi ước tính rằng con mèo chết với xác suất 0,995 .


Đó là (đầu tiên) &trong memcpy, phải không?
Điểm_Under

@Score_Under Có, hãy để tôi chỉnh sửa câu trả lời một chút. Tôi đã chơi xung quanh với những cách khác để khai thác hành vi không xác định, nhưng hầu hết thậm chí còn rõ ràng hơn.
jerry

1
+1 để giết một con mèo, không cat.
Kevin

31

bash

Phiên bản cổ điển

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

Có lợi thế là giết tất cả mèo trong phạm vi của nó.

Lưu ý rằng quá trình này bị dừng ngay lập tức, vì vậy cách duy nhất để kết thúc nó bằng một lệnh gọi pkill duy nhất là gửi SIGKILL (9).

Vì thế:

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


Phiên bản lượng tử

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.

Xác suất giết mèo trong thí nghiệm: 50%


+1 Nhưng nó có nhiều khả năng hơn tôi nghĩ. SIGINT (2), SIGQUIT (3), SIGABRT (6), SIGPIPE (13) và SIGTERM (15), ít nhất, giết chết nó ở đây.
l0b0

@ l0b0: Không, ít nhất là không ngay lập tức. cat &cố gắng đọc từ thiết bị đầu cuối, nhưng không thể. Bất kỳ tín hiệu nào bạn đã đề cập (và một vài tín hiệu nữa) sẽ hoạt động nếu bạn gửi SIGCONT (18) sau đó. Ngoài ra, tôi đồng ý rằng việc treo lênchấm dứt con mèo sẽ giống như giết nó, nhưng làm gián đoạn nó có vẻ không thỏa đáng ...: P
Dennis

3
Hành vi không xác định đang sử dụng một tính năng của ngôn ngữ đã được chỉ địnhkhông xác định . Đó là, các nhà thiết kế ngôn ngữ đã cố tình bỏ hành vi của một số cấu trúc cú pháp không xác định để thực hiện dễ dàng hơn hoặc để chỉ ra rằng cấu trúc không bao giờ được sử dụng trong bất kỳ chương trình hợp lệ nào. Hành vi không xác định thường không liên quan gì đến việc tạo số ngẫu nhiên và không có hành vi không xác định nào được sử dụng ở đây.
OregonTrail

@OrebTrail: Các quy tắc nói Nếu bạn chọn ngôn ngữ không có hành vi không xác định, hãy sử dụng ngôn ngữ tương tự. Bash không có hành vi không xác định, vì vậy tôi đã sử dụng các số ngẫu nhiên.
Dennis

3
Có rất nhiều hành vi không xác định trong môi trường của bash có thể được sử dụng. Ví dụ: câu trả lời của printf của @DigitalTrauma Bash cũng sử dụng printf của hệ thống có nhiều hành vi không xác định.
OregonTrail

17

C

Lưu ý rằng điều này chỉ hoạt động trên 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. Ghi dữ liệu ngẫu nhiên vào một tệp và gọi nó (100%)
  2. Dữ liệu ngẫu nhiên là mã nguồn của skynet (1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox.)
  3. Mèo chết trong ngày tận thế (99,999%)

Tổng xác suất: 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox.


hmmmm, skynet là gì?
Sange Borsch

20
Hành vi không xác định ở đâu?
ugoren


1
@ugoren Tôi nghĩ rằng việc chạy một tệp có nội dung ngẫu nhiên không thực sự được xác định.
11684

2
@ 11684, Nếu nội dung là mã của skynet, các lập trình viên của skynet biết họ đang làm gì, không có hành vi không xác định.
ugoren

15

C ++

Con mèo của bạn vừa chết vừa sống cho đến khi bạn tò mò. Sau đó, bạn nhận ra rằng có 0,5 xác suất rằng Mèo của bạn đã chết.

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

}

bạn có thể truy cập this->m_deadsau delete this?
Bryan Chen

@BryanChen: Một sự trở lại đã bị mất. Cảm ơn bạn đã chỉ ra :-)
Abhijit

ödường như không phải là một biểu tượng hợp lệ trong C ++. Có thể thay thế nó bằng oe.
Ruslan

13

C

Chạy trên 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;
}

Xác suất giết chết con mèo: 1/256 (Trả sleep(1)về 0, vì vậy nó sẽ bị giết nếu xbằng không.)

Như một phần thưởng, nó giết chết tất cả những con mèo hiện đang chạy trên hệ thống của bạn.


Nếu bạn ghét mèo rất nhiều, tôi trình bày với bạn:

Con rết mèo (Bash)

echo "Hello World"|cat|cat|cat

Dựa trên thực tế rằng, trong The Human Rết (Chuỗi đầu tiên) , cả ba con chó của rết chó đều chết và hai trong số ba người của rết người đã chết, tôi ước tính rằng xác suất giết chết một con mèo là 5/6.


Cat Centipede thực sự hài hước
Sarge Borsch

Con rết mèo nên là câu trả lời "thực tế".
Ismael Miguel

@Ismael Miguel Có lẽ bạn đã đúng, tôi đã xóa mã C. Lúc đầu, nó có nghĩa là một trò đùa, nhưng sau đó tôi nhận ra rằng tôi có thể viết lại nó để biến nó thành một câu trả lời thực sự.
ace_HongKongInependence

Bạn có thể giữ mã C của bạn, tôi có và không có gì chống lại nó. Tôi chỉ mặc dù rằng phiên bản bash phù hợp hơn là một câu trả lời.
Ismael Miguel

@Ismael Miguel Nah, dù sao mã C cũng khá ngu ngốc
ace_HongKongInependence

9

JavaScript

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

Chấp hành:

  • Chrome: Kết quả trong"Cat is fine"
  • Firefox: Kết quả trong"Cat is dead"

Giải trình:

15.5.4.9 String.prototype.localeCompare (đó)

Hai Strings được so sánh trong một thực hiện xác định thời trang

Trích dẫn Glenn Randers-Pehrson, xác suất không được xác định bởi chương trình; nó phụ thuộc vào sự lựa chọn của trình duyệt, được tạo bởi người dùng.


Không thể sao chép trên FF 27. Phiên bản nào bạn đang thử nghiệm?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

-1: hành vi không xác định và hành vi xác định thực hiện là hoàn toàn khác nhau.
Whitequark

2
@whitequark Không họ không. Đây là một chức năng được xác định với một kết quả không xác định. Ergo hành vi không xác định.
George Reith

1
@whitequark Mình không thấy C nào ở đây. Đối với JavaScript có liên quan Liệu JavaScript có hành vi không xác định dường như nghĩ rằng hành vi được xác định thực hiện là có thể qua được.
George Reith

1
@whitequark không có ai nhầm lẫn. Một từ là một từ, tôi không cần một ủy ban để cho tôi biết ý nghĩa của nó.
George Reith

9
int foo() {}

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

Đọc một giá trị của hàm được cho là trả về giá trị dẫn đến hành vi không xác định. Bây giờ, rõ ràng, [cần dẫn nguồn] rằng "Mỗi khi bạn đạt đến hành vi không xác định, Chúa sẽ giết một con mèo con." Sử dụng điều này, chúng tôi kết luận:

  • Xác suất bạn đạt được hành vi không xác định - 100%
  • Xác suất đó là con mèo của bạn mà thần đã giết - 1/200 000 000 xem tại sao
  • Vì vậy, xác suất là 0,0000005%

Có thể dễ dàng mở rộng bằng vòng lặp để tiêu diệt tất cả những con mèo trên thế giới.


5
Xác suất của bạn cao gấp 100 lần (mèo 200 triệu chứ không phải 2 triệu).
ugoren

Tôi có trong phần trăm. :)
Petr

1
Nó ở phần trăm và vẫn cao gấp 100 lần.
ugoren

Bạn nói đúng, tôi không thể đọc số nữa.
Petr

Điều này là không đúng. UB chỉ được gọi nếu người gọi cố gắng sử dụng giá trị trả về. Mặt khác, nó hoàn toàn hợp pháp và được xác định rõ để loại bỏ phần cuối của hàm với kiểu trả về không trống.
R ..

5

Java (Bộ sưu tập rác)

Mặc dù mã có thể gọi System.gc () không đảm bảo rằng Trình thu gom rác sẽ thu thập tất cả các đối tượng không sử dụng. Do đó, đối với đoạn mã sau, không thể đoán trước được liệu con mèo có bị giết hay không.

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

Xác suất không thể được tính toán.

Lưu ý rằng vẫn có khả năng con mèo sẽ được "hồi sinh" nếu có một công tắc ngữ cảnh trong luồng GC sau sysout và trước System.exit (0) nhưng tôi không muốn che đậy nó để giữ cho khái niệm đơn giản hơn.


1
Điều này là không tốt. Mã này như được viết sẽ gần như luôn luôn in cả hai. Tốt hơn là thêm System.out.close()sau System.out.println("Cat is still alive.");dòng.
durron597

Theo như tôi hiểu, "gần như luôn luôn" phù hợp với khía cạnh không thể đoán trước của câu hỏi.
dùng3001267

5

Bất cứ ai đã nghĩ đến việc thực sự giết chết (a) cat?

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

Xác suất catchết

Để xác suất ... tôi đoán chúng ta cần phân biệt một số trường hợp:

  1. Người dùng Windows : Có lẽ sẽ không thể thực thi nó. Cơ hội chết cats rất thấp, có thể được coi là bằng không. Nếu anh ta cài đặt Cygwin, anh ta sẽ được tính là người dùng unix.
  2. Người dùng Unix, chạy mà không có quyền root : Giết catsẽ không thành công.
  3. Người dùng Unix, đang chạy với quyền root : Mặc dù mỗi cuộc gọi sẽ chỉ giết cats với cơ hội 1/6, nhưng rất có thể anh ta sẽ lặp lại nó cho đến khi có điều gì đó bất ngờ xảy ra. Không mất tính tổng quát, tôi cho rằng catchắc chắn sẽ chết.

Xác suất tổng thể phụ thuộc vào cách người dùng trộn lẫn và khó xác định. Nhưng chúng ta chắc chắn có thể nói: Windows là nơi an toàn cho mèo con.

Kiểm tra sự tuân thủ các quy tắc

Không có động vật có thể bị tổn hại trong việc sản xuất câu trả lời của bạn.

Điều này không giết chết động vật, câu trả lời được Hiệp hội Nhân đạo Hoa Kỳ chấp thuận .

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

chứng minh rõ ràng rằng catkhông có động vật (miễn là filekhông biết bất kỳ loại thừa kế loại tệp ẩn nào).


5

C

Nếu tên con mèo của bạn quá dài, nó sẽ chết. getsgây ra cái chết của mèo, cùng với các vấn đề khác.

#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

Haskell

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

Ở đây, chúng tôi áp dụng unsafePerformIOcho một hành động có tác dụng phụ có thể quan sát được . Đó luôn là hành vi không xác định, ít nhất là thứ tự của các hiệu ứng. Vì vậy, chương trình sẽ gặp sự cố đầu tiên khi cố gắng đánh giá undefined(điều đó, trớ trêu thay, không phải là hành vi không xác định: nó không bao giờ mang lại một giá trị cho phép chương trình tiếp tục với một thứ khác), hoặc thực tế nó sẽ gây ra sự nghiêm trọng quốc tế phản ứng phụ. Trong trường hợp đó, cơ hội sống sót chỉ0,001% .

Xác suất giết chết con mèo như vậy: 49.9995%.


3

Thứ ba

Vì câu hỏi cho phép một ngôn ngữ không có hành vi không xác định miễn là hiệu ứng tương tự nhau, tôi chọn Thue vì tính không xác định của nó trong việc chọn quy tắc nào sẽ được thực thi khi có nhiều hơn 1 quy tắc có thể được áp dụng trên hiện tại tiểu bang.

Chương trình sẽ được đưa vào bộ điều khiển cho lò vi sóng, bên trong là con mèo của tôi. Cánh cửa lò vi sóng được đóng lại và gia cố bằng dây buộc. Đầu ra của chương trình sẽ quyết định xem lò vi sóng có bắt đầu lò vi sóng cho mèo hay không.

  • Nếu đầu ra là 0, chúng tôi sẽ bắt đầu thử nghiệm về tác động của việc tiếp xúc lâu dài với lò vi sóng đối với động vật có vú sống (hiện chưa được nghiên cứu đầy đủ).
  • Nếu đầu ra là 1, chúng ta sẽ hài lòng với thực tế là con mèo vừa mất một trong 9 mạng và để nó ra ngoài.

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

Xác suất giết chết con mèo phụ thuộc vào việc thực hiện trình thông dịch, nhưng giả sử là 50%. Khi đó xác suất con mèo sẽ chết là 0,5 .


Không xác định không có nghĩa là không xác định
Score_Under

@Score_Under: quan điểm của bạn là gì?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Câu hỏi yêu cầu hành vi không xác định, liên quan đến việc thúc đẩy hành vi của ngôn ngữ sẽ biên dịch và chạy, nhưng không có thông số kỹ thuật nào về những gì nó thực sự nên làm. Math.random()Ví dụ, mang những thứ không phải là hành vi không xác định, chỉ là hành vi không thể đoán trước.
Điểm_Under

1
@Score_Under: Trong câu hỏi3. If you choose a language that doesn't have undefined behavior, use something similar.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Java

Theo thông số kỹ thuật java.util.Date sẽ có hành vi không xác định. Vì vậy, hãy thử vận ​​may của bạn:

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 );
    }
}
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.