Thoát khỏi Golfing


55

Lấy cảm hứng từ mặc định này cho IO .

Nhiệm vụ

Viết chương trình, với một số nguyên đầu vào xtrong khoảng từ 0 đến 255, gặp sự cố với mã thoát x.

Những hạn chế

  • Bạn không được gọi bất cứ thứ gì được dự định trực tiếp cho đầu ra mã thoát ( System.exit(x), trở về từ main, v.v.). Thay vào đó, chương trình của bạn phải gây ra lỗi hoặc sự cố sẽ gây ra, với xác suất là 1, chương trình sẽ thoát với số nguyên đầu vào.
    • Trong trường hợp này, các từ "lỗi" và "sự cố" có nghĩa là chương trình gây ra một số ngoại lệ không mong muốn gây tử vong, trong đó một phương pháp, hoạt động hoặc cách khác được sử dụng không chính xác gây ra lỗi không thể đảo ngược.
    • Bạn có thể không trực tiếp gây ra lỗi bằng cách ném trực tiếp. Bạn phải gây ra nó bằng cách sử dụng một phương thức, hàm hoặc mục đích khác có mục đích phục vụ một chức năng khác (nghĩa là cố gắng thực hiện ghi tệp vào thư mục chỉ đọc).
  • Bạn phải có ít nhất hai mã thoát được tính trong chương trình của bạn.
  • Việc chấm dứt quá trình với việc sử dụng tín hiệu bị cấm. (Lý do có thể được tìm thấy trong cuộc thảo luận này )

Chấm điểm

Điểm số của chương trình của bạn được xác định bởi số lượng mã thoát được hỗ trợ, trong đó phần mã hóa là bộ bẻ khóa. Số lượng lớn nhất của mã thoát được hỗ trợ chiến thắng!


Chỉ cần làm rõ, nếu tôi nêu ra một lỗi, đó là bất hợp pháp có?
Anthony Phạm

@AnthonyPham Nếu bạn trực tiếp nâng nó ( throw new Exception()kiểu), đó là bất hợp pháp. Nếu đó là sản phẩm phụ của việc sử dụng sai chức năng hiện có, thì tốt thôi.
Addison Crump

@VoteToC Đóng Tôi đoán tôi không đủ rõ ràng. Tôi đồng ý với bạn, nhưng đã gợi ý, nói vuông, thay vì giai thừa. Nhưng bất cứ điều gì, nó không thực sự quan trọng, chỉ là một gợi ý
Maltysen

8
Việc chấp nhận đầu vào dưới dạng chữ số tiếng Anh đánh vần (ví dụ one zero zero100) có được chấp nhận không? Tôi có một ý tưởng cho thử thách này, nhưng ngôn ngữ có một số ý tưởng khá bất thường về I / O, và đây là định dạng đầu vào tự nhiên nhất.

5
Tôi sẽ xem xét Thoát Mã Golfing một tiêu đề clickbait, mặc dù nó là chính xác. <(° _ ° <)
RaisingAgent

Câu trả lời:


48

Unix Shell (+ tiện ích + tiện ích BSD), 36, 26 byte, 256 mã thoát

Chơi gôn

jot -bu0 $[252+$1]|tput -S

Nếu tùy chọn -S được sử dụng, kiểm tra các lỗi từ mỗi dòng và nếu tìm thấy bất kỳ lỗi nào, sẽ đặt mã thoát thành 4 cộng với số dòng có lỗi. Nếu không tìm thấy lỗi, mã thoát là 0. Không có dấu hiệu nào cho thấy dòng nào bị lỗi nên mã thoát 1 sẽ không bao giờ xuất hiện. Mã thoát 2, 3 và 4 giữ lại cách hiểu thông thường của chúng.

Khi mã thoát tput vượt quá 255, nó sẽ tràn ra, do đó, 253 (lỗi về đầu vào) sẽ dẫn đến mã thoát 1, do đó mang lại trạng thái thoát mong muốn cho toàn bộ phạm vi đầu vào.

Lưu ý : cho dù tput sẽ thất bại trên không, khi thiết / nhận được một khả năng đặc biệt, phụ thuộc vào loại thiết bị đầu cuối, tôi đã sử dụng:xterm with 256 colors

jot là một tiện ích BSD , in dữ liệu tuần tự hoặc ngẫu nhiên và (AFAIK) cũng có sẵn ngoài hộp trên các hệ thống OSX.

Nếu hệ thống của bạn không có jotsẵn, bạn có thể sử dụng phiên bản dài hơn (29 byte):

yes u0|sed $[252+$1]q|tput -S

Dùng thử trực tuyến! (phiên bản 29 byte)


Wow, khá tốt. +1
Addison Crump

45

Bash 4.2 + bổ sung, 24 mã thoát

grep \#$1$ $0|sed 's:#.*::;s:T:tcc -run -<<<main=:;s:C:curl -L x.org/! :'|sh;exit
man#1
C-#2
C/#3
sed#4
C-x/#5
C_#6
C0#7
man /#16
C-f#22
C-o/#23
C-L3#35
C--capath /#60
C--max-filesize 1#63
C--cacert /#77
timeout 1e-9 w#124
/#126
-#127
T6\;#132
T204\;#133
$[2**63%-1]#136
{0..1000000000}#137
T0\;#139
exit _#255

Cảm ơn @ KenY-N cho 3 mã thoát. Cảm ơn @ el.pescado cho 1 mã thoát.

xác minh

Tất cả các thử nghiệm đã được thực hiện trên openSUSE 13.2.

$ for n in {0..255}; do bash exit.sh $n; (($? == $n)) && echo $n >&0; done &> /dev/null
0
1
2
3
4
6
7
16
22
23
35
60
63
77
124
126
127
132
133
136
137
139
255

1
Mã thoát 5:http_proxy=fafa curl http://example.org
el.pescado

1
@ el.pescado Tôi mất hơn một năm, nhưng cuối cùng tôi đã thực hiện đề xuất của bạn. Cảm ơn bạn!
Dennis

30

INTERCAL (C-INTERCAL), 15 mã, 313 + 2 = 315 byte

        PLEASE WRITE IN .1
(8)     PLEASE CREATE .1 A
        PLEASE A
        PLEASE COME FROM #2$!1/#1'

        DO X
(123)   DO (123) NEXT
        DO COME FROM (222)
(222)   DO STASH .2
(240)   DO ,1 <- #0
(241)   DO ,1 SUB #0 <- #1
(19)    DO .2 <- #256 $ #0
(21)    DO .1 <- #2
(148)   DO GO BACK
(180)   DO RETRIEVE .2
        DO COME FROM (50)
(50)    DO WRITE IN .2
(109)   DO RESUME #0
(120)   DO RESUME #9
        MAYBE COME FROM (223)
(223)   DO COME FROM (223)
(121)   PLEASE NOT X

Hãy thử trực tuyến!

Tất cả khoảng trắng ở đây là không liên quan. (Chương trình ban đầu chứa các tab, nhưng tôi đã chuyển đổi chúng thành khoảng trắng để nó xếp hàng chính xác trên SE; thông thường sử dụng chiều rộng tab là 8 cho INTERCAL. Tôi đã thử nghiệm phiên bản chương trình với tất cả các tab, khoảng trắng và các dòng mới đã bị xóa, tuy nhiên, và nó hoạt động tốt.)

Biên dịch với -abm(hình phạt 2 byte, vì -bđược yêu cầu cho trình biên dịch có tính xác định).

Như thường lệ đối với INTERCAL, điều này nhận đầu vào số ở định dạng, ví dụ: ONE TWO THREEcho 123.

Giải trình

Khi chương trình C-INTERCAL bị lỗi, trạng thái thoát là mã lỗi modulo 256. Do đó, chúng ta có thể nhắm đến việc viết một chương trình có khả năng tạo ra càng nhiều lỗi thời gian chạy càng tốt. Chương trình này chỉ bỏ qua hai lỗi thời gian chạy không chỉ ra các vấn đề của trình biên dịch nội bộ: ICL200I, vì việc sao chép nó yêu cầu sử dụng các thư viện bên ngoài chỉ tương thích với một chương trình đơn luồng (và các chương trình đa luồng có nhiều lỗi hơn); và ICL533I, vì 533 có cùng giá trị modulo 256 như 277 và chương trình có khả năng sản xuất ICL277I.

Chương trình luôn bắt đầu theo cùng một cách. Đầu tiên, chúng ta nhập ( WRITE IN) một giá trị cho biến .1. Sau đó, chúng tôi sử dụng một CREATEcâu lệnh được tính toán để tạo cú pháp mới (ở đây, A); nhưng vì nó được tính toán nên định nghĩa của cú pháp thay đổi dựa trên giá trị của .1. Cuối cùng, trong hầu hết các trường hợp, chúng tôi chạy Acâu lệnh mới , đã được xác định để tạo ra lỗi; bảng định nghĩa có thể có mà chúng tôi có chứa một định nghĩa cho từng lỗi thời gian chạy có thể xảy ra (trừ các trường hợp ngoại lệ được liệt kê ở trên).

Đầu tiên, có hai trường hợp ngoại lệ cho sơ đồ chung này. (0)không phải là số dòng hợp lệ, vì vậy nếu người dùng nhập vào ZERO, chúng ta sẽ nhảy từ dòng thứ hai (được đánh số (8)) sang dòng thứ tư bằng COME FROMcâu lệnh được tính toán . Điều này sau đó rơi vào một lỗi cú pháp DO X, tạo ra lỗi ICL000I. (Trong INTERCAL, lỗi cú pháp xảy ra trong thời gian chạy, do xu hướng của các lệnh bị vô hiệu hóa, cú pháp được xác định lại theo bạn, v.v.). Các COME FROMtuyên bố cũng có một tác dụng phụ, ngay cả khi không thực tế COME FROMxảy ra, tạo ra một tình trạng quá tải toán hạng từ .1để #1bất cứ khi nào một phù hợp với một số dòng được thực hiện; điều này được sử dụng sau này khi tạo đầu ra 21. (Tác dụng phụ toàn cầu ngẫu nhiên khá thành ngữ trong INTERCAL.)

Ngoại lệ khác là với đầu vào ONE TWO NINE. Không có số dòng (129)trong chương trình, vì vậy chúng tôi gặp lỗi cho số dòng bị thiếu ICL129I. Vì vậy, tôi đã không phải viết bất kỳ mã nào để bao gồm cả trường hợp đó.

Dưới đây là các lỗi khác và nguyên nhân gây ra chúng:

  • 123 là một NEXTngăn xếp tràn ( DO (123) NEXT). Câu NEXTlệnh cần các bộ sửa đổi ( FORGEThoặc RESUME) khác để xác định hồi tố loại câu lệnh điều khiển đó là gì. Không có những nguyên nhân gây ra lỗi ICL123I khi có 80 câu lệnh `NEXT chưa được giải quyết.
  • 222 là một tràn stash ( DO STASH .2trong một COME FROMvòng lặp). Các bản lưu chỉ bị giới hạn bởi bộ nhớ khả dụng, nhưng cuối cùng sẽ hết, gây ra lỗi ICL222I.
  • 240 là kích thước một mảng để kích thước bằng không. Đó chính xác là những gì DO ,1 <- #0có nghĩa là, và nó gây ra lỗi ICL240I.
  • 241 được gây ra bởi việc gán bên ngoài giới hạn của một mảng. Trong trường hợp này, ,1chưa được phân bổ ( ,được sử dụng cho các biến kiểu mảng trong INTERCAL), do đó, việc lập chỉ mục nó gây ra lỗi ICL241I.
  • 19 gán 65536 ( #256 $ #0) cho biến 16 bit .2. Nó không phù hợp, gây ra lỗi ICL275I.
  • 21 giao #2cho .1. Điều đó có thể trông giống như một nhiệm vụ đủ đơn giản, nhưng chúng tôi đã quá tải .1có nghĩa là #1sớm hơn và cố gắng thay đổi giá trị 1 mà không có -vtùy chọn nào trên dòng lệnh gây ra lỗi ICL277I.
  • 148 cố gắng quay lại mục trên cùng của ngăn xếp điểm lựa chọn ( GO BACK), không tồn tại vào thời điểm này trong chương trình (chúng tôi không chạy bất kỳ lệnh nào để thao tác ngăn xếp điểm lựa chọn, vì vậy nó vẫn trống). Điều đó gây ra lỗi ICL404I.
  • 180 lần thử RETRIEVE .2từ một ngăn không tồn tại (vì chúng tôi đã không bỏ bất kỳ thứ gì có trong nhánh này của chương trình), gây ra lỗi ICL436I.
  • 50 yêu cầu đầu vào ( WRITE IN) mãi mãi trong một COME FROMvòng lặp. Cuối cùng, chúng tôi sẽ đọc hết EOF, gây ra lỗi ICL562I.
  • 109 chạy câu lệnh DO RESUME #0, điều này là vô nghĩa và được ghi lại cụ thể là gây ra lỗi (ICL621I).
  • 120 chạy các tuyên bố DO RESUME #9. Chúng tôi chưa chạy nhiều NEXTcâu lệnh đó và do đó chúng tôi gặp lỗi ICL120I. (Thật thú vị, lỗi cụ thể này được xác định trong tài liệu INTERCAL là thoát khỏi chương trình một cách bình thường và sau đó gây ra lỗi, thay vì thoát khỏi chương trình có lỗi. Tuy nhiên, tôi không tin hai trường hợp này khác nhau.
  • Về cơ bản, 223 là một mớ phức tạp của các nguyên thủy đa luồng mà tất cả đều quay về dòng 223, gây ra một vòng lặp vô hạn làm nổ tung bộ nhớ. Cuối cùng, có sự cạn kiệt bộ nhớ trong hệ thống con đa luồng, dẫn đến lỗi ICL991I.
  • 121 thực sự là một tuyên bố hợp lệ (đó là một nhận xét), nhưng nó xuất hiện ở cuối chương trình. Như vậy, việc thực thi rơi ra khỏi phần cuối của chương trình ngay sau khi nó thực thi, gây ra lỗi ICL633I.

xác minh

Một số lỗi liên quan đến việc cố tình chạy chương trình ra khỏi bộ nhớ, vì vậy tôi khuyên bạn nên đặt giới hạn bộ nhớ khá nhỏ. Đây là lệnh shell tôi đã sử dụng để kiểm tra chương trình (với các dòng mới được thêm vào để dễ đọc; xóa chúng nếu bạn tự chạy nó):

for x in "ZERO" "ONE NINE" "TWO ONE" "FIVE ZERO" "ONE ZERO NINE"
         "ONE TWO ZERO" "ONE TWO ONE" "ONE TWO THREE" "ONE TWO NINE"
         "ONE FOUR EIGHT" "ONE EIGHT ZERO" "TWO TWO TWO"
         "TWO TWO THREE" "TWO FOUR ZERO" "TWO FOUR ONE";
do  echo;
    echo $x;
    echo $x | (ulimit -Sd 40000; ulimit -Sv 40000; ulimit -Ss 40000;
               ./errors; echo $?);
done

Và đây là đầu ra (với số dòng và thông báo "XIN NGUỒN NGUỒN" đã bị xóa để tiết kiệm dung lượng), tôi đã thêm một phần để chứng minh chương trình hoạt động nhưng chủ yếu là để hiển thị các thông báo lỗi ngớ ngẩn của INTERCAL:

ZERO
ICL000I PLEASEWRITEIN.1(8)PLEASECREATE.1APLEASEAPLEASECOMEFROM#2$!1/#1'DOX(123)DO(123)NEXTDOCOMEFROM(222)(222)DOSTASH.2(240)DO,1<-#0(241)DO,1SUB#0<-#1(19)DO.2<-#256$#0(21)DO.1<-#2(148)DOGOBACK(180)DORETRIEVE.2DOCOMEFROM(50)(50)DOWRITEIN.2(109)DORESUME#0(120)DORESUME#9MAYBECOMEFROM(223)(223)DOCOMEFROM(223)(121)PLEASENOTX
0

ONE NINE
ICL275I DON'T BYTE OFF MORE THAN YOU CAN CHEW
19

TWO ONE
ICL277I YOU CAN ONLY DISTORT THE LAWS OF MATHEMATICS SO FAR
21

FIVE ZERO
ICL562I I DO NOT COMPUTE
50

ONE ZERO NINE
ICL621I ERROR TYPE 621 ENCOUNTERED
109

ONE TWO ZERO
ICL632I THE NEXT STACK RUPTURES.  ALL DIE.  OH, THE EMBARRASSMENT!
120

ONE TWO ONE
ICL633I PROGRAM FELL OFF THE EDGE
121

ONE TWO THREE
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
123

ONE TWO NINE
ICL129I PROGRAM HAS GOTTEN LOST
129

ONE FOUR EIGHT
ICL404I I'M ALL OUT OF CHOICES!
148

ONE EIGHT ZERO
ICL436I THROW STICK BEFORE RETRIEVING!
180

TWO TWO TWO
ICL222I BUMMER, DUDE!
222

TWO TWO THREE
ICL991I YOU HAVE TOO MUCH ROPE TO HANG YOURSELF
223

TWO FOUR ZERO
ICL240I ERROR HANDLER PRINTED SNIDE REMARK
240

TWO FOUR ONE
ICL241I VARIABLES MAY NOT BE STORED IN WEST HYPERSPACE
241

4
Đây có thể là chương trình INTERCAL lớn nhất tôi từng thấy.
Skyler

27

Perl, 108 byte, 256 mã thoát

Chương trình này (ab) sử dụng Test :: thêm mô-đun. Nó cố gắng mở tệp có tên "" n lần trong đó n được đưa ra làm đối số dòng lệnh. Nó thất bại mọi lúc, và mỗi lần gọi được coi là một bài kiểm tra. Kiểm tra :: Số lần trả về của các bài kiểm tra không thành công như mã thoát. plan tests => $ARGV[0]%255là cần thiết để có được mã thoát 255.

#!/usr/bin/perl
use Test::More;
plan tests => $ARGV[0]%255 if($ARGV[0]>0);
ok(open(F,"")) for (1..$ARGV[0])

Golfed : perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%', 51 byte (38 byte + 13 byte cho -MTest::More<space>). Đưa đầu vào vào stdin.
ThisSuitIsBlackNot

27

C90 (gcc), 256 mã thoát, 28 27 18 byte

main(){getchar();}

Tôi không chắc chắn nếu điều này là thông minh hay cheaty, nhưng tôi không nghĩ rằng nó vi phạm các quy tắc như được viết: nó về mặt kỹ thuật không sử dụng exit, returnhoặc bất kỳ lỗi ném cơ chế, mà chỉ đơn giản dựa vào hành vi undefined và thực tế là gcc làm một cái gì đó khá thuận tiện cho đến khi thử thách này đi.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Điều này chỉ đơn giản là sử dụng getcharđể đọc một byte từ STDIN. Chính nó, điều này không có gì.

Tuy nhiên, một chương trình C90 tuân thủ phải kết thúc bằng một returntuyên bố hoặc một cái gì đó tương đương; mọi thứ khác là hành vi không xác định. gcc kết thúc lắp ráp được tạo bằng một cách retnào đó, do đó, bất kỳ giá trị nào là ngẫu nhiên trong thanh ghi EAX sẽ được chương trình trả về. May mắn thay, glibc getcharlưu trữ byte mà nó đọc từ STDIN trong EAX, vì vậy giá trị của byte đó là mã thoát của chương trình của chúng tôi.


Sẽ rất thú vị để xem nếu điều này có thể được sửa đổi để vượt qua rào cản 8 bit, sử dụng shell như jsh , hỗ trợ set -o fullexitcode.
zeppelin

1
Thật khéo léo. Nhưng chương trình không thực sự sụp đổ, sau đó. Nó trở lại bình thường, cho dù thông số kỹ thuật là "gây ra ngoại lệ nghiêm trọng / thất bại / sự cố không thể đảo ngược"
mờ

Dù bằng cách nào, điều này là tuyệt vời.
Quentin

4
@dim Tôi đoán điều đó phụ thuộc vào định nghĩa của bạn về sự cố. Không kết thúc chính với returnhoặc exitlà một lỗi theo tiêu chuẩn C90, và nó dẫn đến một mã thoát cho thấy lỗi. Đó là tất cả một vụ tai nạn làm trái tim.
Dennis

Một sự cố là một chương trình dừng hoạt động đúng. Chương trình của bạn thực hiện tất cả những gì bạn bảo nó làm đúng, nó đọc một ký tự từ đầu vào và sau đó dừng lại. Vì vậy, mặc dù mã thoát chỉ ra lỗi nhưng nó không bị lỗi.
findusl

19

C (gcc) trong bash shell trên x86, 230 byte, 8 mã thoát

Dòng mới được thêm vào để dễ đọc. Bình luận bỏ qua trong điểm số.

main(int c, char **v){
int p[2];
switch(atoi(v[1])-128){
case 2:__asm("UD2");        /* SIGILL: x86 undefined instruction */
case 5:__asm("int $3");     /* SIGTRAP: x86 breakpoint instruction */
case 6:abort();             /* SIGABRT: raise() is called under the covers */
case 8:c/=c-2;              /* SIGFPE: divide by 0 (c-2) */
case 11:c=*(int *)c;        /* SIGSEGV: dereference of invalid pointer */
                            /* SIGPIPE: write() to a pipe closed at the other end */
case 13:socketpair(1,1,0,p);close(p[1]);write(p[0],v,1);
case 14:alarm(1);sleep(2);  /* SIGALRM: kernel will send alarm signal after 1 sec */
}
}

Một tính năng của bash shell:

Khi một lệnh kết thúc trên tín hiệu chết người N, bash sử dụng giá trị 128 + N làm trạng thái thoát.

Vì vậy, tất cả những gì chúng ta cần làm là kích hoạt các tín hiệu khác nhau từ trong chương trình ac. Tại thời điểm này, tôi cho rằng đơn giản là làm kill(n-128);bị cấm. Vì vậy, thay vào đó chúng tôi thực thi mã kích hoạt các tín hiệu khác nhau, điều này khiến các mã lỗi tương ứng được cung cấp tại vỏ cuộc gọi.

Mã thoát là 0, 130, 133, 134, 136, 139, 141, 142.

Hãy thử trực tuyến . Mở rộng phần "Gỡ lỗi" để xem mã trả về.

Điều này chắc chắn có thể được chơi golf sâu hơn. Nhưng tôi sẽ quan tâm hơn đến việc thêm nhiều tín hiệu.


Tôi có đúng không khi cho rằng các tín hiệu được gây ra bên ngoài mã của bạn bởi các chức năng hoặc hoạt động có sẵn?
Addison Crump

1
@VoteToC Đóng có, đúng vậy. Ví dụ, __asm("UD2")chạy "lệnh không xác định" x86 sẽ gây ra ngoại lệ CPU sẽ được nhân chuyển tiếp đến chương trình dưới dạng tín hiệu SIGILL. Ví socketpairdụ, SIGPIPE sẽ được gửi bởi kernel hoặc glibc khi chúng tôi đang cố gắng chuyển write()đến một đường ống close()d ở đầu kia.
Chấn thương kỹ thuật số

1
Sau đó, tôi không có vấn đề với nó. : P
Addison Crump

1
Bạn có thể chơi 1) hai ký tự nếu bạn sử dụng int3và không int $3và 2) một ký tự nếu bạn khai báo vint**, về cơ bản là bạn không dựa vào tính charchất của kiểu dữ liệu trong số học con trỏ của bạn, cộng với 3) hai ký tự nếu bạn sử dụng *pthay vì p[0], hoặc 4) sáu ký tự, nếu bạn sẵn sàng dựa vào các fdsố dự đoán được trả về bởi tất cả các tòa nhà tạo ra chúng, và thay thế p[0]p[1]bằng các giá trị gần nhất định của chúng. Cuối cùng, pipe(fd)ngắn hơn nhiều socketpair(...)và tạo ra cùng một lỗi khi đóng fd[0]và ghi vào. fd[1].
Idillotexist Idonotexist

2
Một vài gợi ý chơi gôn bổ sung: 1) Sử dụng &63thay vì -128. 2) Thay thế sleep(2)bằng for(;;). 3) Thay thế c=*(int*)cbằng atoi(0). 4) Thay thế c/=c-2bằng c/=0.
nwellnhof

10

Python 2, 13 byte, 2 mã thoát

1/(input()-1)

Nếu bạn nhập 0, nó sẽ cố in 1/-1số -1 hoàn toàn tốt, do đó thoát mã 0. Nếu bạn nhập 1, bạn sẽ nhận được 1/0một số ZeroDivisionErrortrong đó có mã thoát là 1. Với IDE của tôi, chỉ có 0 và 1 cho mã thoát ...

Đầu ra:


nhập mô tả hình ảnh ở đây


nhập mô tả hình ảnh ở đây


10

PHP, 15 byte, 2 mã thoát

Không có die/ exit, PHP không thể trả về bất cứ thứ gì ngoại trừ 0hoặc 255(afaik; có lẽ ~1), vì vậy ...

!$argv[1]?:p();

Nếu đối số dòng lệnh là sai, nó đánh giá 1và thoát với 0. Nếu không, nó cố gắng gọi một hàm và thoát với <b>Fatal error</b>: Uncaught Error: Call to undefined function p().

Chạy với -r.


5
Đo không phải sự thật. exit()đặt trạng thái thoát ... mà bạn không thể sử dụng cho thử thách này, được cấp. Nhưng mã của bạn cũng không hợp lệ. Nó đặt trạng thái thoát thành 255
vào

@aross: Hmm Tôi luôn cho rằng lỗi sẽ thoát với 1. Tôi đã tìm kiếm một danh sách các mã thoát, nhưng không thể tìm thấy một.
Tít

10

Excel VBA, 414 514 533 + 3 byte, 14 mã thoát

Đưa đầu vào như một Conditional Compilation Argument, n=[input value]và tạo ra mã lỗi liên quan của con số đó.

Sub e()
Dim a As Application, b As Byte, s As String, v(), x
Set a=Application
#If n=3 Then
Return
#ElseIf n=5 Then
b=a.CommandBars("")
#ElseIf n=6 Then
b=2^8
#ElseIf n=7 Then
ReDim v(9^9)
#ElseIf n=9 Then
v=Sheets("")
#ElseIf n=10 Then
v=Array(1)
For Each x In v
ReDim v(9)
Next
#ElseIf n=11 Then
b=1/0
#ElseIf n=13 Then
Debug.?Int("X")
#ElseIf n=14 Then
Debug.?String(9E8,1)
#ElseIf n=20 Then
Resume
#ElseIf n=28 Then
f 256
#ElseIf n=35 Then
Call c
#ElseIf n=92 Then
For Each x In v
ReDim v(9)
Next
#ElseIf n=94 Then
b=Null
#End If
End Sub

Sub f(n):DoEvents:f n-1:End Sub

+3 cho n=[Value]cuộc gọi biên dịch có điều kiện

Xử lý đầu vào trong đó n=

3
5
6
7
9
10
11
13
14
20
28
35
92
94    

Lưu ý: VBA không có mã thoát 0hoặc 1. Tôi đã bao gồm các giải pháp cho 35, đó là hai mã thoát được đánh số thấp nhất có sẵn cho VBA ở vị trí của chúng


1
Tôi sẽ không cho phép câu trả lời này, vì nó đồng nghĩa với tôi không cho phép do khả năng ngôn ngữ cho các loại đầu ra.
Addison Crump

1
Làm gì #ở đây?
BruceWayne

Các #if#ElseIflà báo cáo tổng hợp có điều kiện có nghĩa là những điều khoản mà theo nó chỉ được biên soạn nếu điều kiện là đúng
Taylor Scott

1
Vì vậy, nếu chúng không đúng, các câu lệnh không được biên dịch ... khác với việc không sử dụng #, chúng sẽ được biên dịch ở đâu cho dù các câu đó có đúng hay không? Tôi biết cách các Ifcâu lệnh hoạt động, nhưng tôi mới tiếp cận với những gì thực sự biên dịch , rất xin lỗi vì một câu hỏi đơn giản như vậy.
BruceWayne

1
@BruceWayne, vâng, đó chính xác là trường hợp. Bởi vì những dòng này được thiết kế để ném cụ thể lỗi, nó là cần thiết để có chỉ các dòng sản xuất mã lỗi mong muốn được biên dịch tại một thời điểm đưa ra. Để làm điều này #ifđược sử dụng thay cho Ifhoặc Select Casechỉ các truthycâu điều kiện thực sự được biên dịch. Trong trường hợp này cụ thể, điều này giữ cho chương trình không thoát với mã lỗi 3, Return without GoSubtrên mỗi lần thực thi, nhưng chỉ thoát khỏi mã này khin=3
Taylor Scott

7

Turtlèd, 4 byte, 2 mã thoát

Tôi không biết có cách nào để lấy thêm mã thoát không ... thậm chí còn có nhiều cách khác trong ngôn ngữ thông dịch viên không

Tôi tìm thấy một vài bốn câu trả lời dài

' ?;

Hãy thử trực tuyến!

!.(0

Hãy thử trực tuyến!

?;(*

Hãy thử trực tuyến!

Làm thế nào những công việc này:

' ?;

trong trình thông dịch của tôi, có một tính năng lỗi gây ra lỗi khi lưới trong bộ nhớ có nhiều hơn một dòng và không có ký tự không phải khoảng trắng trên đó. chương trình này xóa * trên ô gốc '[space], lấy đầu vào số nguyên không âm ?(thực sự là 0 hoặc 1) và di chuyển xuống đó ;, nếu nó bằng 0, lưới sẽ chỉ có một dòng và không có lỗi, nếu không nó sẽ di chuyển xuống và lỗi sẽ xảy ra

!.(0

dấu ngoặc đơn và nội dung không được phân tích cú pháp, chúng chỉ được thực thi trong thời gian chạy có nghĩa là: "bỏ qua paren phù hợp, nếu biểu tượng ô không đúng". trong chương trình này, việc nhập ( !) một khiến chương trình ghi nó vào ô ( .), thực thi paren, kiểm tra xem ký hiệu ô có bằng 0 hay không, cố gắng bỏ qua paren phù hợp, nhưng thay vào đó lại đưa ra lỗi vì không có lỗi nào . nếu nó bằng 0, nó viết nó xuống, kiểm tra các dấu ngoặc đơn, tự tìm đến 0 và sau đó bỏ qua nó, và chương trình kết thúc

?;(*

có các yếu tố của câu trả lời trước, và đầu tiên. nó nhận đầu vào số nguyên không âm, di chuyển xuống nhiều số đó và kiểm tra xem ô có phải là '*' hay không, tìm kiếm một paren bổ sung không tồn tại nếu không. nếu đầu vào là 1, nó sẽ di chuyển khỏi không gian bắt đầu và tìm ô là một khoảng trắng và lỗi, nếu bằng 0, nó sẽ ở trên không gian bắt đầu và bỏ qua paren.


7

Javascript (nút), 19 byte, 2 mã thoát

Chương trình đầy đủ:

+process.argv[2]&&a

Chức năng:

f=i=>i&&f(i)

process.argvlà một mảng chứa đường dẫn đến nút thực thi, đường dẫn đến tệp javascript được thực thi và các đối số dòng lệnh. Trong trường hợp này, đây sẽ là một trong hai "1"hoặc "0". Chuỗi được chuyển đổi thành một số với toán tử đơn nguyên +. Nếu số bằng 0, &&toán tử lười sẽ không đánh giá phía bên tay phải, nếu số đó là trung thực (không phải bằng 0), thì bên phải của &&được đánh giá và một lỗi được đưa ra vì nó tham chiếu một biến không xác định và chương trình tồn tại với mã thoát 1.

Hàm dự kiến ​​đầu vào là một số. Nếu đầu vào là trung thực, hàm sẽ tự gọi và làm hỏng thời gian chạy nút với lỗi tràn ngăn xếp. Nếu đầu vào là 0, &&toán tử lười trả về 0 mà không đánh giá phía bên tay phải.


@VoteToC Đóng đã thay đổi nó thành một biến không xác định
corvus_192

Điều đó làm việc. : P
Addison Crump

Chương trình đầy đủ có thể được rút ngắn +process.argv[2]&&a.
dùng2428118

@ user2428118 Bạn đúng
corvus_192

Chỉ cần tò mò, sẽ ReferenceError.prototype.name=process.argv[2]?a:0có giá trị?
Patrick Roberts

6

Perl 6 , 57 byte, 256 mã thoát

use Test;plan $_=@*ARGS[0];ok try {open ""} for ^($_%255)

Dùng thử
Đây là bản dịch của ví dụ Perl 5.

Mở rộng

use Test;  # bring in 「plan」 and 「ok」

plan $_ = @*ARGS[0]; # plan on having the input number of tests
                     # only actually needed for the 255 case
                     # if the plan is greater than the number of tests
                     # it fails with exitcode 255


  ok                 # increment the failure counter if the following is False
    try {            # don't let this kill the whole program
      open ""        # fails to open a file
    }

for                  # repeatedly do that

  ^(                 # upto Range
    $_ % 255         # either the input number of times, or 0 times for 255
  )

5

Scala, 19 byte, 2 mã thoát

if(args(0)=="1")1/0

1/(args(0).toInt-1)

JVM chỉ hỗ trợ 1 và 0 làm mã thoát nếu bạn không gọi System.exit.

Chương trình đầu tiên cố gắng tính toán 1/0nếu đối số đầu tiên là 1, sẽ làm sập JVM với mã thoát là 1. Nếu đối số là 0, nó sẽ thoát thành công.

Chương trình thứ hai để chuyển đổi đối số thành số nguyên, trừ đi một và cố gắng chia 1 cho số đó. Nếu đối số nếu 1, nó sẽ tính toán 1/0, do đó JVM sẽ sụp đổ; nếu đối số bằng 0, nó sẽ tính toán 1/-1và thoát.


5

Python 3 , 15 byte, 2 mã thoát

Rõ ràng, điều này dài hơn giải pháp Python 2 , bởi vì trong Python 3, chúng ta không thể nhận một đầu vào bằng chữ mà không gọi eval. Tuy nhiên, chúng ta có thể sử dụng các kỹ thuật so sánh chuỗi thú vị ...

1/(input()<'1')

Đầu vào sẽ là chuỗi 0hoặc 1- nếu là 1, điều kiện ước tính thành 0 (sai), dẫn đến nỗ lực tính toán 1 / 0rõ ràng là sự cố (mã thoát 1). Mặt khác, không có gì xảy ra và Python thoát với mã thoát thông thường 0.

Theo như tôi biết, Python không có khả năng bị sập với các mã thoát khác.


5

Java, 71 66 byte, 2 mã thoát

4 byte được lưu nhờ Holger

Chương trình đầy đủ:

interface I{static void main(String[]a){a[a[0].charAt(0)-48]="";}}

Hàm lấy một int làm đối số:

i->1/(i-1)

Chương trình lấy char đầu tiên của đối số đầu tiên (hoặc '0'hoặc '1'trừ 48 (giá trị ascii của '0') để lấy số nguyên (0 hoặc 1). Sau đó, nó cố gắng đặt đối số ở vị trí của số nguyên đó thành chuỗi trống. Nếu đầu vào là 1, chương trình gặp sự cố với ArrayIndexOutOfBoundsException, vô hiệu hóa mảng đối số chỉ có một phần tử ở vị trí 0 (không có chỉ mục).


Bạn có thể gán giá trị hoặc sử dụng nó theo bất kỳ cách nào khác, ví dụ như chỉ mục mảng a[a[0].equals("1")?1/0:1]="";, ngang bằng int x=a[0].equals("1")?1/0:1;. Nhưng thay đổi chương trình hơn nữa để kích động ArrayIndexOutOfBoundsExceptionthay vì ArithmeticExceptiontiết kiệm một vài byte:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Holger

4

Python 2, 11 byte, 2 mã thoát

1>>-input()
1/~-input()
0<input()<x

Ba giải pháp 11 byte khác nhau cho ba lỗi khác nhau! (Chỉ để giải trí, điều này không cho điểm.) Theo mặc định, Python chỉ có mã thoát 0 để thoát thành công và 1 lỗi. Việc chạy thành công không tạo ra bất cứ điều gì.

 1>>-input()

Trên đầu vào 1, đưa ra "ValueError: số lượng ca âm". Trên đầu vào 0, số lượng thay đổi bằng 0 thành công và cho 1.

1/~-input()

Trên đầu vào 1, đưa ra "ZeroDivisionError: phép chia số nguyên hoặc modulo bằng 0" do ~-input(), còn gọi input()-1là 0. Trong đầu vào 1, 1/-1cho -1. 0**-input()cũng sẽ làm việc

0<input()<x

Ở đầu vào 1, đưa ra "NameError: name 'x' không được xác định". Ở đầu vào 0, các bất đẳng thức đầu tiên 0<0này được ước tính là Sai, do đó phần còn lại không được đánh giá và kết quả chỉ là Sai.


2

Node.js (ES6), 77 byte, 2 mã thoát

require('readline').createInterface({input:process.stdin}).prompt("",i=>i&&x)

2

Jelly , 4 mã thoát, 18 byte

߀
2*
Ṁ¹Ŀ
RÇĿỌḊ?R

Hỗ trợ mã thoát 0 , 1 , 137 (bị giết) và 139 (lỗi phân đoạn).

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

RÇĿỌḊ?R  Main link. Argument: n (integer)

R        Range; yield [1, ..., n] if n > 1 or [] if n = 0.
    Ḋ?   If the dequeued range, i.e., [2, ..., n] is non-empty:
 Ç         Call the third helper link.
  Ŀ        Execute the k-th helper link, where k is the the integer returned by Ç.
         Else, i.e., if n is 0 or 1:
   Ọ       Unordinal; yield [] for n = 0 and "\x01" for n = 1.
      R  Range. This maps [] to [] and causes and error (exit code 1) for "\x01".


Ṁ¹Ŀ      Third helper link. Argument: r (range)

Ṁ        Maximum; retrieve n from r = [1, ..., n].
 ¹Ŀ      Call the n-th helper link (modular).
         When n = 139, since 139 % 3 = 1, this calls the first helper link.
         When n = 137, since 137 % 3 = 2, this calls the second helper link.


2*       Second helper link. Argument: k

2*       Return 2**k.
         Since 2**137 % 3 = 174224571863520493293247799005065324265472 % 3 = 2,
         ÇĿ in the main link will once again call the second helper link.
         Trying to compute 2**2**137, a 174224571863520493293247799005065324265472-
         bit number, will get the program killed for excessive memory usage.


߀       First helper link. Argument: k

߀       Recursively map the first helper link over [1, ..., k].
         This creates infinite recursion. Due to Jelly's high recursion limit,
         a segmentation fault will be triggered.

2

SmileBASIC, 640 byte, 39 mã thoát (trong số 52)

SPSET.,0INPUT C$GOTO"@"+C$@0
STOP@3
A
@4
CLS.@5@A
GOSUB@A@7?1/A@8
X$=3@9
A%=POW(2,31)@10
BEEP-1@11
DIM B[#ZL*#R]@13
READ A
@15
V"OPTION STRICT?X
@16
CALL@D@17
V@A*2
@18
V"VAR A,A
@19
V"DEF A:END:DEF A
@20
V"FOR I=0TO
@21
V"NEXT
@22
V"REPEAT
@23
V"UNTIL
@24
V"WHILE.
@25
V"WEND
@26
V"IF.THEN
@27
V"IF.THEN"+CHR$(10)+"ELSE
@28
V"ENDIF
@29
V"DEF X
@30
RETURN@31
DIM E[-1]@32
V"DEF A:DEF
@34
GOTO"|
@36
XOFF MIC
MICSTOP
@37
XOFF MOTION
GYROSYNC
@38
PRGDEL
@39
DIM F[66]SPANIM.,1,F
@40
DIM G[2]SPANIM.,1,G
@42
MPSTART 2,@A@L
MPSEND"A"GOTO@L@44
PROJECT
@46
USE"PRG1:A
@47
BGMPLAY"`
@48
X=
@51
DLCOPEN"
DEF V C
PRGEDIT 1PRGDEL-1PRGSET C
EXEC 1
END

Điều này chắc chắn có thể được thực hiện ngắn hơn. SB chỉ có mã lỗi từ 0 đến 51 và một số không thể kích hoạt.


0

ZX81 BASIC> 255 mã thoát - 52 byte (liệt kê)

1 INPUT N
2 GOTO 1+(2*(N>0 AND N <=255))
3 PRINT "EXIT CODE ";N
4 RAND USR N

Về mặt kỹ thuật, Ncó thể là bất kỳ số dấu phẩy động 24 bit nào trong phạm vi, nhưng chúng tôi sẽ giả sử các số nguyên ở đây. Dòng 2 tương đương với IF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1nếu ZX81 BASIC có IF/ELSEtrong các hướng dẫn tượng trưng của nó.


3
Làm thế nào để điều này thỏa mãn the program caused some fatal unintended exception? Điều này chỉ in ra một số văn bản và hoàn thành thực hiện.
admBorkBork

Bạn nói đúng - tôi cần tỉnh táo hơn vào buổi sáng.
Shaun Bebbers

RAND USR Nsẽ gây ra các hiệu ứng ngoài ý muốn vì việc gọi một phần của ROM từ một nơi không mong muốn không phải là một ý tưởng hay, do đó RAND USR 0đã bị loại trừ vì điều đó quá duyên dáng.
Shaun Bebbers

Bạn có thể giải thích thêm một chút về việc điều đó thực sự khiến chương trình bị sập không? Tôi không quen thuộc lắm với ZX81 BASIC.
admBorkBork

ROM nằm trong khoảng từ 0x0000 - 0x1fff; các thói quen gọi ROM sẽ hoạt động nếu bạn bắt đầu ở đúng nơi. Bắt đầu một hoặc nhiều byte vào bất kỳ thói quen mã máy nào trong Z80 sẽ gây ra hiệu ứng không mong muốn. Nếu bạn có đơn giản LD BC, 0000 RST 10 RETở 0x1000 nhưng được gọi RAND USR 4097thì bạn sẽ bỏ lỡ toán hạng LD và do đó mã máy sẽ bị sai lệch. Tôi không nhớ tất cả các cuộc gọi ROM nhưng tôi sẽ xử lý tất cả các kết thúc hợp pháp / duyên dáng và loại trừ chúng sau này.
Shaun Bebbers
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.